ClientsFlow Pipeline · autonomous bugfix/feature factory
Run bnf-2026-06-24-r3 · base bnf-duo2/integration · terminal state PENDING_REVIEW (nothing pushed) · 2026-06-24
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.
| # | Ask | Status | Evidence / note |
|---|---|---|---|
| I1 | Lead 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. |
| I3 | Reschedule/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+I6 | Self-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. |
| I5 | Booking 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). |
| I7 | Auto-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. |
| I8 | Sales-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. |
| I9 | Fresh 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. |
| I10 | Proposal → card moves to Sign-Follow-Up instantly (no ~1-min lag) | 🟡 | Optimistic move in pcFinalize() before the async write. Seam-tested. |
| I11 | Sign-Follow-Up card shows offer-validity + reminder-index ("N/M") tags | 🟡 | board_view emits offerValidUntil + reminderIdx; dash renders pills. Seam-tested. |
| I12+I13 | Payment 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. |
| I14 | DocuSeal 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. |
| I2 | Contacted dim overlay renders fast (you deprioritized this) | 🟡 | Optimistic armed=true on the same render → no flash. Kept as the low-priority polish you flagged. |
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.
| Bug | What was wrong | Fix | Live re-check |
|---|---|---|---|
| B2 | Live 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 |
| B3 | The 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 fetched | Degrade 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 unusable | Bound the whole availability lookup to 8s, fail open to the template (TDD) | 🟢 ~8.5s warm |
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.
| Item | Why it's residual | Your step |
|---|---|---|
| I5 live busy | The 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 send | The 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 Meet | The 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 live | Enrichment-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 rows | I8/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). |
d5179c3+v096)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.cp -r .tmp/snapshots/v095/app/* app/ then redeploy (or git checkout bnf-duo2/integration + redeploy). Full backup bundle in .tmp/backups/pre-merge-*/.