Repository navigation
Inbox unread on the nav row, under a narrow dead-man exception - #281
Merged
pixexid merged 4 commits intoAug 19, 2026
Merged
Conversation
GH-258 item 5 wants unread state visible before the Inbox panel is opened. PluginNavPanelRegistration still has no badge, count, or attention field (get-bb/bb#1852), so the operator granted a narrow exception to the standing refusal of host data-testid plus visible-text row matching. The exception is conditional on the coupling being observable when it dies. paintInboxNavUnread returns a reason on zero-match; the sidebar poll turns that into a visible "Inbox unread indicator broken" alert in the replacement thread list plus a recorded console.error. Never silently nothing. Scope and retirement are recorded beside the refusals they except, in docs/sidebar-plugin-nav-collapse.md.
A manifest branding.icon overrides every contribution icon of that plugin, whatever form it takes, so declaring "GitBranch" collapsed Lanes and Inbox onto one glyph. Measured on a throwaway plugin: with branding.icon absent the two rows render Mail and GitBranch distinctly; with it set they collapse. pluginBrandingSchema requires at least one of branding.icon and branding.logo.light, so removing the icon ships a real logo asset in the same change. scripts/build.mjs stages assets/ or the manifest would point at a file the packaged plugin does not carry.
A missing row is one way the indicator dies. The other is the one the icon probe hit: something plausible is still drawn and signals nothing. Two shapes of that are detectable and now report broken — a second row also titled Inbox, where the dot lands on a row that is not ours, and this plugin's two rows drawing the same glyph though they declare different icons. inspectInboxNavGlyph compares drawn geometry, not class names, and reads Lanes as the control, because only a control row tells a precedence collapse apart from an unknown name falling back to the host default. What it cannot do is stated in the exception text rather than faked: the host exposes no reading of which glyph it drew, so a single row drawing a wrong-but-unique glyph is undetectable from inside the plugin, and the check returns no verdict rather than a false one when the control is unreadable.
Four graded findings from the tier A review at f628a2b. The switch fingerprinted `d` alone, so identical path data under a 90-degree transform read as a collapse. A false alarm is the one failure this switch cannot have: it is the retirement signal for get-bb/bb#1852, and a signal that fires on a legitimate re-theme gets muted. The fingerprint now covers what actually moves pixels — transform, transform-origin, style, the root viewBox and preserveAspectRatio, href — and the root svg element is read alongside its children. Both directions are tested: same-d-plus-transform must be healthy, the collapse must still be broken. A rejected project read was reduced to zero unread, so one transient failure erased a count already proven. Each project's last proven count is retained across a failed read instead; a project with no inbox registered is a proven zero, not a failure, and #278's exact-message check is what tells them apart. A continuous break logged an identical line every 30 seconds. The transition is recorded now; the visible alert was already the standing report. Rebased onto 5e16dc7. The app.tsx conflict was mechanical — #278's unregistered-project helper and this branch's poll constant landed adjacent — and dist was regenerated by the builder rather than reconciled by hand.
pixexid
force-pushed
the
bb/gh-258-item-5-inbox-unread-nav-indicator-thr_2rbixgj33q
branch
from
August 19, 2026 02:13
f628a2b to
a0b0451
Compare
pixexid
marked this pull request as ready for review
August 19, 2026 02:16
pixexid
deleted the
bb/gh-258-item-5-inbox-unread-nav-indicator-thr_2rbixgj33q
branch
August 19, 2026 02:16
This was referenced Aug 19, 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.
Two changes, both GH-258 item 5.
1. The inbox unread indicator.
PluginNavPanelRegistrationhas no badge,count, or attention field (get-bb/bb#1852), so the Inbox row is painted directly
under the narrow exception the operator granted to the standing refusal of host
data-testidplus visible-text row matching. The exception's mandatorycondition is that the coupling announces its own death, and it has two deaths,
not one.
Zero-match — the selector or the text coupling finds no row:
Valid but wrong — something plausible is drawn and signals nothing:
inspectInboxNavGlyphcompares drawn geometry rather than class names, andreads the
Lanesrow as the control — only a control row tells a precedencecollapse apart from an unknown name falling back to the host default.
Undetectable from inside the plugin, stated rather than faked: whether the
glyph beside
Inboxis the oneInboxdeclared. The host owns the iconregistry, exposes no reading of which glyph it drew, and renders an unknown name
as a default with no error; hardcoding an expected path would only trade the
blind spot for a coupling that breaks falsely on the next host icon-set change.
So a single row drawing a wrong-but-unique glyph is not caught, and the check
returns no verdict rather than a false one when the control is unreadable.
Every reported break surfaces as a visible
Inbox unread indicator brokenalertin the replacement thread list plus a recorded
console.error. Scope (thisindicator only) and retirement (get-bb/bb#1852) are in
docs/sidebar-plugin-nav-collapse.md.2.
branding.icondropped. A manifest icon overrides every contributionicon of that plugin, form-independently, which is why Lanes and Inbox render the
same glyph today. Measured on a throwaway plugin: absent icon renders
MailandGitBranchdistinctly,"Toolbox"collapses both.pluginBrandingSchemarequires at least one of
iconandlogo.light, so a realassets/logo.svgships in the same change and
scripts/build.mjsnow stagesassets/. Thefinding itself is recorded in #277.
Observed vs derived: the collapse and its absence were observed on a probe
plugin whose manifest shape and icon names match this one; that bb-collab's own
two rows follow is derived, since the only differing input is the plugin id.
The collapsed-glyph switch above is what would catch it if that derivation is
wrong.
npm run verifyexit 0 — 359 passed, 2 skipped, 22 files passed, 2 skipped.Related GH-258
Review tier: A