Bug: Money concern after booking is being handled as “too busy” (POST_BOOKING_SOFT_NO) Scenario reproducer Conversation: stage 12, appointment already booked (status active, appointment_status = BOOKED). Customer replies: "I'm not sure I can afford to change at the moment". /api/lia/inbound returns: mode: "POST_BOOKING_SOFT_NO" Reply text about “things can get busy” and keeping the slot. Expected behaviour This is clearly a T5 money concern, not a time/busyness soft-no. For post-booking money concerns we want: A money-aware mode, e.g. T5_MONEY_CONCERN_FIRST_POST_BOOKING or reuse T5_MONEY_CONCERN_FIRST but tagged as post-booking in last_reply_type. status: "active" appointment_status: "BOOKED" (keep the slot by default). Reply content: Acknowledge the concern (“totally understand, things are expensive right now”). Reframe the visit as fact-finding only – no pressure, might be best to leave the agreement as-is. Optionally offer a phone-call alternative (aligned with T5 second-stage behaviour). Implementation sketch In lia_ure.py, add a helper: is_money_concern(text: str) -> bool Match phrases like: can't afford, cannot afford, too expensive, payments too high, money's tight, budget is tight, worried about cost, etc. In the post-booking branch (where appointment_status = BOOKED and last_reply_type is appointment-related), evaluate in this order: If is_money_concern(text) → go down the T5 money path: mode = "T5_MONEY_CONCERN_FIRST_POST_BOOKING" Use a money template that: Reassures Frames the appointment as exploratory Mentions that doing nothing might be the best option Keep appointment_status = BOOKED. Else if is_post_booking_soft_no(text) (busy / not right now / too much on) → current POST_BOOKING_SOFT_NO behaviour is fine. Else fall back to general engagement / clarification / escalation as today. Tests to add Test 1 – money concern, booked Customer: “I’m not sure I can afford to change at the moment” Expect: mode = "T5_MONEY_CONCERN_FIRST_POST_BOOKING" (or equivalent) appointment_status still "BOOKED" Reply text acknowledges money, not busyness. Test 2 – “too busy” Customer: “Not right now thanks, too busy with work” Expect: mode = "POST_BOOKING_SOFT_NO" Reply about things being busy, slot still in diary – current behaviour is fine. Test 3 – guard Cold inbound: “I can’t really afford to change right now” (no appointment yet) Expect: T5 money path (not POST_BOOKING_SOFT_NO, not AWAITING_MANAGER). Goal is: money concerns always use T5 logic, even after a booking, and only true time/busyness soft-nos use POST_BOOKING_SOFT_NO.