The account hub says everything twice

This is the screen you sent, read against AccountHubScreen at screen_account.jsx:459–559 and the persistent top bar at app.jsx:424–446. It is a good screen — the grouping is right, the rows are the right rows, the meta text is doing real work. The problem is that six things on it are stated twice, and three of those pairs link to the byte-identical route.

None of it is sloppy in isolation. The identity row wants to be a profile, the strip wants to be an inbox, and the groups want to be a directory — and each of the three independently decided that Following, Orders and verification were important enough to carry. Put them on one screen and you get the same number twice, 300px apart, with the same chevron next to it. Fourteen rows and a three-up strip become twelve rows and a two-up strip, and nothing is lost, because nothing that gets deleted was the only route to anything.

Stated twice on one screen

WhatStated atStated again atWhy it reads as a bugRoute
Your avatarapp.jsx:432 — 28px, ringed:488 — 46pxThe ring at :433 already says “you are in Account”.
Unread countapp.jsx:436 — red dot:467 → strip badge 6Same variable, once as a dot and once as a number.
11 following:492 — identity row:525 — Following · 11 sellersSame integer, same word, 300px apart.Identical
Orders:475 — strip column:536 — Selling rowBoth push('selling',{tab:'sold'}) with the same badge.Identical
ID check in review:497 — identity chip:539 — Verification rowSame string from c.verify.label, twice.Identical
The word Account:482 — 22px title:545 — 11px group labelA group inside Account cannot also be Account.
1 — The hub todayExactly what you sent, rebuilt from :459–559. Fourteen rows, a three-up strip, an identity row and the persistent top bar above it. Seven marks; five of them are one thing said in two places.
9:41●●●●
2 — Seller, deduplicatedTwo rows deleted, one strip column dropped, every count turned into a phrase that says what it counts. The title now starts in the body at 21px and the bar picks it up on scroll — scroll this one.
9:41●●●●
3 — Buyer, same rulesThe Selling group is gated by isSeller at :529, so a buyer’s hub is seven rows and the pitch card. Dropping Orders from the strip costs a buyer nothing — Purchases is the second row down.
9:41●●●●

Row by row — what changes and why

ElementTodayAfter
HeaderAccount at 22px, fixed, gear in a 1px border21px in the body, sticky bar picks it up past 40px; gear ringed with var(--shadow-1) like every other round control
Top-bar unread dotRed dot on the avatar from notifUnreadSuppressed while isAccountScreen — the exact number is 60px below
Identity rowAvatar, name, following/followers, verify chipUnchanged. It is the only place followers is stated and the only place verification is actionable
Quick stripNotifications · Messages · OrdersNotifications · Messages. These two are the only things here with no row of their own
Buying › Following11 sellers, pushes followingDeleted — the identity row already links there, in both directions
Selling › Active listings5Listings · 5 active — matches the tab it opens
Selling › OrdersRed pill 1, or All shipped when zero1 to dispatch / All shipped — a phrase either way
Selling › Offers receivedRed pill 2, or None pending2 pending / None pending
Selling › VerificationID check in review, pushes verifyDeleted — the chip in the identity row is the same string and the same route
Third group labelACCOUNTPROFILE — Personal details, Shipping addresses, Security & login
HubRowcount or meta, never both (:448)meta only. The count prop and the red pill leave the list entirely

What is wrong

1
Two of you, 60px apartThe top bar at app.jsx:432 draws a 28px avatar and rings it in ink because isAccountScreen (:433). Sixty pixels below, :488 draws the same person at 46px. The ring has already said which tab you are on.
2
The same unread count as a dot and as a numberapp.jsx:436 puts a red dot on that avatar when notifUnread > 0. screen_account.jsx:467 reads the same variable and prints 6 on the strip below. On this screen the dot adds nothing the badge does not already say more precisely.
3
“11 following” and “Following · 11 sellers”Identity row :492 and hub row :525. Same integer, same noun, and both call push('following', {tab:'following'}) — the identical route with the identical tab.
4
The strip’s third column is always a duplicateFor a seller, :475 pushes selling {tab:'sold'} — byte for byte what the Orders row at :536 does, with the same c.awaiting badge. For a buyer it pushes purchases, which is the Purchases row at :521, with the same c.purchasesInTransit. Every persona, a duplicate.
5
“ID check in review” twiceThe chip at :497 and the Verification row at :539 both render c.verify.label and both push verify. One is an alert, one is a directory entry, and they are the same sentence.
6
Two ways to draw a number in one groupHubRow:448 renders a red pill or the meta text, never both. So Active listings shows 5 as grey text while Orders shows 1 as a red pill four rows apart — and Orders loses its words the moment there is work to do. var(--down) is the destructive colour in this system. An order waiting to be posted is work, not a fault.
7
Account inside Account:482 at 22px and :545 at 11px, four hundred pixels apart. The rows under it are Personal details, Shipping addresses and Security & login.

What changes

8
The title behaves like the browse pages21px in the body, empty sticky bar above it that fades a 14.5px Account in past 40px of scroll. The gear drops to 34px on var(--shadow-1), matching the back button in AccHeader — one round-control treatment in the account area instead of two.
9
The strip becomes two inboxesNotifications and Messages are the only two things on this screen you cannot reach any other way, and they are the only two that change while you are not looking. That is what a badge strip is for. Orders is a list you own; it belongs in the list of things you own.
10
Numbers become phrasesHubRow keeps meta and loses count. 5 active, 1 to dispatch, 2 pending — each says what it counts, so the right-hand column reads as one kind of thing all the way down. Red badges survive only in the strip, where an unread count genuinely is an inbox badge.
11
Two rows deleted, no route lostFollowing goes because the identity row links to both tabs of the same screen. Verification goes because the chip above it is the same string, the same route, and the place a seller will actually look when something needs doing. Fourteen rows to twelve.
12
ACCOUNT → PROFILESame three rows, a name that is not the name of the screen. This is Step 10 of prompt-account-bars.md and it is unchanged.
13
The buyer hub gets shorter for freeNo Selling group (:529), no Verification row, no Following row: seven rows, a two-up strip and the pitch card at :553. Every rule above is persona-independent, so nothing needs a second code path.