You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Follow-up to the #7213 epic (closed 2026-08-10, five sub-issues merged: #7231#7232#7233#7234#7268). Everything there was verified by unit tests, gates and CI. Nothing in it was ever driven in a browser, and parts of it are structurally invisible to the tests that shipped. This card closes that gap.
The blocker is gone: main now pins the console at 8aad9fd50b16 (#7308), which carries the approvals:inbox registration (objectui#4071), the bell-badge breakdown (objectui#4073), and the retirement of the record page's hard-coded approve/reject path (objectui#3055).
Why a browser, specifically
Three things the shipped tests deliberately do not cover:
Can a non-admin actually reach it? That is the premise of the whole epic — business roles have no setup access. No test ran a real session through filterAppForUser's nav gating; they asserted metadata shape and URL strings.
Do the decision actions render under the component mount? The component-route case used a stub page echoing two router inputs. The real page's data fetching, DeclaredActionsBar driven by server-computed viewer.can_act, the drawer, node progress — none of that has been exercised on that path.
Scope
Boot a real example app (examples/app-showcase or app-crm) against a real backend with seeded approval requests, and drive it. packages/console/dist is not built in a fresh checkout — build it first (pnpm objectui:build, which clones objectui at the pin).
Verify, as a non-admin business user unless noted:
The account app's Approvals entry appears and opens the full inbox (tabs, list, drawer) — not a component-not-found empty state.
Decision actions (approve / reject / reassign / …) render in the drawer for a request where the user is a pending approver, and at least one decision actually executes and moves the request.
?request=<id> deep-links straight into that request's drawer, on both the component route and /system/approvals (notification and email links carry the latter — it must still work).
Record deep links from the inbox land on the right business record under the current app.
Home's "pending approvals" card navigates within an app the user can open (no /apps/setup/...).
The bell popover shows total · N notifications + M pending approvals, unclamped, with M matching Home's card. Seed enough to exceed 9 so the clamp case is the one exercised.
zh-CN wording reads 待审批 / 待我审批 consistently across the inbox, the nav entry and any Setup-side view.
As an admin: Setup → Approvals lists Approvals Inbox above Requests / Action History / Delegations, and it opens the same inbox.
Record page (entry B): the approve/reject buttons come from the server-declared actions (objectui#3055), not the retired hard-coded pair.
docs/qa/platform-checklist/areas/approvals.json drives every case through /system/approvals (lines 29, 182, 257 among others). That route deliberately still works, so nothing goes red — but the checklist now exercises the deep-link route rather than the path a real user takes, and the two new nav entries have no coverage at all. Refresh the entry paths and add cases for the account-app and Setup entries. Follow RUNNER.md and the checklist's own authoring conventions.
Reporting
Findings get filed per the standing discipline (search first, finding label, unassigned). Fix in place only what is small and unambiguously in scope; anything architectural or cross-repo gets an issue, not a patch. A run that finds nothing is a valid outcome — record the run.
Follow-up to the #7213 epic (closed 2026-08-10, five sub-issues merged: #7231 #7232 #7233 #7234 #7268). Everything there was verified by unit tests, gates and CI. Nothing in it was ever driven in a browser, and parts of it are structurally invisible to the tests that shipped. This card closes that gap.
The blocker is gone:
mainnow pins the console at8aad9fd50b16(#7308), which carries theapprovals:inboxregistration (objectui#4071), the bell-badge breakdown (objectui#4073), and the retirement of the record page's hard-coded approve/reject path (objectui#3055).Why a browser, specifically
Three things the shipped tests deliberately do not cover:
approvals:inboxcomponent-registry key and de-hardcode the Approvals Inbox entry links #7231's test imports the registration module directly and stubs the page at its module boundary. Its own docblock states it does not assert thatmain.tsxperforms the side-effect import — "the one remaining way the key could be missing at runtime". Unit tests run source; users runpackages/console/dist. Only a real load closes this.setupaccess. No test ran a real session throughfilterAppForUser's nav gating; they asserted metadata shape and URL strings.DeclaredActionsBardriven by server-computedviewer.can_act, the drawer, node progress — none of that has been exercised on that path.Scope
Boot a real example app (
examples/app-showcaseorapp-crm) against a real backend with seeded approval requests, and drive it.packages/console/distis not built in a fresh checkout — build it first (pnpm objectui:build, which clones objectui at the pin).Verify, as a non-admin business user unless noted:
?request=<id>deep-links straight into that request's drawer, on both the component route and/system/approvals(notification and email links carry the latter — it must still work)./apps/setup/...).total · N notifications + M pending approvals, unclamped, with M matching Home's card. Seed enough to exceed 9 so the clamp case is the one exercised./apps/setup/..., so a business user without setup access has no working "all notifications" or "all activity" link #7266 — it was filed as routing-level inference and explicitly not browser-verified. The bell's and Home's "see all notifications / activity" links are the subject; a non-admin session answers it for free while you are here.Also in scope: the checklist has drifted
docs/qa/platform-checklist/areas/approvals.jsondrives every case through/system/approvals(lines 29, 182, 257 among others). That route deliberately still works, so nothing goes red — but the checklist now exercises the deep-link route rather than the path a real user takes, and the two new nav entries have no coverage at all. Refresh the entry paths and add cases for the account-app and Setup entries. FollowRUNNER.mdand the checklist's own authoring conventions.Reporting
Findings get filed per the standing discipline (search first,
findinglabel, unassigned). Fix in place only what is small and unambiguously in scope; anything architectural or cross-repo gets an issue, not a patch. A run that finds nothing is a valid outcome — record the run.