Bugfix·Feature factory · ClientsFlow Pipeline

F1–F6 build — PENDING REVIEW

Run bnf-finish-2026-06-24 · live build f06d5e7+v100 · 2026-06-24 · whole-journey final QA CLEAN · nothing pushed

One thing to do: review, then reply “accept” and I'll push the integration + feature branches (main stays your explicit trigger). Or tell me to revert. Nothing is pushed yetmain is untouched at 57d6beb; the code is live on Modal for QA only and is one snapshot rollback away (cp -r .tmp/snapshots/v100/app/* app/).
🟢 LIVE driven in-browser, real pixels + state 🔵 SEAM pytest at the real seam (suite 556 green) 🟠 RESIDUAL needs a real external event — built, live-deferred ⚪ DEFERRED your call, next round

What got built F1–F6 · +25 tests

Built on the freshly-refactored base (the flows/dash god-module split), 4 builders on isolated worktrees, TDD, QA-twin-audited (0 test-theater), merged with 0 conflicts.

#FeatureWhat shippedVerify
F1Categorization AIClassifier prompt hardened so a clear positive isn't flagged negative; classify_eval.py regression harness (frozen 16-case set + positive-recall/false-neg metric + champion keep/discard; champion proposed for Sablonok, never auto-promoted)🔵 + 🟢
F2Board UXPer-column sort toggle (last-edited / closest-deadline, column-local) + “Move to” stage dropdown on every card (drag kept) + new leads pinned to the top🟢 + 🔵
F3Cancel pagePolished /cancel success page — central ✓ + “Sikeres lemondás” + your phone & email, no form — and the cancel is logged as a history touchpoint🟢 + 🔵
F4Manual-booking parityVerify-only (your call): manual booking already moves to Sales-Call Prep + disarms the no-appt FUP — confirmed🔵
F5Hungarian name parserInvisible Gemini-Flash step on ingestion fixes first/last order before the deal persists; fail-open on model error🟢 + 🔵
F6Proposal promo5-day mini-CRM / 100 000 Ft bonus line near the price box, editable via copy:proposal_promo_5nap (Sablonok) — not hard-wired🟢 + 🔵

Final QA — whole user journey 55 rows · 45✓ / 10🟠 / 0✗

The Opus FINAL-QA agent ran visual-qa-ultra over the aggregate oracle (every prior round + the new F1–F6), along the funnel spine. Verdict: CLEAN. Only LIVE frames matching the oracle are green; residual-human rows are BLOCKED, never faked.

Journey stageLive-verified this runStatus
Ingestion & classificationpositive lead not flagged negative (F1); HU name corrected, invisible (F5)🟢 + 🔵 seam
New Leadnew-lead pinned to top (F2, B1-fixed); card renders; resurface-on-reply🟢
Contacted / sequencesort toggle column-local (F2)🟢 + 🔵 seam
Booking / cancelcancel success page ✓ + copy + contact, no form (F3); booking widget🟢 + 🔵 seam
Booked / Sales-Call Prep“Move to” persists, no rubber-band, incl. backward (F2); manual-booking parity (F4)🟢 + 🔵 seam
Sales call & transcriptioncall-done + transcript tags; Meet transcription = residual (real ≥2-person Meet)🔵 + 🟠
Proposal5-day mini-CRM promo line near the price box (F6); instant move to Sign-FUP🟢 + 🔵 seam
Sign follow-upvalidity + reminder tags; live DocuSeal both-signed = residual🔵 + 🟠
Paymentpayment self-arm seam; AUTOSEND flip + live Stripe = residual🔵 + 🟠
Onboardingpost-signing sitemap flow — deferred (your call)

Full watchable report (10 live frames, each with a Gemini pixel-read + a verifying Claude analysis): final_vqa.html. Machine verdict: final_qa.json.

The one finding — fixed B1 · round 2 clean

B1 / J1.2 (new-lead pin): a fresh new-lead sat below unread-email cards (the older WS3 “unread first” precedence won). Fixed in e0826fe — the new-lead pin is now absolute (outranks the unread jump; freshest new-lead at index 0), non-new-lead columns unchanged. Re-verified by a real-source comparator test (runs the actual boardColSort, asserts index 0 above unread in both sort modes) + suite 556 green + redeploy v100.

↪ One decision for you: a new lead now outranks an unread-email card at the top of a column. That's what you asked for in the meeting (“mindig legfelülre”), but it overrides the prior “unread on top” rule. Keep it (new-lead wins), or should unread still win? Say the word and I'll flip it.

Residual-human — built, never faked green 10 rows

Code is in place where possible; live verification needs a real external event or your decision. These are honestly BLOCKED in the QA, not green.

ItemWhy it's blocked
AUTOSEND flip (I12)Your explicit decision — never flipped autonomously; payment email currently drafts
gcal live busy / reschedule delete (I5/BUG-06)Needs domain-wide delegation / free-busy sharing; window+grid correct, bounded 8s fail-open
Meet transcription (I7)Needs a real ≥2-person Meet + Workspace-Events push subscription
DocuSeal both-signed (I14)Needs a real both-signed event
Stripe live (I13)Needs a real/TEST Stripe charge
Full fresh-lead enrichment (I9)Needs a real brand-new lead ingested from zero

Deferred by you 3

Invoice auto-issue + send on payment (“következő körre”) · F7 onboarding/sitemap flow (“nem lesz blocker”) · CS-prep gem auto-trigger (“majd ráért később”). Documented in the EBO; not built this run.

If you accept

On your “accept”: I announce branch + files + remote, then push the integration + the 4 feature branches. main / production stay your explicit trigger. I'll also sweep any leftover ZZ fixtures (the QA agent already swept its own).