ClientsFlow Pipeline · autonomous bugfix/feature factory

Round-3 — 14 asks, built, merged, live-tested

Consolidated to ONE branch main · live 412ebe4+v097 · PENDING_REVIEW (local-only, not pushed) · 2026-06-24

🟢 built + verified LIVE (HTTP/smoke on the deployed build) 🟡 built + verified by test (strong real-seam pytest; render code confirmed live) 🔵 built + RESIDUAL (needs a real external event / infra to verify live)
Test suite
531 ✓
472 baseline + 59 new, all green; zero test-theater (audited)
Asks delivered
14 / 14
across 4 parallel TDD workstreams, merged with 0 conflicts
Bugs found by QA → fixed
4 / 4
all re-verified live (dash + booking)

What was built the 14 asks

Every ask from your bug-fix-roud-3.md + the meeting transcript (incl. 4 transcript-only asks you hadn't written down: I11, I12, I13, I14). Full oracle: the EBO journeys page · Notion EBO.

#AskStatusEvidence / note
I1Lead de-dup matches only on exact email/phone, never website/company🟡Removed the name+domain fallbacks in find_crm_fuzzy; new strong seam test asserts a separate deal when only the website matches.
I3Reschedule/cancel emails use a "kattints ide" link; cancel link actually works🟢Anchor text not raw URL; new /cancel route live (returns 403 with a bad token = exists; was 404).
I4+I6Self-book disarms the booking-follow-up sequence + flushes scheduled emails; dim until day-before🟡Self-book path now reuses the manual-booking teardown; dim un-dims at 00:00 of the day before. Seam-tested.
I5Booking availability: weekday 08:30–18:30, 30-min slots, 15-min post-call buffer, gcal busy🟢🔵Window/grid LIVE (slots start 08:30, 30-min). Live gcal-busy + buffer time out → residual (see below).
I7Auto-record Google Meet when ≥2 people present🔵New app/transcription.py + 11 unit tests; decision = Fireflies notetaker bot (bot-free rejected on real criteria). Live wiring needs a Workspace Events subscription + a real Meet call.
I8Sales-call "done + duration" tag + transcript-status tag (loading/missing/done)🟡board_view emits the fields; dash renders both pills. Seam-tested; render code confirmed live.
I9Fresh lead triggers scraper + legal/CRM extraction → contract autofill🟡🔵Root cause fixed: the manual add-lead path now triggers enrichment. Full live E2E needs a real fresh lead.
I10Proposal → card moves to Sign-Follow-Up instantly (no ~1-min lag)🟡Optimistic move in pcFinalize() before the async write. Seam-tested.
I11Sign-Follow-Up card shows offer-validity + reminder-index ("N/M") tags🟡board_view emits offerValidUntil + reminderIdx; dash renders pills. Seam-tested.
I12+I13Payment sequence self-arms on both-signed; Stripe link pre-filled🟡🔵Self-arm is the ONLY sanctioned ARM-gate bypass; email#1 carries Stripe link + transfer details + exact amount; stops on payment; Stripe session prefilled. AUTOSEND is OFF in prod → email#1 DRAFTS for review (see decision below). Live needs a real Stripe charge.
I14DocuSeal auto-emails the signed PDF after both-signed🟡🔵Pull-and-send via the existing Missive path on both-signed; DOCUSEAL_AUTOSEND.md documents the alternative native setting. Live needs a real signing.
I2Contacted dim overlay renders fast (you deprioritized this)🟡Optimistic armed=true on the same render → no flash. Kept as the low-priority polish you flagged.

Bugs the end-to-end QA found — and fixed 4

A dedicated Opus agent drove the live merged build against the whole oracle. It found 3 bugs + I found 1 perf bug; all re-verified live.

BugWhat was wrongFixLive re-check
B2Live booking slots were 07:45/08:00 on a 15-min grid (the new 08:30/30-min code wasn't live)The booking page is a separate Modal app — deployed it🟢 08:30 start, 30-min grid
B3The new cancel link returned 404 live (same un-deployed booking app)Deployed the booking app🟢 /cancel → 403 (route exists)
B1/dash/api/thread returned HTTP 500 when a Missive thread couldn't be fetchedDegrade to an empty, flagged thread (TDD)🟢 HTTP 200 {unavailable:true}
B-perf/book/slots hung ~72s on a slow gcal freebusy — the booking page was unusableBound the whole availability lookup to 8s, fail open to the template (TDD)🟢 ~8.5s warm

Honest residuals — what still needs YOU 5

These are built + unit-tested, but their live verification needs a real external event or an infra/config step I won't fake-green or do autonomously.

ItemWhy it's residualYour step
I5 live busyThe matyas@clientsflow.hu freebusy is slow/unreliable (~72s) → bounded to 8s + fails open to the template, so live gcal busy-subtraction + the 15-min buffer don't apply yet. The hours/grid ARE correct live.Verify the calendar's domain-wide delegation / free-busy sharing so freebusy is fast + correct.
I12 sendThe payment sequence self-arms, but AUTOSEND is OFF in prod → email#1 drafts for review instead of firing. I did not flip a live switch autonomously.If you want it to truly auto-send on signing, flip AUTOSEND_ENABLED (one decision).
I7 MeetThe notetaker trigger module is built; the live path needs a Google Workspace Events push subscription + a real ≥2-person Meet call. Endpoint wiring deferred (the builder guessed a store API that doesn't exist here).Create the Workspace Events subscription; set the Fireflies bot name to "Note Taker". See TRANSCRIPTION_WIRING.md.
I9 / I14 liveEnrichment-on-fresh-lead and DocuSeal auto-email are code-complete + seam-tested; full live E2E needs a real new lead and a real both-signed event.Walk one real lead end-to-end when convenient.
UI rowsI8/I10/I11/I4 card states are render-confirmed live + strong-seam-tested, but full click-drive needs staged board fixtures via send/arm paths (safety-blocked for ZZ).Eyeball them on the board in the morning (a quick visual pass).

Ideas & steps captured — NOT yet built backlog

Beyond the 14 bug/feature asks, your meeting transcript + the gemini-processed notes + the parallel session (b3e1c1f8, which ended at a proposal you never picked from) contain softer ideas. None of these are built yet — they're the honest backlog so nothing is lost.

Idea / stepSourceWhat it isStatus
Categorization AI fine-tunegemini notes · Kocsy ("Előszűrő modell… fine tuning")The lead-classifier flags some positive leads as negative → mislabels lose real leads. Fine-tune it.⬜ not built — highest business risk
Board UX bundlegemini §3 · MattPer-column sort toggle ("last edited" / "closest deadline", column-local) + a "Move to" stage dropdown on every card + new leads pinned to top.⬜ not built
Cancellation success page polishgemini §3 · KocsyRebuild the cancel success screen: central checkmark + "Successful cancellation" + your phone & email, no forms, and log the cancel in touchpoint history.🟡 partial — round-3 made the cancel link WORK + a basic confirmation page; the polished screen + history-log remain
Hungarian name parsergemini §3 · MattInvisible lightweight AI step on ingestion that fixes the first-name / last-name mapping silently.⬜ not built
Proposal discount copytranscript ~L856A fixed promo line in the generated proposal: "order the development within 5 days → a mini CRM with auto e-mail notification, 100 000 Ft value, included". Editable in the proposal-gen prompt.⬜ not built
Copy-review workflow ("review the copies")transcript ~L1170–1174Review the auto-sent e-mail copies + the proposal copy once live, and SAVE the winning versions — via the Sablonok tab + the Eval-Lab / AI-Reliability-Trainer (human-gated promotion). A process, not a build.▶ do when live (tooling already exists)
Post-signing onboarding / data-intaketranscript ~L1102–1134After signing: show the proposed homepage + competitor analysis, let the client comment, then AI generates the rest of the pages per the agreed sitemap (the Sales-School sitemap step).⬜ future feature

How to live-test the app step by step

Open the dash with the token (a bare /dash 403s — that's why your earlier link "didn't work"). Use a test e-mail you control (e.g. your gergelykocsi20@…) — never a real client.

#TestDo thisExpect ✓
0Open the boarddash (with token)Board loads, all columns render, no error.
I5Booking windowOpen the booking pageSlots are weekday 08:30–18:30, 30-min, none before 08:30. (Page may take ~8s to load slots — bounded; live gcal busy-blocking is a residual, see above.)
I3E-mail links + cancelBook a slot as your test lead → open the confirmation/reschedule/cancel e-mails → click the cancel linkLinks read "kattints ide" (not a raw URL); the cancel link actually cancels + frees the slot.
I4+I6Self-book cleans upTest lead in Contacted with an armed sequence → book via the link → open the card historyCard moves to Booked, stays dimmed (until day-before), and the scheduled emails are GONE from history.
I10Instant column moveOn a Sales-Call card, generate the proposal + schedule emailsCard jumps to Sign-Follow-Up immediately (no ~1-min wait).
I8 / I11Card tagsLook at a sales-call card (after a call) and a sign-follow-up card"Sales call megvolt · N perc" + transcript-status tag; and "Ajánlat érvényes: …" + "Emlékeztető N/M".
I1De-dupSend 2 inbound mails from different emails + phones but the same websiteTwo SEPARATE cards (not merged onto one).
I12Payment on signingComplete a test DocuSeal both-signed (or wait for a real one)A payment e-mail drafts for review (AUTOSEND off) with the Stripe link + transfer details + exact amount; Stripe link has the email pre-filled.
I9 / I14Fresh-lead + signed PDFWalk one real fresh lead end-to-end; complete a real signingScraper + legal enrich → contract autofills; the signed PDF auto-emails.

How to review · accept · roll back

Live now (for your morning click-through):
• Dashboard: matyas--clientsflow-pipeline-web.modal.run/dash (build d5179c3+v096)
• Booking page: matyas--clientsflow-booking-web.modal.run
• EBO oracle (every expected behavior): journeys · Notion
To accept (your call — nothing is pushed): the work is on branch bnf-2026-06-24-r3/integration (21 commits on top of bnf-duo2/integration). Say the word and I'll merge it forward + push. Main stays your explicit trigger.
To roll back the live build: cp -r .tmp/snapshots/v095/app/* app/ then redeploy (or git checkout bnf-duo2/integration + redeploy). Full backup bundle in .tmp/backups/pre-merge-*/.