8e55c3c477
* feat(web): surface PR mergeability + conflict state in the CI popover The CI hover popover showed checks/reviews but nothing about mergeability, so an unmergeable PR silently dropped its merge button with no reason. Add a mergeability row that reuses the detail panel's conflict banner + "Resolve conflicts" agent prompt for dirty PRs, a "Behind base" chip, and a branch-protection note explaining why a blocked PR is gated. Replace the compact merge split-button+dropdown with an inline primary + "or <method>" buttons so the menu's detached portal no longer closes the hover popover. * feat(web): reflect PR mergeability in status colors and badges The PR status pill, badge, and chat-input CI chip derived their colour from checks/reviews only, so a conflicted or blocked PR still read as a green "all good" check. Map dirty -> red, behind -> amber, and branch-protection blocked -> amber across getPRStatusColor, the PRStatusIcon badge, and the chip glyph, so the indicators agree with the popover. Blocked stays sky/in-progress while a requested review is still outstanding (that's the awaiting-review gate, not a hard block). * refactor(web): remove dead merge-menu keep-open plumbing The compact merge control was redesigned to inline buttons (no dropdown portal), which already fixes the hover popover closing. That leaves the keepOpen ref / setKeepOpen / onMergeMenuOpenChange / onMenuOpenChange chain threaded through usePopoverInteractions, PRCIPopover, and PRMergeButton unreachable: the popover always renders PRMergeButton with compact, and the only DropdownMenu lives in the non-compact detail-panel path that never passes the callback. Drop the unused scaffolding (flagged by OpenCode + greptile). * fix(web): keep CI popover quiet for blocked PRs only awaiting review PRMergeabilityRow rendered "Blocked by branch protection" for any blocked PR, including one blocked solely because a requested reviewer hasn't responded. That contradicted the chip/pill/badge, which deliberately read that case as the calm "awaiting review" state. Skip the note (render nothing) when isPRAwaitingReview is true, and narrow blockedReason so an empty checks_state no longer falsely claims a required status check failed. Flagged by Claude (blocker) and greptile. * refactor(web): rename mergeability-notice compact prop to popover The `compact` prop made the chip/text larger (to match the popover's text-xs rows) while ConflictBanner's `compact` tightened padding — so "compact" rendered bigger, which reads as inverted. Rename it to `popover` (the variant rendered inside the CI hover popover) and document that the chip intentionally matches the popover rows. No visual change. Flagged by cubic. * fix(web): show default cursor on disabled compact merge alternates The compact "or <method>" alternates kept cursor-pointer while disabled (during the ~1s merging state); add disabled:cursor-default to match the primary button. Flagged by OpenCode.