Repository navigation
fix(app-shell): Home's activity card shows the record panel's permission copy when sys_activity refuses the read (objectui#12843) - #12858
Merged
objectstack-fleet[bot] merged 2 commits intoOct 17, 2026
Conversation
…ion copy when sys_activity refuses the read (objectui#12843) The shared activity feed swallowed every non-404 rejection into a bare `error` status, so a 403 on `sys_activity` reached Home's card as "An unexpected error occurred.". The feed now classifies the rejection with plugin-detail's `isRefusedFeedRead` (the record activity panel's verdict, objectui#11195) and marks a refused `error` snapshot; the card renders the same `detail.activityAccessDenied` key with the panel's lock. Every other failure keeps the generic copy. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
…y reading extends it (objectui#12843) Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
This was referenced Oct 17, 2026
objectstack-fleet
Bot
deleted the
claude/issue-12843-home-activity-403
branch
October 17, 2026 05:03
This was referenced Oct 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #12843
Clause-②: no
What was wrong
Home's "Activity feed" card reads the shared activity feed (
useHumanActivityFeed, Home's cut ofuseSharedActivityFeedinsharedUserFeeds.ts). That feed's catch turned every rejection that was not a missing object into a baremarkFailed(). The store kept only the worderrorand dropped the rejection itself. So a 403 onsys_activityreached the card as "An unexpected error occurred.". The record activity panel shows a permission sentence for the same refusal (objectui#11195).What changed
isRefusedFeedRead(@object-ui/plugin-detail's root export, the function the record panel andRecordDetailViewalready read) after the missing-object check. A refusal calls a new runner callback,markRefused(). No status or code is read here. The verdict was already a published root export, so nothing was extracted. App-shell already imports@object-ui/plugin-detailfrom its entry (RecordDetailView), so this adds no new package edge.markRefused()ismarkFailed()plus a flag. It gives the sameerrorstatus and the same backoff, and the snapshot getsrefused: true. The key is written only on a refusederrorsnapshot, so every other feed (approvals, inbox) publishes the same two-key shape as before.ActivityFeedReadinggains an optionalrefused.useSharedActivityFeedanduseHumanActivityFeedset it only whenstatusiserrorand the snapshot was refused. It is optional, so a reading built by hand (tests, other callers) still type-checks unchanged.HomeActivityshows the record panel's lock and its key,detail.activityAccessDenied, for a refusederror. Every othererrorkeepserrors.unknown. The card is still shown (seat ruling): no permission probe was added before the read, and the existingreadable: falsepath (objectui#12081) is unchanged.@object-ui/app-shell: patch.Verification (head
1fc81dacd0)HomeActivity.refusedRead-12843.test.tsx, 5 tests. They run the real hook into the real card under the real en catalogue, with a fake adapter:PERMISSION_DENIEDenvelope: the card's notice equals the sentence read fromRecordActivityTimelinerendered beside it withactivityDenied. The generic copy and the empty claim are absent.detail.activityAccessDenied, and an unrefusederrorrenderserrors.unknown.HomeActivity.readingStates-12081andsharedUserFeeds.activityGrant-12081suites: 3 files, 17 tests passed.else if (isRefusedFeedRead(err)) markRefused();was replaced with an always-false guard throughablation-replace.mjs. The anchor went 1 to 0 and the marker 0 to 1. The blob wentd0a92d737161to2bd7c51d7854. The subject is app-shell's own source, imported relatively, so no build sat between them.home-activity-access-deniedwas absent. The controls and the key-echo pins stayed green, which is the expected direction.d0a92d737161, andgit diff HEADis empty.pnpm --filter @object-ui/app-shell run type-checkexit 0. This runstsc --noEmitandtsc -p tsconfig.test.json, after the closure buildturbo run build --filter='@object-ui/app-shell^...', which exited 0 with 28 tasks.eslint --no-inline-configon the 3 changed ts/tsx files: 0 errors. The 1 warning is the existingTFnanyinHomeRail.tsx, a line this PR does not touch.check:phantom-deps,check:self-import,check:unreferenced-sources,check:doc-example-readers,check:handler-key-reads,check:side-effects-array,check:element-data-source-declaration,check:spec-symbols,check:action-forward-parity,check:designer-field-key-parity,check:icon-record-names,check:i18n-keys,check:i18n-drift,check:i18n-designer-parity,check:control-bytes,check-hand-rolled-comment-mask,check-changeset-fixed,check-changeset-presence, andcheck:new-line-citations(0 new).packages/app-shell/directory was run under the lock with--maxWorkers=1and stopped unfinished at about 78 minutes (1529 test files), so it is NOT MEASURED here; CI runs it. Run instead, at this head: every test file that namessharedUserFeeds,HomeRail,useHomeInbox,InboxPopoverorglobal-notifications-renderer(git grep -lover*.test.ts(x), across the repo), plus all ofconsole/home/__tests__/: 78 files, 921 tests passed. Blind spot: a test that reaches these modules only through another import path is outside that set.Acceptance notes (observations, not filed)
InboxPopover) draws "An unexpected error occurred." for the same 403. It has its ownactivity.status === 'error'branch, notHomeActivity's, so per the dispatch ruling it is unchanged here. It now receivesrefusedand ignores it, so a follow-up could switch it with a one-branch edit. Carrier: none named.detail.activityAccessDeniedreads "You don't have permission to view activity on this record." On Home there is no record. The ruling asked for the same key. A neutral sentence would need a new key in all ten packs, and the packs are outside this card's file surface. This is raised as an open question in the report.sys_activitylist page. That page draws its own no-access state.Session:
https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gBGenerated by Claude Code