ClientsFlow Pipeline · UX Master 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.
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.
| # | ID | Stage | Improvement | Eff | Imp |
|---|---|---|---|---|---|
| 1 | JX-2 | JX-CrossCutting | Collapse 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. | M | H |
| 2 | JX-1 | JX-CrossCutting | Add a fixed stage tab/pill strip that scrolls a column into view — 11 columns × 430px = ~4,730px with no landmarks to jump to. | M | H |
| 3 | JX-6 | JX-CrossCutting | Surface 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). | M | H |
| 4 | JX-4 | JX-CrossCutting | Collapse empty/terminal columns (Ghosted, Ongoing build/marketing = 0) to 48px tombstone strips; they eat ~30% of viewport width and push active columns offscreen. | M | H |
| 5 | J4-3 | J4-Booked/Prep | Recolor 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). | L | H |
| 6 | J0-7 | J0-Ingestion | Show 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. | L | H |
| 7 | J5-1 | J5-SalesCall | Add 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. | M | H |
| 8 | J1-4 | J1-New Lead | Add 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. | L | H |
| 9 | J7-1 | J7-SignFUP | Render 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. | M | H |
| 10 | J3-7 | J3-Booking+Cancel | On 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. | L | H |
What a rep sees on the board right after a new lead is ingested and classified.
| ID | Stage | Current | Friction | Suggested | Eff | Imp |
|---|---|---|---|---|---|---|
| J0-1 | J0-Ingestion | Card shows "Nincs cégnév / weboldal / megye" grey fallback as the first line under the name | Looks like a loading/error state, not a deliberate "enrichment pending"; rep can't tell if enrichment is running, failed, or genuinely empty | Transient "Enriching…" tag (spinner, ~30s timeout) that converts into real data or a soft "No company found" micro-label | M | H |
| J0-2 | J0-Ingestion | Classification (positive/negative/borderline) is invisible — only the column implies it | A mis-classification (J0.2 false-negative) goes unnoticed until the rep reads the message; no early catch | Small classification badge with colour-dot (green/amber/grey) + tap-to-see raw output + one-click Override | M | H |
| J0-3 | J0-Ingestion | Last-message block shows an envelope icon regardless of touchpoint type | J0.5 requires Email vs Note distinguishable; a pasted Note looks identical to a real inbound Email; rep replies the wrong way | Distinct icon+colour per type: envelope+"Email" (blue), pencil+"Megjegyzés" (grey) | L | M |
| J0-4 | J0-Ingestion | No "new/unseen" indicator separating never-opened cards from reviewed ones | Leads age invisibly; no unread-email-style signal of what's new since last session | Green 3px left-border / unread dot that clears on open; optional "Új" column count | M | H |
| J0-5 | J0-Ingestion | "ZZ" sentinel/test card names render identically to real leads | A rep can act on a test card by mistake or be confused by the ZZ prefix | Muted grey wash + strikethrough name + "TEST" chip for ZZ-prefixed cards | L | M |
| J0-6 | J0-Ingestion | Enrichment writes to Notion silently with no "just populated" moment on the card | Rep only learns of enrichment by refreshing or opening Details | Pulse-animate newly populated fields for 2s (amber→transparent) on the next poll | M | M |
| J0-7 | J0-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 driver | Relative time first ("3 napja") with absolute on hover; pure front-end diff | L | H |
| J0-8 | J0-Ingestion | Hungarian name-parse (J0.4) runs invisibly with no fail-open signal | A bad Flash swap ("Péter Takács") propagates into every greeting/proposal/contract silently | Hover-only tooltip showing the parsed vezetéknév/keresztnév split + "Javítás" inline editor (only if a parse was stored) | M | H |
The new-lead card and the New Lead column (15 cards in the fixture).
| ID | Stage | Current | Friction | Suggested | Eff | Imp |
|---|---|---|---|---|---|---|
| J1-1 | J1-New Lead | Missing-company placeholder uses the same weight/colour as real data | Eye can't pattern-match "has company / missing" across 15 cards in a millisecond | Italic muted empty-state chip ("— ismeretlen cég —"), clearly distinct from real text | L | M |
| J1-2 | J1-New Lead | Email shown raw on the card face; no click-to-copy affordance; phone not shown on face | A 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 absent | M | H |
| J1-3 | J1-New Lead | Name, meta, and message snippet all compete at equal text weight | Flat hierarchy — eye isn't guided name→intent→action; raw HTML could leak into the snippet | Name 16px semibold, company 13px muted, snippet 13px with 2-line clamp on a light tint; date de-emphasized to 11px | M | H |
| J1-4 | J1-New Lead | No "pinned/just-arrived" indicator; a 5-min-old card looks like a 3-day-old one | Rep can't spot freshest inbound (J1.2) or a resurfaced mid-sequence replier (J1.4); ~10s scanning 15 cards | Left-edge recency bar (green <2h / amber 2–24h) + "NEW" chip for <2h; CSS off a server timestamp | L | H |
| J1-5 | J1-New Lead | "Details"/"Full history" are text-only ghost buttons that look disabled | Newcomers skip them; the two-row action layout wastes ~40px of card height | Merge into a slim icon-bar (ⓘ Details · 🕐 History) with hover lift; keep the primary CTA row | M | M |
| J1-6 | J1-New Lead | "MOVE TO" dropdown sits above the name, competing for top-of-card dominance | A rarely-used utility occupies premium real estate, reversing "who → what" hierarchy | Move "Move to" into a ··· overflow / footer icon; let the name sit alone at top | M | M |
| J1-7 | J1-New Lead | Column has 15 cards but no count badge and no overflow/scroll affordance | Overflow is invisible — false sense of completeness; high-urgency replies hide below the fold | Sticky column count badge ("15 új lead") + faint scroll-shadow at column bottom on overflow | L | H |
The Contacted column, the dim/hover-reveal model, and the per-column sort toggle.
| ID | Stage | Current | Friction | Suggested | Eff | Imp |
|---|---|---|---|---|---|---|
| J2-1 | J2-Contacted | Dimmed on-sequence card rendered at ~40% opacity, greyed text + dashed blue border | Sequence-status line and last-message preview barely legible; squinting fatigue over a 4h day | Raise dimmed opacity to ~75% (border already signals on-sequence); or dim only the background, never the text | M | H |
| J2-2 | J2-Contacted | "Auto: No-show rebook · 1/6 · next: 2026-06-23 06:12" fused into one grey string | Three distinct decision signals (template / step / next-fire) undifferentiated; no at-a-glance triage | Three micro-badges: [No-show rebook] · [1/6] · [next: jún 23 06:12] (orange if overdue, green if upcoming) | M | H |
| J2-3 | J2-Contacted | Action buttons appear at rest on dimmed cards — hover-reveal (J2.6) ambiguous | No 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) | M | M |
| J2-4 | J2-Contacted | Sort toggle is a two-segment pill with no active-state contrast | Rep 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) | L | H |
| J2-5 | J2-Contacted | Active card's "Follow-up on" badge overlaps the last-message text/date | Reading collision — rep can't see follow-up date AND last-contact time at peak decision load | Two separated rows: "📅 Follow-up: jún 23" and "Last contacted: jún 22 21:13"; remove the overlay | M | H |
| J2-6 | J2-Contacted | Blue-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 automated | Reserve blue-dashed for healthy; amber-dashed + ⚠ badge for Unreachable (clears on action) | L | H |
| J2-7 | J2-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 sequence | Demote to a ··· overflow / confirm popover ("Stop sequence for X? This cannot be undone") | M | H |
The public booking widget and the cancellation pages a prospect sees — a conversion / trust surface.
| ID | Stage | Current | Friction | Suggested | Eff | Imp |
|---|---|---|---|---|---|---|
| J3-1 | J3-Booking+Cancel | Widget is a bare card with grey "Időpontok betöltése…" text, ~75% blank below | No loading feedback; prospect sees a near-empty screen, doubts trust, abandons | Animated skeleton loader (calendar grid + slot chips) + a 500ms-fallback message | M | H |
| J3-2 | J3-Booking+Cancel | On mobile (390px) the same short line sits above a massive blank scroll zone | Prospect scrolls looking for slots, finds nothing, assumes it's broken, leaves | min-height:420px container + instructional micro-copy anchoring the eye while it loads | L | M |
| J3-3 | J3-Booking+Cancel | Header "CF" avatar is a generic blue letter-tile; no trust signal above the fold | A cold prospect has no brand reassurance; the blue square reads as a placeholder | Real ClientsFlow logo + a trust bar ("🔒 Biztonságos foglalás · Automatikus visszaigazolás" or social proof) | M | H |
| J3-4 | J3-Booking+Cancel | Desktop card left-aligned at ~55% width, large asymmetric right whitespace | Eye drawn off-left rather than into the picker; layout feels unfinished ≥1280px | Center the content column, max-width:560px; consider a 2-col layout ≥768px | M | M |
| J3-5 | J3-Booking+Cancel | Invalid/expired cancel-link state is raw black browser-default text on white | Looks like a broken system, not a managed error; no recovery path | Render inside the same branded card: header, amber ⚠, "Ez a link már felhasználásra került vagy lejárt" + contact block | M | H |
| J3-6 | J3-Booking+Cancel | Cancel-success ✓ is small (~32px); contact card equals the headline in weight | Primary "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) | L | M |
| J3-7 | J3-Booking+Cancel | Cancel-success (mobile): contact copy wraps awkwardly; phone/email are plain ~18px links | Recovery surface for a disappointed prospect; small targets, no tel: deep-link add friction | 44px tel:/mailto: full-width pill buttons with icons; single-line heading "Lépj velünk kapcsolatba:" | L | H |
The Booked / Sales Call Prep column — appointment cards, dim-until-day-before, no-show recovery.
| ID | Stage | Current | Friction | Suggested | Eff | Imp |
|---|---|---|---|---|---|---|
| J4-1 | J4-Booked/Prep | Appointment badge shows the date ("jún. 24.") but not the time | Rep can't answer "what time is the call?" at a glance; must open Details | Promote the time into the header badge as one clock pill: "jún. 24. 21:19" | M | H |
| J4-2 | J4-Booked/Prep | A dimmed card (collapsed) gives no reason why it's dimmed | Rep thinks it's a glitch, tries to expand, re-reads it; the intentional "dim until day-before" (J4.3) is uncommunicated | Ghost label "Aktív: [date]-tól" on dimmed cards + a hover tooltip explaining the activation date | M | H |
| J4-3 | J4-Booked/Prep | Active booked card has a red border | EBO J4.4 wants blue-dashed; red = overdue/urgent everywhere else, so it fires a false alarm | Switch to blue-dashed ("scheduled sequence active"); reserve red for overdue/no-pay | L | H |
| J4-4 | J4-Booked/Prep | Prep guidance + the gating mechanic are one plain-prose paragraph | Rep parses two sentences to learn both the task and that outcome buttons are gated; no progress state | Split into a checklist item + a "Mark Prepped → unlocks outcome buttons" CTA; add progress states | M | H |
| J4-5 | J4-Booked/Prep | "Log Call" is a plain grey link equal to Details / Full history | It's the no-show/reschedule recovery entry (J4.8) but reads as a tertiary utility; rep may miss it | Elevate to a secondary outline button + a "No-show? Reschedule?" micro-label | M | H |
| J4-6 | J4-Booked/Prep | No timezone label on the appointment datetime | Even after the UTC→Budapest fix (J4.6) rep can't be sure it's local; risky for cross-tz leads | Append "CET/CEST" (or "Budapest") to all appointment datetimes | L | H |
| J4-7 | J4-Booked/Prep | Outcome 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 buttons | Show a muted "Ezután: Tovább lép · Nem jelent meg" preview, or show outcome buttons disabled until Prepped | M | M |
| J4-8 | J4-Booked/Prep | No card-level signal of reminders sent or invite-accepted state | Rep can't gauge engagement before the day-before activation without opening Full History | Compact "✉ 2 küldve" reminder badge + a calendar-confirm icon (grey=unconfirmed, green=accepted) | M | M |
The Sales Call / Proposal column — the call-done tag and the transcript-status lifecycle.
| ID | Stage | Current | Friction | Suggested | Eff | Imp |
|---|---|---|---|---|---|---|
| J5-1 | J5-SalesCall | No "call done" tag and no transcript-status tag — only the outcome panel | J5.1 unmet; rep can't tell whether a call happened or whether the transcript is loading/failed/ready | Two pills under the name: green "✓ Hívás kész · 42 min" + a transcript pill (loading/missing/done) | M | H |
| J5-2 | J5-SalesCall | Loud orange/green action panel dominates; transcript state absent | Loudest element is outcome-logging, but post-call the rep needs transcript first | Render the transcript pill ABOVE the LOG CALL OUTCOME section, card-top placement | L | H |
| J5-3 | J5-SalesCall | No "transcription in progress" reassurance (it takes 5–15 min) | Rep checks immediately, sees nothing change, assumes it broke, logs a manual note | Animated pulsing/shimmer "Átírás folyamatban…" pill that appears with the call-done tag, auto-resolves on poll | M | H |
| J5-4 | J5-SalesCall | "Missing transcript" never surfaced — failed transcription looks like a normal card | A hard block on proposal quality discovered late; rep doesn't know to take manual notes / retry | Amber warning pill "⚠ Átírás hiányzik" + a one-tap Retry micro-action | M | H |
| J5-5 | J5-SalesCall | No "view transcript" affordance; big CTA advances the deal, nothing opens the transcript | Once 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/History | L | M |
| J5-6 | J5-SalesCall | Sales-Call column not visually distinguishable on the full board | Rep can't tell at a column glance how many "call done, transcript pending" cards exist | Column-header badge aggregating pending transcripts ("1 átírás folyamatban"), like the count badge | M | M |
| J5-7 | J5-SalesCall | Outcome panel is clickable before a transcript is confirmed | Rep can Move Forward before the transcript attaches; proposal silently loses input | Soft non-blocking confirm on Move Forward when status=loading/missing ("Az átírás még nem érkezett meg — biztosan?") | M | H |
Triggering the post-call proposal wizard and the proposal artifacts surfaced on the card.
| ID | Stage | Current | Friction | Suggested | Eff | Imp |
|---|---|---|---|---|---|---|
| J6-1 | J6-Proposal | "Move Forward" is the only CTA; no dedicated Generate-Proposal entry | Wizard trigger undiscoverable; the label reads as a stage move, not an AI generation | Rename to "Generate Proposal →" with an AI sparkle icon; secondary muted "Move Forward (no proposal)" | M | H |
| J6-2 | J6-Proposal | No loading state on the card during AI generation | Rep 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 actions | M | H |
| J6-3 | J6-Proposal | After send, the card gives no proof a proposal was generated/sent | Rep 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 reload | M | H |
| J6-4 | J6-Proposal | No pricing/validity anywhere on the board face | Rep fielding a callback can't confirm price/urgency without opening the document | Compact "450 000 Ft → 380 000 Ft · érvényes: jún 27." pill in card metadata (collapsible on narrow viewports) | L | H |
| J6-5 | J6-Proposal | Unclear whether the wizard has a preview/confirm before dispatch | A mis-click could send a live AI email with no human gate — violates the invariant | Always show a preview screen (rendered body incl. the 100k promo line) + explicit "Elküldés" + "Edit before sending" | L | H |
| J6-6 | J6-Proposal | Sales-Call/Proposal column narrow; "1" badge looks like a notification bubble | Lower 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 grey | L | M |
| J6-7 | J6-Proposal | No indicator that the 5-day mini-CRM promo line (J6.4) is included | If 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 empty | M | M |
The Sign FUP column — chasing a signature; the three required tags and urgency escalation.
| ID | Stage | Current | Friction | Suggested | Eff | Imp |
|---|---|---|---|---|---|---|
| J7-1 | J7-SignFUP | Offer-validity, reminder-index ("3/5"), and next-call-date tags all absent | Core triage data missing; rep can't see which attempt, when the offer expires, or when to call | Three pills under the name: validity (green→amber→red), reminder-index (heat-tint to red at 5/5), next-call-date (blue); ordered by urgency | M | H |
| J7-2 | J7-SignFUP | Age tag ("2D") is a flat grey pill regardless of 2 vs 12 days | No escalation; reps habituate and stop reading it, missing deals going cold | Three-tier ramp: 0–3 grey, 4–7 amber+dot, 8+ red bold + pulsing dot | L | H |
| J7-3 | J7-SignFUP | Salmon/pink border ambiguous — aging-proposal vs signed-but-unpaid (J7.2) both read reddish | One visual channel overloaded; rep can't tell whether to chase a signature or a payment | Amber-dashed for "aging / no signature"; solid red for "signed but payment overdue" (two pre-attentive axes) | M | H |
| J7-4 | J7-SignFUP | "No message logged yet" is a dead-end grey box with no action | The absence of contact is the most urgent state but looks like any in-progress card | Yellow-tinted "No follow-up logged" callout with an inline "Log Call" shortcut | M | H |
| J7-5 | J7-SignFUP | "Log Call" buried below Details/Full history and the status note | The 100%-used action sits below secondary nav; rep must scroll/expand each of 8 cards | Promote "Log Call" above Details/History as a filled primary button; collapse secondary actions to ··· | L | H |
| J7-6 | J7-SignFUP | Column header has only a count; no column-level urgency summary | Rep must read every card to triage; risk of missing a nearly-expired offer | Header strip: flame + count expiring within 48h, and "⏳ oldest: 8d" | M | M |
| J7-7 | J7-SignFUP | "MOVE TO" dropdown is a full-width ~40px row equal in weight to the name | Low density — only 1–2 cards fit on 768px; rep scrolls heavily, deals fall off the bottom | Collapse "Move to" to a top-right chevron (hover/long-press), freeing ~40px/card | M | M |
The Proposal Signed / Fizetés FUP and Payment Arrived / Adatbekérő FUP columns (incl. an empty column).
| ID | Stage | Current | Friction | Suggested | Eff | Imp |
|---|---|---|---|---|---|---|
| J8-1 | J8-Payment | "Proposal Signed / Fizetés FUP" column shows a dash + count 0, no empty state | Rep 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-tip | M | H |
| J8-2 | J8-Payment | "Payment Arrived" cards show the badge but no amount, date, or outstanding data-intake | Rep must open Details for amount / when / which adatbekérő fields are missing — dozens of opens | Money line "390 000 Ft · júni. 22." + an "Adatbekérő: 3/5 kitöltve" checklist chip | M | H |
| J8-3 | J8-Payment | No 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 stopped | Reminder-index chip "FUP 2/5" + last-reminder timestamp; green "✓ Fizetve" once paid | M | H |
| J8-4 | J8-Payment | Bilingual slash column names ("PAYMENT ARRIVED / ADATBEKÉRŐ FUP") truncate <~1400px | Rep on a 13"/1280px display sees a clipped column name all day — low trust in column identity | Primary bold short label ("Fizetés érkezett") + muted sub-label ("Adatbekérő FUP"); drop the English half from the header | L | M |
| J8-5 | J8-Payment | No 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 one | Reuse the aging-border logic: neutral 0–2d, amber 3d, red 5+d + tooltip | M | H |
| J8-6 | J8-Payment | "3D" age chip is ambiguous — stage-entry age vs last-message age look the same | Rep misreads which clock "3D" counts, misjudging urgency | Label the chip semantically ("fizetve 3 napja"); two-line if the two clocks differ | L | M |
| J8-7 | J8-Payment | No board-level signal whether the Stripe link email was actually sent | A 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 signing | H | H |
Board-wide structure across desktop/tablet/mobile, the Move-to dropdown, sort toggle, and optimistic-UI errors. The highest-leverage cluster.
| ID | Stage | Current | Friction | Suggested | Eff | Imp |
|---|---|---|---|---|---|---|
| JX-1 | JX-CrossCutting | 11 cols × 430px = ~4,730px; only ~3 visible on 1280px; no column-jump | Reaching col 6 means scrolling ~2,500px with no landmarks; heavy scroll fatigue over a 4h day | Fixed horizontal stage tab/pill strip; click scrolls that column into view; active column highlighted | M | H |
| JX-2 | JX-CrossCutting | Mobile (390px): full 430px cards wider than the viewport; buttons overflow offscreen | Rep can't read a card without horizontal scroll; "MOVE TO" cut off; CTAs unreachable | Collapse to a single-column list view below ~600px, driven by the existing STAGE filter pill | M | H |
| JX-3 | JX-CrossCutting | "Move to" is a flat 11-item list with the current stage pre-selected, no grouping | Rep maps stage names to order under pressure; selecting current does nothing (no feedback); fwd/back indistinguishable | Group "⬆ Forward / ⬇ Backward" with a divider; grey out current "(current)"; bold the next logical stage | L | M |
| JX-4 | JX-CrossCutting | Empty/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 offscreen | Collapse empty/terminal columns to 48px tombstone strips (emoji+count); click to expand; persist in localStorage | M | H |
| JX-5 | JX-CrossCutting | Sort toggle pill has no active-state indicator | Rep can't tell which sort is active; a misclick silently reorders with no undo/toast | Fill the active pill (solid vs outline) + a header sort icon when non-default; revert to default on reload unless pinned | L | M |
| JX-6 | JX-CrossCutting | Optimistic-UI write failures revert silently (no toast/banner) | Rep discovers data loss only on next reload, hours later — the most trust-destroying CRM pattern | Red inline banner ("Mentés sikertelen — próbáld újra") + Retry + red left-border until persisted; optional offline indicator | M | H |
| JX-7 | JX-CrossCutting | No 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 cards | Render the search bar prominently on desktop too; highlight/scroll to the match; add a "filter by stage" dropdown | M | H |
| JX-8 | JX-CrossCutting | Tablet (768px): 2 cols visible, the 2nd clipped (sort label cut); no column nav | Rep sees 2 of 11; partial 3rd column falsely suggests "a bit more right" when 9 remain | 2 full columns + a sticky column-picker chip-row; avoid partial reveal; sticky column headers during vertical scroll | M | M |