Repository navigation
fix(app-shell): one neutral sentence for a refused activity read on Home and the bell - #12875
Merged
objectstack-fleet[bot] merged 1 commit intoOct 17, 2026
Merged
Conversation
…ome and the bell (objectui#12859)
Home's activity card read the record panel's "…activity on this record"
for a refused sys_activity read, where there is no record, and the header
bell's Activity tab drew "An unexpected error occurred." for the same 403.
Both now read the new layout.activityFeed.accessDenied ("You don't have
permission to view activity.") with Home's lock, for refused === true only;
every other failure keeps errors.unknown. The key is in all ten packs.
detail.activityAccessDenied is unchanged and stays the record panel's.
isRefusedFeedRead stays the one classifier; the feed hook is untouched.
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-12859-activity-refused-copy
branch
October 17, 2026 10:03
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 #12859
Clause-②: no.
What changed
A refused
sys_activityread (the shared feed'srefused: true, set byisRefusedFeedReadsince objectui#12843) now shows one neutral sentence on both surfaces that have no record:HomeActivityinconsole/home/HomeRail.tsx) read the record panel'sdetail.activityAccessDenied("You don't have permission to view activity on this record."). It now reads the newlayout.activityFeed.accessDenied("You don't have permission to view activity.").InboxPopover) drewerrors.unknown("An unexpected error occurred.") for every error, the 403 included. Forrefused === trueit now draws the same new key with Home's lock icon (data-testid="inbox-activity-access-denied"). Every other failure keepserrors.unknownon both surfaces.packages/i18npacks, right afterlayout.activityFeed.empty, away from theworkspace.*/organizations.*/cloudOnboarding.*regions.detail.activityAccessDeniedis unchanged and stays the record panel's.isRefusedFeedReadstays the one classifier. The feed hook (sharedUserFeeds.ts) is not touched.Mechanism check (A1, measured): the bell reads the same shared reading.
AppHeaderpassesuseSharedActivityFeed()asactivity, and so doesglobal:notifications(global-notifications-renderer.tsx).ActivityFeedReading.refusedwas already on the prop, so the bell only had to read it.Pins
layout/__tests__/InboxPopover.refusedActivity-12859.test.tsx(new): realInboxPopover, realHomeActivityand the real record panel, under the real catalogue inenandzh-CN. Refused: the bell shows the neutral sentence with a lock; Home shows the same text; the record panel beside them shows a different sentence. CONTROL: an error that is not a refusal shows the generic copy on both.layout/__tests__/AppHeader.inboxVariant.test.tsx: the real path through the hook. A 403PERMISSION_DENIEDfrom the adapter used to be pinned as "An unexpected error occurred." on the bell. It now reads the neutral sentence. A new CONTROL: a 500 keeps the generic copy and no access-denied node.console/home/__tests__/HomeActivity.refusedRead-12843.test.tsx: a 403 on Home now reads the neutral sentence, not "this record". CONTROL: the record panel rendered beside it still reads "You don't have permission to view activity on this record.". The key-echo cell now expectslayout.activityFeed.accessDenied.Ablation (one run, committed fix at
17388be9be):scripts/ablation-replace.mjsreplaced the bell'sactivity.status === 'error' && activity.refused ? (with... && false ? (. Anchor count went 1 to 0, bloba14325a16be7tocd3ff0cb99f0. Result: 5 cells failed, 39 passed. The failures were the AppHeader 403 cell and the two refused cells in each language. All CONTROL cells stayed green. Restore: blob after restorea14325a16be7equals the HEAD blob, andgit diff HEADis empty. A trap was armed on EXIT INT TERM.Gates (all on
17388be9be)pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build, thenpnpm --filter @object-ui/i18n type-checkandpnpm --filter @object-ui/app-shell type-check(bothtsc --noEmitandtsc -p tsconfig.test.json;--listFilesOnlylists the new test). Lock verdict: command-exit 0.packages/i18n/in full, 83 files: 1325 passed, 13 skipped.packages/app-shell/in full: NOT MEASURED. The tree has 1540 test files. At--maxWorkers=1the run produced no verdict in about 70 minutes, so I stopped it. Declared narrowing (lock verdict command-exit 0), 217 files and 1887 tests passed:packages/app-shell/src/layout/,src/console/home/,src/hooks/__tests__/,src/__tests__/(it holds the i18n and product-neutral ratchets),RecordDetailView.feedRefusal-11195,AppContent.pseudoRouteSegments,global-page-blocks.render, andapps/consoleapprovalsInboxComponentRef. These are every test outside the first two directories that namesInboxPopover,HomeRailorHomeActivityin agit grep. The rest of the package is left to CI.eslint --no-inline-config --format jsonon the 15 changed.ts/.tsxfiles gave 15 files, 0 errors and 15 warnings. Every warning is on a line this diff did not touch (no-explicit-anyandno-unused-varsin the AppHeader test stubs, plus one in HomeRail). The config sets noparserOptions.projectorprojectService, so linting is not type-aware and this diff cannot change the verdict on any file it did not touch.check:phantom-deps,self-import,unreferenced-sources,doc-example-readers,handler-key-reads,side-effects-array,element-data-source-declaration,spec-symbols,action-forward-parity,designer-field-key-parity,icon-record-names,i18n-keys,i18n-drift,i18n-designer-parity,i18n-dead-keys,control-bytes, plusnode scripts/check-hand-rolled-comment-mask.mjs,node scripts/check-changeset-fixed.mjsandnode scripts/check-changeset-presence.mjs.Changeset:
.changeset/12859-activity-refused-copy.md(@object-ui/app-shelland@object-ui/i18n, patch).Acceptance notes
HomeRail.tsx,InboxPopover.tsx, the packs and "tests beside". Two existing test files changed with it:AppHeader.inboxVariant.test.tsx, because it pinned the old generic copy for the bell's 403 and that pin had to flip, andHomeActivity.refusedRead-12843.test.tsx, because it pinned Home equal to the record sentence.Implemented by the os-dev run in session
https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB.Generated by Claude Code