ClientsFlow Pipeline · autonomous bugfix/feature factory

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

Run bnf-2026-06-24-r3 · base bnf-duo2/integration · terminal state PENDING_REVIEW (nothing 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).

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-*/.