Repository navigation
docs(qa): shell-nav-personalization judges the Pinned section's order; the authored menu is not user-reorderable (objectui 8a55f0ccda) - #22522
Merged
objectstack-fleet[bot] merged 1 commit intoOct 9, 2026
Conversation
…authored menu as not reorderable The runtime sidebar's menu is no longer user-reorderable; personal ordering lives only in the Pinned section (objectui 8a55f0ccda). The item's drag-reorder step and clause, which judged the retired useNavOrder localStorage order, are replaced by a desktop-only pinned-order clause (drag the row or Space/arrows/Space; persists with the nav favorites) and a negative clause on the authored menu (no grip, no sortable role, no grab cursor; authored order whatever objectui-nav-order key is stored). Revision 2, with its history entry. Claude-Session: https://claude.ai/code/session_01LYXc6ckoWuZyVZpWYizdMh Co-authored-by: Claude <noreply@anthropic.com>
objectstack-fleet
Bot
deleted the
claude/issue-22487-nav-personalization-pinned-order
branch
October 9, 2026 18:10
This was referenced Oct 9, 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 #22487
Clause-②: no
Rewrites one checklist item,
platform-core.shell-nav-personalizationindocs/qa/platform-checklist/areas/platform-core.json, to the sidebar behaviour that landed in objectui8a55f0ccda(8a55f0ccdafa0b58e09f5d188641834f7da31521, objectstack-ai/objectui#12066, objectstack-ai/objectui#12059). It moves torevision: 2and gains ahistoryentry. No other item or file changes. The console pin bump that carries that commit (#22476) can cite this PR.Authority
What the code at
8a55f0ccdadoes (read from source, not from the PR summary)objectui
mainis8a55f0ccdaitself at this writing, so there is no drift between the landing and the tip. All links below are pinned to that sha.UnifiedSidebarno longer hasuseNavOrder: it existed at the parentc7b30bd6and is gone at8a55f0ccda. The comment at UnifiedSidebar.tsx L169-L173 states the stored key is not read.enableReorder/onReorderare retired at NavigationRenderer.tsx L229-L233. Menu levels are only sorted bybyNavOrder(L1732; navOrder.ts L39:orderascending, with ties in array order).enablePinning={!isMobile},pinnedOrder={pinnedIds},onPinnedReorder={reorderPins}.PinnedNavigationList(L1192):DndContext id="nav-pinned"(L1223).Space, cancelEscape, endSpace, and not Enter (L1145-L1148).dragActivatorPropsapplies onlyaria-describedby, never dnd-kit'srole,tabIndexoraria-roledescription(L1258-L1267). The link also getscursor-grab(L1605).data-drop-indicator(L1325), and the section is ordered byorderPinnedItems(L1859).console.nav.favorites(L1758). That reads 'Favorites' in en and 「收藏」 in zh, not "Pinned".aria-describedbyisnav-pinned. In@dnd-kit/core6.3.1 (the version objectui's lockfile resolves),useUniqueId("DndDescribedBy", id)returns the givenidunchanged, so a pinned link'saria-describedbyis theDndContextid.useNavPins.reorderPins→FavoritesProvider.reorderNavPins(useNavPins.ts L145-L156; FavoritesProvider.tsx L496).withNavPinOrder(L182) reorders thetype: 'nav'favorites in place.withAddedFavorite(L167) appends a new nav pin.commit(L407) writes localStorage plus the adapter. In the console, that adapter is thesys_user_preferencerow keyedui.favorites(ConsoleShell.tsx L329).isMobilemeans a viewport under 768px (use-mobile.tsx L11-L22), and thereenablePinningis false, so no Pinned section is drawn.Each changed text (before → after)
Placeholders that the file spells in angle brackets appear here as
NAVID/APP/APP_NAME, because GitHub's body sanitizer eats angle-bracket fragments. The file's own spelling is unchanged.titlerevisionhistoryentry is appended (item 13), per the README's "Change" rule and the validator's revision = last-history check.fixtures.requires[0]fixtures.requires[1](new)steps[2]console.nav.favorites, not the content-favorites group below Recent;cursor-grab, 5px activation,data-drop-indicator;onPinnedReorder → useNavPins.reorderPins → FavoritesProvider reorderNavPins, the order of thetype 'nav'favorites;steps[6](new; "authored menu (any viewport)")aria-roledescription="sortable", noaria-describedby="nav-pinned"and nocursor-grab, and dragging a menu row moves nothing. Its order is the authored order (byNavOrder).objectui-nav-order-APP_NAME(a JSON map of__root__and each group id to reversed id lists, the shape the retireduseNavOrderread) and reloads: the order is unchanged.useNavOrderatc7b30bd6UnifiedSidebar.tsx L143-L212.steps[7](the persistence step)acceptance[2]verifydrives:aria-describedby="nav-pinned"andcursor-grab.dom.acceptance[6](new, appended so favorites, recents and breadcrumbs keep indexes 3-5)verify:[aria-roledescription="sortable"];dom.NavigationRenderer.pinnedOrder-12059.test.tsxasserts the same discriminators (zero sortable role, noaria-describedby/cursor-grabon menu links).negativetrapshydration-race,shared-browser-tab.stale-console-bundleandautomation-input, both already in RUNNER.md's trap table.stale-console-bundle: this repo's.objectui-shais stillf0268ad784, which predates8a55f0ccda. A console built at that pin still draws the menu grip, and a run against it must recognise that rather than file a regression.automation-input: a one-jump synthetic pointer move never crosses the 5px activation distance, and reads as a dead drag.sourceenablePinning={!isMobile}/pinnedOrder/onPinnedReorder; Recent section; applyPins.pinnedIdsorder /reorderPinsandreorderNavPins/withNavPinOrder/withAddedFavorite.NavigationRenderer.tsx,navOrder.ts,use-mobile.tsxandConsoleShell.tsx(bare: sibling-repo citations stay bare per the README).packages/platform-objects/src/identity/sys-user-preference.object.ts#sys_user_preference, which resolves (anchors 719/729 → 720/730).history: an entry is appended,{ revision: 2, date: 2026-10-09, ref: #22487 }. It quotes the ruling verbatim and names8a55f0ccda.Unchanged: the collapse, pin/unpin, favorites, recents and breadcrumbs steps and clauses, and the screenshot-first negative.
Gates (head
b2a4ab115)The list was derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, with no paths, from merge base4e9fe9ff6. It has 13 commands, identical to the dispatch's path-derived lead. Each was run, and each exit code was captured before any pipe:node scripts/check-ci-filter-parity.mjsexit 0node scripts/check-closing-keyword-parity.mjsexit 0node scripts/check-closing-keyword-parity.mjs --self-testexit 0node scripts/check-comment-mask-corpus.mjsexit 0pnpm --filter @objectstack/lint run check:doc-formula-expressions: first exit 3. It printed PREREQUISITE NOT MET (@objectstack/formula/@objectstack/lintunbuilt), so that run measured nothing. Afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the verify lock, the rerun was exit 0.pnpm check:cross-package-test-inputsexit 0pnpm check:doc-authoringexit 0pnpm check:driver-memory-censusexit 0pnpm check:gitlink-declaredexit 0pnpm check:nul-bytesexit 0pnpm check:platform-checklistexit 0. Verdict line: "check-platform-checklist: OK — 16 areas, 279 items (275 active, 2 planned) … traps: 19 documented, 19 in use … symbol anchors: 720/730 resolved". On the untouched base it was green too, at 719/729.pnpm check:refd-timer-probeexit 0pnpm check:watch-hint-literalexit 0dispatch-gates --ranwith exit codes recorded: "13 derived famil(ies) accounted for — 13 run, 0 NOT-MEASURED (a DERIVED zero …)".checklist-select platform-core.shell-nav-personalizationresolves 1 runnable item. Changed lines: 44 (+30 / -14).Changeset: none (
skip-changeset). The one changed path is underdocs/qa/. Zero of the 81 workspace packages' directories contain it, while the controlpackages/spec/src/index.tshits@objectstack/spec. The repo root package isprivate: true. Nothing publishes.Acceptance notes
8a55f0ccda. The clauses are written from the code above. feat(layout,app-shell,i18n): the runtime sidebar menu is not user-reorderable; the Pinned section keeps the user's order (objectui#12059) objectui#12066 records its own Chromium readings (0 grips, 0aria-roledescriptionat rest, a pinned link withcursor: grab, the keyboard path, a pointer reorder without navigation). The nextchecklist-testrun of this item is the measurement.console.nav.favorites; the content group issidebar.favorites. Both are 'Favorites' in en and 「收藏」 in zh. The item said "the Pinned section" for a heading no user sees by that name. The new step names the heading, and the pin/unpin step's wording is left as it was (out of scope). Whether two same-named groups confuse users is a static reading only, not reproduced in a running console, so it is not filed. Carrier: none.enablePinning={!isMobile}also hides the pin buttons. Its text is unchanged by the dispatch scope. The new fixture line (a desktop viewport) covers it in practice. Carrier: none.8a55f0ccda(chore(objectui): bump the console pin past the fix for objectstack-ai/objectui#12056 (the designer's repeater row writesdataSource). #11509's v18 retirement must ship with it #22476). Until that bump, a console built atf0268ad784fails acceptance[6], which is what the addedstale-console-bundletrap tells a runner.Generated by Claude Code