feat(desktop-messages): show compact Buzz link metadata - #6252
Conversation
aff62ed to
38f3c22
Compare
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
jedwards27
left a comment
There was a problem hiding this comment.
Verdict: REQUEST CHANGES
Reviewed: 2e7583bf5ad5926ca32367af9954bc79d108e42d..48ea55f643946198c192bcb002d42fd9932d4d0b (exact live head 48ea55f643946198c192bcb002d42fd9932d4d0b)
Risk: high — this changes message-link truthfulness/navigation and shared tooltip behavior across Desktop.
The accessibility follow-up fixes bounded chip names, long-tooltip pointer access, and pathological wrapping, but both original product blockers remain:
-
Issue/PR tooltips still discard fetched status metadata.
desktop/src/shared/ui/markdown/entityLinks.tsx:83-94selects onlyresolvedTitlefor resolved issues and PRs. The status payload remains inmetadata.description: issue status/labels atdesktop/src/shared/lib/useResolvedLinkPreviews.ts:357-363, and PR status/branch/commit at:366-376. The resulting tooltip shows the subject but hides the status-aware context this feature fetches. The new assertions atdesktop/tests/e2e/entity-link-recipient-cards.spec.ts:135-146,181-199pin only the subject and static footer, so they pass while status is dropped. Please compose title plus description for both tooltip types and add assertions that fail when status/labels or status/branch/commit disappear. -
Definitive deletion is still presented as transient unavailability.
desktop/src/shared/ui/markdown/useMessageLinkMetadata.ts:18-24,32-40,54-79catches everygetEventByIdrejection, retries, and reduces it tounavailable; nodeletedstate exists.desktop/src/shared/ui/markdown/MessageLinkPill.tsx:74-86,160-184consequently renders “Message unavailable,” unavailable styling, and exact-message navigation forevent not found. Elsewhere,desktop/src/features/messages/lib/useDraftRootStatus.ts:10-17,21-32documents that exact signal as definitive deletion after a successful zero-row query. The E2E atdesktop/tests/e2e/entity-link-recipient-cards.spec.ts:544-590currently seedsdeletedEventIdsand asserts the incorrect unavailable/navigation contract. Please distinguish definitive deletion from transient failure, give it truthful accessible text/style and deletion-appropriate navigation, and regression-test both paths.
Validation at the pinned clean head:
pnpm --dir desktop check— passed (existing non-failing diagnostics only).pnpm --dir desktop typecheck— passed.pnpm --dir desktop test— 5,137/5,137 passed (independently reproduced).- Focused entity-link built smoke — 7/7 passed.
- Combined affected built smoke (
navigation,entity-link-recipient-cards,tooltip-semantics) — 28 passed, 1 skipped, 1 failed; the changed channel tooltip now wraps whilenavigation.spec.ts:576-578still requires single-line ellipsis. A focused rerun also observed composer-label expectation drift atnavigation.spec.ts:449(generalvsgeneral · mock-gen). The built affected journey is not green at this head. - CI at verdict time: macOS build, relay E2E, and both integration shards passed; Desktop Core and all four smoke shards remained pending.
- Local HEAD and live PR head were rechecked equal to
48ea55f643946198c192bcb002d42fd9932d4d0b; worktree clean.
What held up: entity metadata cache deduplication/expiry, community reset, href-bound late-completion fencing, exact entity navigation, bounded accessible names, tooltip theme semantics, and exercised light/dark layouts. Built screenshots for entity cards and both tooltip themes were inspected and readable.
Residual risk: no native Tauri exact-head run was supplied or performed; built Playwright evidence does not prove the native artifact. Resolve the two semantic blockers and the red affected smoke path, then rerun exact-head validation. Any new head requires review again.
— :bot: Jude’s code review agent
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
jedwards27
left a comment
There was a problem hiding this comment.
Verdict: APPROVE
Reviewed: 84c095f8bea14b55373e2d867100abe37aa6061e..e658101a50ef1ceda890cc7310efd59712dd02bc (exact head e658101a50ef1ceda890cc7310efd59712dd02bc)
Risk: high — this changes message-link truthfulness/navigation, metadata lifecycle, and a shared tooltip primitive across Desktop.
Both prior blockers are resolved:
- Definitive
event not foundnow maps to a distinct deleted state, while transient failures remain unavailable and retryable (desktop/src/shared/ui/markdown/useMessageLinkMetadata.ts:19-26,34-44,78-87). Deleted links expose truthful tooltip/accessibility semantics and route to the surviving thread root or containing channel; ordinary/unavailable links preserve exact-message navigation (desktop/src/shared/ui/markdown/MessageLinkPill.tsx:74-93,173-206). Built coverage separately exercises deleted reply, deleted top-level, and transient-unavailable behavior. - Issue/PR enrichment now intentionally fetches only the root subject and no longer performs the unused status query or constructs status metadata that the tooltip discards (
desktop/src/shared/lib/useResolvedLinkPreviews.ts:336-347). Stable repository-only inline labels remain unchanged through metadata resolution, and tooltip tests pin the title-only contract.
Behavior/contracts traced: metadata cache keys/deduplication/eviction, stale async completion and community reset, fetched event channel/kind validation, composer-to-sent label stability, deleted/unavailable navigation, entity tooltip/card data flow, shared tooltip dismissal/color semantics, accessible names, and theme/layout behavior. No material unresolved source or product finding remains.
Exact-head validation on a clean worktree:
pnpm check— passed; four unrelated existing diagnostics only.pnpm typecheck— passed.pnpm test— 5,192/5,192 passed.- Fresh
pnpm build:e2e, followed byCI=1 pnpm exec playwright test --project=smoke tests/e2e/entity-link-recipient-cards.spec.ts tests/e2e/navigation.spec.ts tests/e2e/tooltip-semantics.spec.ts— 30 passed, 1 intentional skip, 0 failed. - Five generated screenshots were inspected: stable entity chips and rich tooltip surfaces were coherent in Buzz light and Catppuccin Mocha dark. The deletion state was assertion-tested but not captured visually.
CI: macOS build, integration shards, relay E2E, release candidate, and smoke shards 1/2/4 passed at this exact head. Smoke shard 3 failed in unrelated existing journeys (project-issue-comments, message-feedback-snapshots, and overscroll-boundary), none in this PR's changed files; the first failed all retries while the other two passed on retry. Desktop Core was still running at verdict time. Required CI should still be rerun/completed green before merge; this approval is source-review clearance, not a waiver of branch protection.
Residual risk: no native Tauri exact-head MP4/AX run and no mutation proof for the deletion journeys. Built-browser interaction coverage is strong, but it does not prove native rendering.
— :bot: Jude’s code review agent
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
jedwards27
left a comment
There was a problem hiding this comment.
Verdict: APPROVE
Reviewed: 3ee465e12b815a191d902856440e2f3348bda506..0d21bda0649fe3e2d1aaddc4ac914e88dd601ac9 (exact head 0d21bda0649fe3e2d1aaddc4ac914e88dd601ac9)
Risk: high — this changes message-link truthfulness/navigation, metadata/cache lifecycle, and a shared tooltip primitive across Desktop.
The post-clearance follow-up is sound: desktop/tests/e2e/project-issue-comments.spec.ts:111-114 now proves the canonical forged issue identity through the composer chip's data-href rather than expecting the intentionally hidden event hash as visible text, and proves the chip clears on channel change. It does not reopen the prior defects.
Behavior/contracts traced: stable metadata-independent message/issue labels; definitive event not found deletion versus retryable transient unavailability; deleted reply/top-level fallback navigation; exact-message navigation for ordinary/unavailable links; canonical composer/entity identity; per-ID channel lookups and miss/error caching; community/identity cache isolation; private non-member channel handling; shared tooltip dismissal/color semantics; accessible names; bounded layout; and downstream tooltip consumers. No material unresolved finding remains.
Exact-head validation on clean worktrees:
- Desktop lint/check and typecheck passed (pre-existing non-failing diagnostics only).
- Full Desktop unit suite: 5,203/5,203 passed.
- Fresh E2E production build (
tsc && vite build --mode e2e) passed. - Built Playwright coverage passed in two complementary runs: 34 passed, 1 intentional skip, 0 failed across
entity-link-recipient-cards,navigation,tooltip-semantics, andproject-issue-comments; an independent runtime-focused run covering the first, second, and fourth specs passed 30 with 1 intentional skip. - Generated recipient-card, composer/sent-transition, Buzz-light tooltip, and Catppuccin-Mocha tooltip screenshots were inspected; exercised contrast, wrapping, clipping, spacing, and compact-label behavior were coherent.
- Exact-head CI is green: Desktop Core, all four smoke shards, both integration shards and aggregate, relay E2E, macOS Tauri build, Desktop aggregate, and release candidate all succeeded.
Manual/native evidence: GitHub's macOS job built the Tauri app successfully at this exact head. No interactive native Tauri MP4/AX journey was run.
Residual risk: built-browser journeys and the macOS artifact build provide strong coverage, but they do not prove an interactive native rendering session; no mutation proof was run for the deletion journeys. Any new head invalidates this approval.
— :bot: Jude’s code review agent
`js/incomplete-multi-character-sanitization` ×6 in desktop/src/shared/ui/markdown.test.mjs turned CodeQL red on this sync PR. Every hit is `html.replace(/<[^>]+>/g, "")` stripping tags off renderToStaticMarkup output so the test can assert on visible text. The rule is correct that a single pass over that pattern is defeatable by nested or malformed markup, and it does not matter: the input is the test's own fixture and the result is never rendered, stored or trusted. The file is byte-identical to upstream/main. This is the same shape as the useComposerLinkPreviews.test.mjs row one sync earlier, so the section now leads with the cheap discriminator — is the file identical to upstream, and is the sink inside a test block — rather than leaving the next reader to re-derive it from the query semantics. Signed-off-by: adrienlacombe <6303520+adrienlacombe@users.noreply.github.com>
Co-authored-by: Wren <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@buzz.block.builderlab.xyz> Signed-off-by: Wren <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@buzz.block.builderlab.xyz> * origin/main: chore(deps): pin earshot below 1.2.0 pending a VAD threshold re-pick (#6392) polish(desktop): finish Projects navigation and context chrome (#6429) fix(desktop): clarify add agents channel action (#6374) Repair stale large channel roster snapshots (#6251) feat(desktop-messages): show compact Buzz link metadata (#6252) feat(workflows): reply in-thread from send_message action (#6178) perf(desktop): split discover_acp_providers into cheap and forced paths (#6330) fix(desktop): restore recent channel sorting (#6402) fix(desktop): isolate main timeline stacking context from focus drawer (#6398) fix(desktop): make reconnect repair lossless (#6415) fix(hooks): scope pre-push lanes to branch merge-base diff (#6423) Signed-off-by: Wren <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@buzz.block.builderlab.xyz>
* origin/main: (64 commits) chore(deps): pin earshot below 1.2.0 pending a VAD threshold re-pick (#6392) polish(desktop): finish Projects navigation and context chrome (#6429) fix(desktop): clarify add agents channel action (#6374) Repair stale large channel roster snapshots (#6251) feat(desktop-messages): show compact Buzz link metadata (#6252) feat(workflows): reply in-thread from send_message action (#6178) perf(desktop): split discover_acp_providers into cheap and forced paths (#6330) fix(desktop): restore recent channel sorting (#6402) fix(desktop): isolate main timeline stacking context from focus drawer (#6398) fix(desktop): make reconnect repair lossless (#6415) fix(hooks): scope pre-push lanes to branch merge-base diff (#6423) Enforce a three-day dependency cooldown (#6426) perf(desktop): resolve references without directory scans (#6328) feat(llm): stamp thinking effort on call-completed log line (#6424) Fix cross-owner relay agent mentions in owner-only builds (#6338) feat(cli): accept Buzz message links for thread reads (#6359) feat(workflows): add workflow editor (#6248) fix(desktop): preserve huddle speech boundaries (#6397) test(desktop): use a wordlist-safe separator in passphrase word-count test (#6356) fix(models): curate Databricks alias-aware labels for 5 missing endpoints (#6360) ... Signed-off-by: Luke Tornquist <tornquist@squareup.com>
…kflow-management * origin/main: (27 commits) chore(deps): pin earshot below 1.2.0 pending a VAD threshold re-pick (#6392) polish(desktop): finish Projects navigation and context chrome (#6429) fix(desktop): clarify add agents channel action (#6374) Repair stale large channel roster snapshots (#6251) feat(desktop-messages): show compact Buzz link metadata (#6252) feat(workflows): reply in-thread from send_message action (#6178) perf(desktop): split discover_acp_providers into cheap and forced paths (#6330) fix(desktop): restore recent channel sorting (#6402) fix(desktop): isolate main timeline stacking context from focus drawer (#6398) fix(desktop): make reconnect repair lossless (#6415) fix(hooks): scope pre-push lanes to branch merge-base diff (#6423) Enforce a three-day dependency cooldown (#6426) perf(desktop): resolve references without directory scans (#6328) feat(llm): stamp thinking effort on call-completed log line (#6424) Fix cross-owner relay agent mentions in owner-only builds (#6338) feat(cli): accept Buzz message links for thread reads (#6359) feat(workflows): add workflow editor (#6248) fix(desktop): preserve huddle speech boundaries (#6397) test(desktop): use a wordlist-safe separator in passphrase word-count test (#6356) fix(models): curate Databricks alias-aware labels for 5 missing endpoints (#6360) ... Signed-off-by: Luke Tornquist <tornquist@squareup.com> # Conflicts: # desktop/src/features/workflows/ui/WorkflowDeleteDialog.tsx # desktop/src/features/workflows/ui/WorkflowsView.tsx
…ntion-phase1 * origin/main: (37 commits) fix(desktop): sender names in notifications + macOS click-through routing (#6427) docs: clarify two-layer moderation ownership (#6481) Fix mobile thread tail and iOS channel header (#6399) chore(deps): pin earshot below 1.2.0 pending a VAD threshold re-pick (#6392) polish(desktop): finish Projects navigation and context chrome (#6429) fix(desktop): clarify add agents channel action (#6374) Repair stale large channel roster snapshots (#6251) feat(desktop-messages): show compact Buzz link metadata (#6252) feat(workflows): reply in-thread from send_message action (#6178) perf(desktop): split discover_acp_providers into cheap and forced paths (#6330) fix(desktop): restore recent channel sorting (#6402) fix(desktop): isolate main timeline stacking context from focus drawer (#6398) fix(desktop): make reconnect repair lossless (#6415) fix(hooks): scope pre-push lanes to branch merge-base diff (#6423) Enforce a three-day dependency cooldown (#6426) perf(desktop): resolve references without directory scans (#6328) feat(llm): stamp thinking effort on call-completed log line (#6424) Fix cross-owner relay agent mentions in owner-only builds (#6338) feat(cli): accept Buzz message links for thread reads (#6359) feat(workflows): add workflow editor (#6248) ... Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
…c-agent-commit-identity * origin/main: (40 commits) chore(release): release Buzz Desktop version 0.5.18 (#6489) fix(desktop): simplify duplicate agent provenance (#6401) test(benchmarks): expand Buzz-native dataset (#6448) fix(desktop): sender names in notifications + macOS click-through routing (#6427) docs: clarify two-layer moderation ownership (#6481) Fix mobile thread tail and iOS channel header (#6399) chore(deps): pin earshot below 1.2.0 pending a VAD threshold re-pick (#6392) polish(desktop): finish Projects navigation and context chrome (#6429) fix(desktop): clarify add agents channel action (#6374) Repair stale large channel roster snapshots (#6251) feat(desktop-messages): show compact Buzz link metadata (#6252) feat(workflows): reply in-thread from send_message action (#6178) perf(desktop): split discover_acp_providers into cheap and forced paths (#6330) fix(desktop): restore recent channel sorting (#6402) fix(desktop): isolate main timeline stacking context from focus drawer (#6398) fix(desktop): make reconnect repair lossless (#6415) fix(hooks): scope pre-push lanes to branch merge-base diff (#6423) Enforce a three-day dependency cooldown (#6426) perf(desktop): resolve references without directory scans (#6328) feat(llm): stamp thinking effort on call-completed log line (#6424) ... Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
* origin/main: (28 commits) chore(release): release Buzz Desktop version 0.5.18 (#6489) fix(desktop): simplify duplicate agent provenance (#6401) test(benchmarks): expand Buzz-native dataset (#6448) fix(desktop): sender names in notifications + macOS click-through routing (#6427) docs: clarify two-layer moderation ownership (#6481) Fix mobile thread tail and iOS channel header (#6399) chore(deps): pin earshot below 1.2.0 pending a VAD threshold re-pick (#6392) polish(desktop): finish Projects navigation and context chrome (#6429) fix(desktop): clarify add agents channel action (#6374) Repair stale large channel roster snapshots (#6251) feat(desktop-messages): show compact Buzz link metadata (#6252) feat(workflows): reply in-thread from send_message action (#6178) perf(desktop): split discover_acp_providers into cheap and forced paths (#6330) fix(desktop): restore recent channel sorting (#6402) fix(desktop): isolate main timeline stacking context from focus drawer (#6398) fix(desktop): make reconnect repair lossless (#6415) fix(hooks): scope pre-push lanes to branch merge-base diff (#6423) Enforce a three-day dependency cooldown (#6426) perf(desktop): resolve references without directory scans (#6328) feat(llm): stamp thinking effort on call-completed log line (#6424) ... # Conflicts: # desktop/src/features/channels/ui/ChannelPane.tsx # desktop/src/features/messages/ui/MentionAutocomplete.test.mjs # desktop/src/features/messages/ui/MentionAutocomplete.tsx Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
* origin/main: (88 commits) docs(nips): comprehensive NIP-FI — core + claimable profiles (EDGE/LIFECYCLE/DELEG/CONF) (#5946) fix(benchmarks): wait for scripted event delivery (#6487) Polish mobile channel navigation and message sends (#6488) Clarify huddle message destination (#6496) feat(archive): add observer-frame retention schema and gated DB adapter (#5719) fix(desktop): restore human barge-in over agent TTS in huddles (#6431) chore(release): release Buzz Desktop version 0.5.18 (#6489) fix(desktop): simplify duplicate agent provenance (#6401) test(benchmarks): expand Buzz-native dataset (#6448) fix(desktop): sender names in notifications + macOS click-through routing (#6427) docs: clarify two-layer moderation ownership (#6481) Fix mobile thread tail and iOS channel header (#6399) chore(deps): pin earshot below 1.2.0 pending a VAD threshold re-pick (#6392) polish(desktop): finish Projects navigation and context chrome (#6429) fix(desktop): clarify add agents channel action (#6374) Repair stale large channel roster snapshots (#6251) feat(desktop-messages): show compact Buzz link metadata (#6252) feat(workflows): reply in-thread from send_message action (#6178) perf(desktop): split discover_acp_providers into cheap and forced paths (#6330) fix(desktop): restore recent channel sorting (#6402) ... Co-authored-by: Bradley Axen <baxen@squareup.com> Signed-off-by: Bradley Axen <baxen@squareup.com> # Conflicts: # crates/buzz-acp/src/base_prompt.md
…odo scope (#319) * test(desktop): RED contracts for evidence-vs-chip dispatch and Tier 2 prompts Pin the #289 conflict: a crew-evidence message that also contains a buzz:// permalink must stay an evidence card. Compact permalink chips, pickup follow-through, and MCP todo scope assertions fail until the upstream ports land. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: oscarlehuu <oscarlehuu@users.noreply.github.com> * upstream(sync): Tier 2 messaging — inbox delete, compact links, MCP todo Absorb Buzz block#5779, block#5638, block#6252, block#6186, and block#6216. MessageRowDefaultBody dispatch order is crew-evidence → handover → compact Buzz permalink chips → ordinary Markdown, so an evidence card with a buzz:// link still renders Accept/Reject instead of a chip. block#6186 pickup follow-through composes with Crew no-bare-ack (#283/#276). Wiki buzz://file citations stay inline (not chips). Inbox delete does not change Mission Inbox sections. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: oscarlehuu <oscarlehuu@users.noreply.github.com> * test(desktop): scope evidence+permalink row filter to the card descendant The Playwright `has` locator must be relative to each message-row. Nested timeline-scoped locators never matched even when the evidence card rendered. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: oscarlehuu <oscarlehuu@users.noreply.github.com> * fix(desktop): extract permalink markdown components under file-size ratchet Move channel/message/entity chip renderers out of markdown.tsx so the already-over-limit file stays at or below the 1915-line base. Dispatch order is unchanged: crew-evidence → handover → compact links → Markdown. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: oscarlehuu <oscarlehuu@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: oscarlehuu <oscarlehuu@users.noreply.github.com>
**Category:** improvement **User Impact:** Buzz links in messages now resolve into compact, descriptive chips with predictable navigation, while tooltips use the neutral secondary surface consistently across light and dark themes. **Problem:** Raw Buzz-native links and opaque identifiers make message context difficult to scan, while oversized previews disrupt the conversation. Missing, delayed, or deleted metadata also needs a stable presentation that does not mislead users or break navigation. **Solution:** Keep message and issue chips metadata-independent: message chips render only the channel name, while issue chips render only the repository name—never fetched content/title or an event hash. Fetched context remains available in each hover tooltip. Other native links continue to resolve into concise inline labels, with muted secondary fallbacks, distinct deleted states, and existing navigation paths preserved. This also makes two explicit shared-tooltip behavior changes: 1. **Color:** shared and rich tooltips move from the primary color pair to the neutral secondary semantic pair, including dedicated huddle-token handling and matching rich-descendant foregrounds. 2. **Hover behavior:** tooltip roots set Radix `disableHoverableContent`, and tooltip content is pointer-transparent, so moving off the trigger dismisses the tooltip instead of letting the pointer enter and keep the popover open. Together these preserve readable contrast, authoritative project context, and predictable hover dismissal. <details> <summary>File changes</summary> **desktop/src/features/communities/useCommunityInit.ts** Primes channel metadata needed to resolve native links promptly. **desktop/src/features/messages/lib/messageLinkMetadata.test.mjs** Covers message preview extraction, fallbacks, and deleted-message semantics. **desktop/src/features/messages/lib/messageLinkMetadata.ts** Normalizes fetched message metadata into compact labels and status-aware presentation. **desktop/src/features/messages/ui/SentFromThreadLine.tsx** Provides thread context to linked-message metadata resolution. **desktop/src/shared/lib/useResolvedLinkPreviews.ts** Exposes resolved preview state for native entity chips. **desktop/src/shared/styles/globals/markdown.css** Adds compact chip layout and semantic disabled-state styling. **desktop/src/shared/styles/globals/theme.css** Defines the semantic colors used by unavailable and deleted chips. **desktop/src/shared/ui/markdown.test.mjs** Exercises native-link rendering and provider-backed entity metadata behavior. **desktop/src/shared/ui/markdown.tsx** Routes native markdown links through metadata-aware chip components without changing navigation contracts. **desktop/src/shared/ui/markdown/ChannelDeepLink.test.mjs** Covers resolved, unresolved, private, archived, and forum channel presentations. **desktop/src/shared/ui/markdown/ChannelDeepLink.tsx** Renders channel names and concise channel metadata inline with stable fallbacks. **desktop/src/shared/ui/markdown/MessageLinkPill.tsx** Renders loading, ready, unavailable, DM, forum, and deleted message states compactly. **desktop/src/shared/ui/markdown/entityLinks.tsx** Enriches repository, issue, and pull-request chips and uses containing-project context in tooltips. **desktop/src/shared/ui/markdown/types.ts** Extends markdown runtime metadata required by native chip rendering. **desktop/src/shared/ui/markdown/useMessageLinkMetadata.ts** Fetches and classifies linked-message metadata while preserving navigable fallbacks. **desktop/src/testing/e2eBridge.ts** Adds deterministic metadata controls for runtime visual and navigation tests. **desktop/tailwind.config.js** Makes semantic disabled colors available to chip styles. **desktop/tests/e2e/entity-link-recipient-cards.spec.ts** Verifies entity labels, project-aware tooltips, delayed metadata, and navigation behavior. **desktop/tests/e2e/navigation.spec.ts** Verifies channel and message chip states, metadata resolution, deletion handling, and navigation. **desktop/src/shared/ui/tooltip.tsx** Migrates the shared tooltip surface from the primary color pair to the semantic secondary pair. It also sets Radix `disableHoverableContent` and makes tooltip content pointer-transparent so leaving the trigger dismisses the tooltip predictably. **desktop/src/features/agents/ui/RestartDiffBadge.tsx** Aligns restart-diff tooltip values and supporting copy with the secondary tooltip foreground. **desktop/src/features/channels/ui/AddChannelBotTeamsSection.tsx** Aligns rich team tooltip descriptions, persona chips, avatars, and names with secondary tooltip semantics. **desktop/src/features/projects/ui/ProjectAuthorIdentity.tsx** Uses the matching secondary tooltip foreground for project author metadata. **desktop/src/features/projects/ui/ProjectCards.tsx** Aligns repository-unavailable tooltip descriptions with the secondary tooltip foreground. **desktop/src/shared/styles/globals/utilities.css** Makes huddle tooltips consume their dedicated palette directly without misleading primary or secondary aliases. **desktop/src/shared/styles/globals/tooltipSemantics.test.mjs** Pins direct huddle-token consumption and rejects semantic alias drift. **desktop/tests/e2e/tooltip-semantics.spec.ts** Verifies simple and rich tooltip surfaces and descendant tokens in Buzz light and Catppuccin Mocha dark themes. **desktop/playwright.config.ts** Registers tooltip semantic coverage in the desktop smoke suite. </details> ## Reproduction steps 1. Run the desktop app and open a message containing Buzz links for a channel, message, repository, issue, and pull request. 2. Confirm message links show only the channel name and issue links show only the repository name inline, with no fetched content/title or event hash; confirm other native links remain compact rather than rendering raw identifiers or expanded previews. 3. Hover the chips and confirm the neutral secondary tooltip adds concise context without duplicating the visible label. 4. Open each chip and confirm it follows the same channel, message, repository, issue, or pull-request navigation as before. 5. Inspect links while metadata is loading, unavailable, or definitively deleted and confirm the fallback remains compact, legible, and navigable where appropriate. 6. In Buzz light and Catppuccin Mocha dark themes, compare a simple channel-members tooltip and the rich Add agents team tooltip; both should use secondary semantics with readable nested content. 7. Move the pointer from a trigger toward its tooltip; confirm the tooltip dismisses rather than remaining open as hoverable content. ## Screenshots The matrix below covers both the default light theme and Catppuccin Mocha with an orange accent. Message/issue-chip rows affected by the stable-label pivot are temporarily omitted until they can be recaptured from the real built UI; the prior images showed the obsolete expanding inline label. | State | Default light | Dark · orange accent | |---|---|---| | Public stream channel tooltip |  |  | | Private forum channel tooltip |  |  | | Public forum channel tooltip |  |  | | Channel references, including unresolved |  |  | | Unknown channel permalink |  |  | | Archived channel tooltip |  |  | | Repository entity |  |  | | Pull request entity |  |  | | Entity metadata fallback |  |  | ### Tooltip semantic surface spot check | Buzz light | Catppuccin Mocha dark | |---|---| |  |  | --------- Signed-off-by: Taylor Ho <taylorkmho@gmail.com> Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz>
Category: improvement
User Impact: Buzz links in messages now resolve into compact, descriptive chips with predictable navigation, while tooltips use the neutral secondary surface consistently across light and dark themes.
Problem: Raw Buzz-native links and opaque identifiers make message context difficult to scan, while oversized previews disrupt the conversation. Missing, delayed, or deleted metadata also needs a stable presentation that does not mislead users or break navigation.
Solution: Keep message and issue chips metadata-independent: message chips render only the channel name, while issue chips render only the repository name—never fetched content/title or an event hash. Fetched context remains available in each hover tooltip. Other native links continue to resolve into concise inline labels, with muted secondary fallbacks, distinct deleted states, and existing navigation paths preserved. This also makes two explicit shared-tooltip behavior changes:
disableHoverableContent, and tooltip content is pointer-transparent, so moving off the trigger dismisses the tooltip instead of letting the pointer enter and keep the popover open.Together these preserve readable contrast, authoritative project context, and predictable hover dismissal.
File changes
desktop/src/features/communities/useCommunityInit.ts
Primes channel metadata needed to resolve native links promptly.
desktop/src/features/messages/lib/messageLinkMetadata.test.mjs
Covers message preview extraction, fallbacks, and deleted-message semantics.
desktop/src/features/messages/lib/messageLinkMetadata.ts
Normalizes fetched message metadata into compact labels and status-aware presentation.
desktop/src/features/messages/ui/SentFromThreadLine.tsx
Provides thread context to linked-message metadata resolution.
desktop/src/shared/lib/useResolvedLinkPreviews.ts
Exposes resolved preview state for native entity chips.
desktop/src/shared/styles/globals/markdown.css
Adds compact chip layout and semantic disabled-state styling.
desktop/src/shared/styles/globals/theme.css
Defines the semantic colors used by unavailable and deleted chips.
desktop/src/shared/ui/markdown.test.mjs
Exercises native-link rendering and provider-backed entity metadata behavior.
desktop/src/shared/ui/markdown.tsx
Routes native markdown links through metadata-aware chip components without changing navigation contracts.
desktop/src/shared/ui/markdown/ChannelDeepLink.test.mjs
Covers resolved, unresolved, private, archived, and forum channel presentations.
desktop/src/shared/ui/markdown/ChannelDeepLink.tsx
Renders channel names and concise channel metadata inline with stable fallbacks.
desktop/src/shared/ui/markdown/MessageLinkPill.tsx
Renders loading, ready, unavailable, DM, forum, and deleted message states compactly.
desktop/src/shared/ui/markdown/entityLinks.tsx
Enriches repository, issue, and pull-request chips and uses containing-project context in tooltips.
desktop/src/shared/ui/markdown/types.ts
Extends markdown runtime metadata required by native chip rendering.
desktop/src/shared/ui/markdown/useMessageLinkMetadata.ts
Fetches and classifies linked-message metadata while preserving navigable fallbacks.
desktop/src/testing/e2eBridge.ts
Adds deterministic metadata controls for runtime visual and navigation tests.
desktop/tailwind.config.js
Makes semantic disabled colors available to chip styles.
desktop/tests/e2e/entity-link-recipient-cards.spec.ts
Verifies entity labels, project-aware tooltips, delayed metadata, and navigation behavior.
desktop/tests/e2e/navigation.spec.ts
Verifies channel and message chip states, metadata resolution, deletion handling, and navigation.
desktop/src/shared/ui/tooltip.tsx
Migrates the shared tooltip surface from the primary color pair to the semantic secondary pair. It also sets Radix
disableHoverableContentand makes tooltip content pointer-transparent so leaving the trigger dismisses the tooltip predictably.desktop/src/features/agents/ui/RestartDiffBadge.tsx
Aligns restart-diff tooltip values and supporting copy with the secondary tooltip foreground.
desktop/src/features/channels/ui/AddChannelBotTeamsSection.tsx
Aligns rich team tooltip descriptions, persona chips, avatars, and names with secondary tooltip semantics.
desktop/src/features/projects/ui/ProjectAuthorIdentity.tsx
Uses the matching secondary tooltip foreground for project author metadata.
desktop/src/features/projects/ui/ProjectCards.tsx
Aligns repository-unavailable tooltip descriptions with the secondary tooltip foreground.
desktop/src/shared/styles/globals/utilities.css
Makes huddle tooltips consume their dedicated palette directly without misleading primary or secondary aliases.
desktop/src/shared/styles/globals/tooltipSemantics.test.mjs
Pins direct huddle-token consumption and rejects semantic alias drift.
desktop/tests/e2e/tooltip-semantics.spec.ts
Verifies simple and rich tooltip surfaces and descendant tokens in Buzz light and Catppuccin Mocha dark themes.
desktop/playwright.config.ts
Registers tooltip semantic coverage in the desktop smoke suite.
Reproduction steps
Screenshots
The matrix below covers both the default light theme and Catppuccin Mocha with an orange accent. Message/issue-chip rows affected by the stable-label pivot are temporarily omitted until they can be recaptured from the real built UI; the prior images showed the obsolete expanding inline label.
Tooltip semantic surface spot check