ClientsFlow Pipeline · UX Master Investigation

Pipeline UX Investigation

2026-06-24 · 73 findings across 10 journey stages · judged on 25 real screenshots (1280 / 768 / 390) against FINAL_TEST_EBO.md · no live deal touched.

Method: ten parallel sub-agents, one per funnel stage, each scored real PNG frames against that stage's Expected-Behavior Oracle rows and returned "current → suggested" fixes with an effort and impact rating. The structural board/mobile problems (the JX cluster) and the missing at-a-glance status signals dominate the high-impact list.

H — High (clay red) M — Medium (ochre) L — Low (sage green) Effort & Impact both rated H / M / L

Top 10 High-Impact Improvements best impact-per-effort

Ranked across all 73 findings. Five of the top ten are structural board/mobile fixes; the rest are missing status signals that the EBO already expects on the card.

#IDStage ImprovementEffImp
1JX-2JX-CrossCuttingCollapse the board to a single-column list view below ~600px (driven by the existing STAGE pill) — full 430px cards are wider than a 390px phone; buttons overflow offscreen.MH
2JX-1JX-CrossCuttingAdd a fixed stage tab/pill strip that scrolls a column into view — 11 columns × 430px = ~4,730px with no landmarks to jump to.MH
3JX-6JX-CrossCuttingSurface optimistic-UI write failures with a red inline banner + Retry + red left-border — a failed Notion write reverts silently today (the most trust-destroying CRM pattern).MH
4JX-4JX-CrossCuttingCollapse empty/terminal columns (Ghosted, Ongoing build/marketing = 0) to 48px tombstone strips; they eat ~30% of viewport width and push active columns offscreen.MH
5J4-3J4-Booked/PrepRecolor the booked card border blue-dashed, not red — a red border on an upcoming appointment fires a false "you're overdue" alarm (red is the overdue/no-pay color everywhere else).LH
6J0-7J0-IngestionShow relative time first ("3 napja", "2 órája") with absolute on hover — speed-of-response is the #1 cold-outreach conversion driver; reps shouldn't mentally diff dates.LH
7J5-1J5-SalesCallAdd the "call done +duration" tag and the transcript-status pill (loading/missing/done) the EBO requires — today the card gives zero signal a call happened or where the transcript is.MH
8J1-4J1-New LeadAdd a recency left-edge color bar + "NEW" chip (<2h green / 2–24h amber) — pure CSS off a server timestamp; lets a rep spot the freshest inbound instantly.LH
9J7-1J7-SignFUPRender the three required Sign-FUP tags (offer-validity, reminder-index "3/5", next-call-date) as pills under the name — all three are absent today, the core triage data for chasing a signature.MH
10J3-7J3-Booking+CancelOn the cancel-success page (mobile), make phone/email 44px tel:/mailto: pill buttons — the recovery surface for a disappointed prospect; tap targets are ~18px today.LH

J0 · Ingestion & classification 8 findings

What a rep sees on the board right after a new lead is ingested and classified.

IDStageCurrentFrictionSuggestedEffImp
J0-1J0-IngestionCard shows "Nincs cégnév / weboldal / megye" grey fallback as the first line under the nameLooks like a loading/error state, not a deliberate "enrichment pending"; rep can't tell if enrichment is running, failed, or genuinely emptyTransient "Enriching…" tag (spinner, ~30s timeout) that converts into real data or a soft "No company found" micro-labelMH
J0-2J0-IngestionClassification (positive/negative/borderline) is invisible — only the column implies itA mis-classification (J0.2 false-negative) goes unnoticed until the rep reads the message; no early catchSmall classification badge with colour-dot (green/amber/grey) + tap-to-see raw output + one-click OverrideMH
J0-3J0-IngestionLast-message block shows an envelope icon regardless of touchpoint typeJ0.5 requires Email vs Note distinguishable; a pasted Note looks identical to a real inbound Email; rep replies the wrong wayDistinct icon+colour per type: envelope+"Email" (blue), pencil+"Megjegyzés" (grey)LM
J0-4J0-IngestionNo "new/unseen" indicator separating never-opened cards from reviewed onesLeads age invisibly; no unread-email-style signal of what's new since last sessionGreen 3px left-border / unread dot that clears on open; optional "Új" column countMH
J0-5J0-Ingestion"ZZ" sentinel/test card names render identically to real leadsA rep can act on a test card by mistake or be confused by the ZZ prefixMuted grey wash + strikethrough name + "TEST" chip for ZZ-prefixed cardsLM
J0-6J0-IngestionEnrichment writes to Notion silently with no "just populated" moment on the cardRep only learns of enrichment by refreshing or opening DetailsPulse-animate newly populated fields for 2s (amber→transparent) on the next pollMM
J0-7J0-Ingestion"Their last message" timestamp is raw absolute ("JÚN. 22. 09:48")Rep must mentally compute lead age; speed-of-response is the #1 conversion driverRelative time first ("3 napja") with absolute on hover; pure front-end diffLH
J0-8J0-IngestionHungarian name-parse (J0.4) runs invisibly with no fail-open signalA bad Flash swap ("Péter Takács") propagates into every greeting/proposal/contract silentlyHover-only tooltip showing the parsed vezetéknév/keresztnév split + "Javítás" inline editor (only if a parse was stored)MH

J1 · New Lead 7 findings

The new-lead card and the New Lead column (15 cards in the fixture).

IDStageCurrentFrictionSuggestedEffImp
J1-1J1-New LeadMissing-company placeholder uses the same weight/colour as real dataEye can't pattern-match "has company / missing" across 15 cards in a millisecondItalic muted empty-state chip ("— ismeretlen cég —"), clearly distinct from real textLM
J1-2J1-New LeadEmail shown raw on the card face; no click-to-copy affordance; phone not shown on faceA rep dialling 4+h/day needs one-tap copy; must open Details to find the number (3–5 extra clicks)Phone pill with a copy icon + "Vágólapra másolva" toast on hover; muted "nincs telefonszám" badge if absentMH
J1-3J1-New LeadName, meta, and message snippet all compete at equal text weightFlat hierarchy — eye isn't guided name→intent→action; raw HTML could leak into the snippetName 16px semibold, company 13px muted, snippet 13px with 2-line clamp on a light tint; date de-emphasized to 11pxMH
J1-4J1-New LeadNo "pinned/just-arrived" indicator; a 5-min-old card looks like a 3-day-old oneRep can't spot freshest inbound (J1.2) or a resurfaced mid-sequence replier (J1.4); ~10s scanning 15 cardsLeft-edge recency bar (green <2h / amber 2–24h) + "NEW" chip for <2h; CSS off a server timestampLH
J1-5J1-New Lead"Details"/"Full history" are text-only ghost buttons that look disabledNewcomers skip them; the two-row action layout wastes ~40px of card heightMerge into a slim icon-bar (ⓘ Details · 🕐 History) with hover lift; keep the primary CTA rowMM
J1-6J1-New Lead"MOVE TO" dropdown sits above the name, competing for top-of-card dominanceA rarely-used utility occupies premium real estate, reversing "who → what" hierarchyMove "Move to" into a ··· overflow / footer icon; let the name sit alone at topMM
J1-7J1-New LeadColumn has 15 cards but no count badge and no overflow/scroll affordanceOverflow is invisible — false sense of completeness; high-urgency replies hide below the foldSticky column count badge ("15 új lead") + faint scroll-shadow at column bottom on overflowLH

J2 · Contacted / follow-up sequence 7 findings

The Contacted column, the dim/hover-reveal model, and the per-column sort toggle.

IDStageCurrentFrictionSuggestedEffImp
J2-1J2-ContactedDimmed on-sequence card rendered at ~40% opacity, greyed text + dashed blue borderSequence-status line and last-message preview barely legible; squinting fatigue over a 4h dayRaise dimmed opacity to ~75% (border already signals on-sequence); or dim only the background, never the textMH
J2-2J2-Contacted"Auto: No-show rebook · 1/6 · next: 2026-06-23 06:12" fused into one grey stringThree distinct decision signals (template / step / next-fire) undifferentiated; no at-a-glance triageThree micro-badges: [No-show rebook] · [1/6] · [next: jún 23 06:12] (orange if overdue, green if upcoming)MH
J2-3J2-ContactedAction buttons appear at rest on dimmed cards — hover-reveal (J2.6) ambiguousNo learned signal that hovering reveals more; interaction model unclear either way"Hover to act" ghost chevron at rest; on hover fade dim to 90% + slide up actions (120ms)MM
J2-4J2-ContactedSort toggle is a two-segment pill with no active-state contrastRep can't confirm which sort is active at a glance, esp. after reload — repeated "which sort am I on?"Fill the active segment (solid brand colour, white text) + a ↓ arrow; persist per column (localStorage)LH
J2-5J2-ContactedActive card's "Follow-up on" badge overlaps the last-message text/dateReading collision — rep can't see follow-up date AND last-contact time at peak decision loadTwo separated rows: "📅 Follow-up: jún 23" and "Last contacted: jún 22 21:13"; remove the overlayMH
J2-6J2-ContactedBlue-dashed border identical for "on-sequence healthy" and "Unreachable" (J2.4)Rep can't tell whether a blue-dashed card needs action or is safely automatedReserve blue-dashed for healthy; amber-dashed + ⚠ badge for Unreachable (clears on action)LH
J2-7J2-Contacted"Stop automatic emails" sits inline at the same weight as "Edit"Destructive (kills the sequence, no undo); a mis-tap during fast scroll silently terminates a live sequenceDemote to a ··· overflow / confirm popover ("Stop sequence for X? This cannot be undone")MH

J3 · Booking — link, availability, cancel (lead-facing) 7 findings

The public booking widget and the cancellation pages a prospect sees — a conversion / trust surface.

IDStageCurrentFrictionSuggestedEffImp
J3-1J3-Booking+CancelWidget is a bare card with grey "Időpontok betöltése…" text, ~75% blank belowNo loading feedback; prospect sees a near-empty screen, doubts trust, abandonsAnimated skeleton loader (calendar grid + slot chips) + a 500ms-fallback messageMH
J3-2J3-Booking+CancelOn mobile (390px) the same short line sits above a massive blank scroll zoneProspect scrolls looking for slots, finds nothing, assumes it's broken, leavesmin-height:420px container + instructional micro-copy anchoring the eye while it loadsLM
J3-3J3-Booking+CancelHeader "CF" avatar is a generic blue letter-tile; no trust signal above the foldA cold prospect has no brand reassurance; the blue square reads as a placeholderReal ClientsFlow logo + a trust bar ("🔒 Biztonságos foglalás · Automatikus visszaigazolás" or social proof)MH
J3-4J3-Booking+CancelDesktop card left-aligned at ~55% width, large asymmetric right whitespaceEye drawn off-left rather than into the picker; layout feels unfinished ≥1280pxCenter the content column, max-width:560px; consider a 2-col layout ≥768pxMM
J3-5J3-Booking+CancelInvalid/expired cancel-link state is raw black browser-default text on whiteLooks like a broken system, not a managed error; no recovery pathRender inside the same branded card: header, amber ⚠, "Ez a link már felhasználásra került vagy lejárt" + contact blockMH
J3-6J3-Booking+CancelCancel-success ✓ is small (~32px); contact card equals the headline in weightPrimary "all good, no stress" signal is undersized; recovery block competes for the eye✓ to ~64px + a gentle scale entrance (300ms); demote the contact card (lighter border, smaller font)LM
J3-7J3-Booking+CancelCancel-success (mobile): contact copy wraps awkwardly; phone/email are plain ~18px linksRecovery surface for a disappointed prospect; small targets, no tel: deep-link add friction44px tel:/mailto: full-width pill buttons with icons; single-line heading "Lépj velünk kapcsolatba:"LH

J4 · Booked / Sales-Call Prep 8 findings

The Booked / Sales Call Prep column — appointment cards, dim-until-day-before, no-show recovery.

IDStageCurrentFrictionSuggestedEffImp
J4-1J4-Booked/PrepAppointment badge shows the date ("jún. 24.") but not the timeRep can't answer "what time is the call?" at a glance; must open DetailsPromote the time into the header badge as one clock pill: "jún. 24. 21:19"MH
J4-2J4-Booked/PrepA dimmed card (collapsed) gives no reason why it's dimmedRep thinks it's a glitch, tries to expand, re-reads it; the intentional "dim until day-before" (J4.3) is uncommunicatedGhost label "Aktív: [date]-tól" on dimmed cards + a hover tooltip explaining the activation dateMH
J4-3J4-Booked/PrepActive booked card has a red borderEBO J4.4 wants blue-dashed; red = overdue/urgent everywhere else, so it fires a false alarmSwitch to blue-dashed ("scheduled sequence active"); reserve red for overdue/no-payLH
J4-4J4-Booked/PrepPrep guidance + the gating mechanic are one plain-prose paragraphRep parses two sentences to learn both the task and that outcome buttons are gated; no progress stateSplit into a checklist item + a "Mark Prepped → unlocks outcome buttons" CTA; add progress statesMH
J4-5J4-Booked/Prep"Log Call" is a plain grey link equal to Details / Full historyIt's the no-show/reschedule recovery entry (J4.8) but reads as a tertiary utility; rep may miss itElevate to a secondary outline button + a "No-show? Reschedule?" micro-labelMH
J4-6J4-Booked/PrepNo timezone label on the appointment datetimeEven after the UTC→Budapest fix (J4.6) rep can't be sure it's local; risky for cross-tz leadsAppend "CET/CEST" (or "Budapest") to all appointment datetimesLH
J4-7J4-Booked/PrepOutcome buttons (Move Forward / No-show) hidden until after "Mark Prepped"Dead-end moment — rep clicks, the UI changes, must re-orient to find the new buttonsShow a muted "Ezután: Tovább lép · Nem jelent meg" preview, or show outcome buttons disabled until PreppedMM
J4-8J4-Booked/PrepNo card-level signal of reminders sent or invite-accepted stateRep can't gauge engagement before the day-before activation without opening Full HistoryCompact "✉ 2 küldve" reminder badge + a calendar-confirm icon (grey=unconfirmed, green=accepted)MM

J5 · Sales call & transcription 7 findings

The Sales Call / Proposal column — the call-done tag and the transcript-status lifecycle.

IDStageCurrentFrictionSuggestedEffImp
J5-1J5-SalesCallNo "call done" tag and no transcript-status tag — only the outcome panelJ5.1 unmet; rep can't tell whether a call happened or whether the transcript is loading/failed/readyTwo pills under the name: green "✓ Hívás kész · 42 min" + a transcript pill (loading/missing/done)MH
J5-2J5-SalesCallLoud orange/green action panel dominates; transcript state absentLoudest element is outcome-logging, but post-call the rep needs transcript firstRender the transcript pill ABOVE the LOG CALL OUTCOME section, card-top placementLH
J5-3J5-SalesCallNo "transcription in progress" reassurance (it takes 5–15 min)Rep checks immediately, sees nothing change, assumes it broke, logs a manual noteAnimated pulsing/shimmer "Átírás folyamatban…" pill that appears with the call-done tag, auto-resolves on pollMH
J5-4J5-SalesCall"Missing transcript" never surfaced — failed transcription looks like a normal cardA hard block on proposal quality discovered late; rep doesn't know to take manual notes / retryAmber warning pill "⚠ Átírás hiányzik" + a one-tap Retry micro-actionMH
J5-5J5-SalesCallNo "view transcript" affordance; big CTA advances the deal, nothing opens the transcriptOnce a transcript exists the rep must leave the board to read it, breaking flow"📄 Átírás megtekintése" link (text-weight) shown only when status=done, beside Details/HistoryLM
J5-6J5-SalesCallSales-Call column not visually distinguishable on the full boardRep can't tell at a column glance how many "call done, transcript pending" cards existColumn-header badge aggregating pending transcripts ("1 átírás folyamatban"), like the count badgeMM
J5-7J5-SalesCallOutcome panel is clickable before a transcript is confirmedRep can Move Forward before the transcript attaches; proposal silently loses inputSoft non-blocking confirm on Move Forward when status=loading/missing ("Az átírás még nem érkezett meg — biztosan?")MH

J6 · Proposal 7 findings

Triggering the post-call proposal wizard and the proposal artifacts surfaced on the card.

IDStageCurrentFrictionSuggestedEffImp
J6-1J6-Proposal"Move Forward" is the only CTA; no dedicated Generate-Proposal entryWizard trigger undiscoverable; the label reads as a stage move, not an AI generationRename to "Generate Proposal →" with an AI sparkle icon; secondary muted "Move Forward (no proposal)"MH
J6-2J6-ProposalNo loading state on the card during AI generationRep clicks again / navigates away / assumes failure; double-submission risk (JX.3)Pulsing "Ajánlat generálása…" skeleton overlay + shimmer border (amber→green); disable other card actionsMH
J6-3J6-ProposalAfter send, the card gives no proof a proposal was generated/sentRep can't glance and tell which cards produced a proposal; undermines trust in the optimistic move"Ajánlat elküldve jún. 22." line with a sent-envelope icon; persist in Notion to survive reloadMH
J6-4J6-ProposalNo pricing/validity anywhere on the board faceRep fielding a callback can't confirm price/urgency without opening the documentCompact "450 000 Ft → 380 000 Ft · érvényes: jún 27." pill in card metadata (collapsible on narrow viewports)LH
J6-5J6-ProposalUnclear whether the wizard has a preview/confirm before dispatchA mis-click could send a live AI email with no human gate — violates the invariantAlways show a preview screen (rendered body incl. the 100k promo line) + explicit "Elküldés" + "Edit before sending"LH
J6-6J6-ProposalSales-Call/Proposal column narrow; "1" badge looks like a notification bubbleLower density in a high-stakes column; rep may not register a pending proposal scanning L→R+~30px min-width for right-side action columns; amber badge for proposal-pending vs neutral greyLM
J6-7J6-ProposalNo indicator that the 5-day mini-CRM promo line (J6.4) is includedIf the Sablonok copy was cleared, the proposal sends without the upsell silently"✓ Mini-CRM bónusz" chip on the Sign-FUP card from the same Sablonok flag; amber if the key is emptyMM

J7 · Sign follow-up 7 findings

The Sign FUP column — chasing a signature; the three required tags and urgency escalation.

IDStageCurrentFrictionSuggestedEffImp
J7-1J7-SignFUPOffer-validity, reminder-index ("3/5"), and next-call-date tags all absentCore triage data missing; rep can't see which attempt, when the offer expires, or when to callThree pills under the name: validity (green→amber→red), reminder-index (heat-tint to red at 5/5), next-call-date (blue); ordered by urgencyMH
J7-2J7-SignFUPAge tag ("2D") is a flat grey pill regardless of 2 vs 12 daysNo escalation; reps habituate and stop reading it, missing deals going coldThree-tier ramp: 0–3 grey, 4–7 amber+dot, 8+ red bold + pulsing dotLH
J7-3J7-SignFUPSalmon/pink border ambiguous — aging-proposal vs signed-but-unpaid (J7.2) both read reddishOne visual channel overloaded; rep can't tell whether to chase a signature or a paymentAmber-dashed for "aging / no signature"; solid red for "signed but payment overdue" (two pre-attentive axes)MH
J7-4J7-SignFUP"No message logged yet" is a dead-end grey box with no actionThe absence of contact is the most urgent state but looks like any in-progress cardYellow-tinted "No follow-up logged" callout with an inline "Log Call" shortcutMH
J7-5J7-SignFUP"Log Call" buried below Details/Full history and the status noteThe 100%-used action sits below secondary nav; rep must scroll/expand each of 8 cardsPromote "Log Call" above Details/History as a filled primary button; collapse secondary actions to ···LH
J7-6J7-SignFUPColumn header has only a count; no column-level urgency summaryRep must read every card to triage; risk of missing a nearly-expired offerHeader strip: flame + count expiring within 48h, and "⏳ oldest: 8d"MM
J7-7J7-SignFUP"MOVE TO" dropdown is a full-width ~40px row equal in weight to the nameLow density — only 1–2 cards fit on 768px; rep scrolls heavily, deals fall off the bottomCollapse "Move to" to a top-right chevron (hover/long-press), freeing ~40px/cardMM

J8 · Payment 7 findings

The Proposal Signed / Fizetés FUP and Payment Arrived / Adatbekérő FUP columns (incl. an empty column).

IDStageCurrentFrictionSuggestedEffImp
J8-1J8-Payment"Proposal Signed / Fizetés FUP" column shows a dash + count 0, no empty stateRep can't tell if 0 is healthy (everyone paid) or broken (sequence failed, cards never arrived)Contextual empty state: green check + "Nincs várakozó fizetés…" or a neutral "Várakozó: nincs" + a webhook-check micro-tipMH
J8-2J8-Payment"Payment Arrived" cards show the badge but no amount, date, or outstanding data-intakeRep must open Details for amount / when / which adatbekérő fields are missing — dozens of opensMoney line "390 000 Ft · júni. 22." + an "Adatbekérő: 3/5 kitöltve" checklist chipMH
J8-3J8-PaymentNo reminder-index tag on the Fizetés-FUP card (contrast with J7.1's "3/5")Rep can't tell if the payment sequence is armed, how many reminders fired, or whether it stoppedReminder-index chip "FUP 2/5" + last-reminder timestamp; green "✓ Fizetve" once paidMH
J8-4J8-PaymentBilingual slash column names ("PAYMENT ARRIVED / ADATBEKÉRŐ FUP") truncate <~1400pxRep on a 13"/1280px display sees a clipped column name all day — low trust in column identityPrimary bold short label ("Fizetés érkezett") + muted sub-label ("Adatbekérő FUP"); drop the English half from the headerLM
J8-5J8-PaymentNo aging-border escalation on Payment-Arrived cards (J7.2 logic not ported)A card sitting 3+ days in Adatbekérő FUP is equally urgent but looks identical to a fresh oneReuse the aging-border logic: neutral 0–2d, amber 3d, red 5+d + tooltipMH
J8-6J8-Payment"3D" age chip is ambiguous — stage-entry age vs last-message age look the sameRep misreads which clock "3D" counts, misjudging urgencyLabel the chip semantically ("fizetve 3 napja"); two-line if the two clocks differLM
J8-7J8-PaymentNo board-level signal whether the Stripe link email was actually sentA silently-failed payment sequence is discovered days late ("why hasn't this person paid?")"💳 Link elküldve · júni 22." chip when confirmed sent; red "⚠ Link nem ment ki" if not armed within 1h of signingHH

JX · Cross-cutting · board, optimistic UI, mobile, navigation 8 findings

Board-wide structure across desktop/tablet/mobile, the Move-to dropdown, sort toggle, and optimistic-UI errors. The highest-leverage cluster.

IDStageCurrentFrictionSuggestedEffImp
JX-1JX-CrossCutting11 cols × 430px = ~4,730px; only ~3 visible on 1280px; no column-jumpReaching col 6 means scrolling ~2,500px with no landmarks; heavy scroll fatigue over a 4h dayFixed horizontal stage tab/pill strip; click scrolls that column into view; active column highlightedMH
JX-2JX-CrossCuttingMobile (390px): full 430px cards wider than the viewport; buttons overflow offscreenRep can't read a card without horizontal scroll; "MOVE TO" cut off; CTAs unreachableCollapse to a single-column list view below ~600px, driven by the existing STAGE filter pillMH
JX-3JX-CrossCutting"Move to" is a flat 11-item list with the current stage pre-selected, no groupingRep maps stage names to order under pressure; selecting current does nothing (no feedback); fwd/back indistinguishableGroup "⬆ Forward / ⬇ Backward" with a divider; grey out current "(current)"; bold the next logical stageLM
JX-4JX-CrossCuttingEmpty/terminal columns (Ghosted, Ongoing build/marketing = 0) take full 430px each~430px extra scroll each visit; terminal cols eat ~30% of width, pushing active cols offscreenCollapse empty/terminal columns to 48px tombstone strips (emoji+count); click to expand; persist in localStorageMH
JX-5JX-CrossCuttingSort toggle pill has no active-state indicatorRep can't tell which sort is active; a misclick silently reorders with no undo/toastFill the active pill (solid vs outline) + a header sort icon when non-default; revert to default on reload unless pinnedLM
JX-6JX-CrossCuttingOptimistic-UI write failures revert silently (no toast/banner)Rep discovers data loss only on next reload, hours later — the most trust-destroying CRM patternRed inline banner ("Mentés sikertelen — próbáld újra") + Retry + red left-border until persisted; optional offline indicatorMH
JX-7JX-CrossCuttingNo visible cross-column search/filter on desktop (search bar only seen on mobile)Finding a card by name means scanning up to 11 columns; doesn't scale past ~30 cardsRender the search bar prominently on desktop too; highlight/scroll to the match; add a "filter by stage" dropdownMH
JX-8JX-CrossCuttingTablet (768px): 2 cols visible, the 2nd clipped (sort label cut); no column navRep sees 2 of 11; partial 3rd column falsely suggests "a bit more right" when 9 remain2 full columns + a sticky column-picker chip-row; avoid partial reveal; sticky column headers during vertical scrollMM