Receptionist-Smoke
End-to-End-Test fuer einen receptionist-Customer. Erste Bauversion fuer den Friseur-Live-Test am 2026-05-19. Wiederverwendbar fuer jeden neuen Customer + nach Stack-Deploys + nach Token-Rotationen.
Wann triggert der Skill
- „smoke den friseur”
- „check ob friseur-bot laeuft”
- „receptionist-smoke friseur-im-sueden”
- „teste den brain fuer
” - „ist der bot online?”
- „demo den salon-bot”
- „pre-flight-check vor go-live”
Was der Skill liefert
Schritt-fuer-schritt Report mit konkretem [OK] / [FAIL] pro Check + bei Fail: warum + Fix-Vorschlag. Bei Live-Tail: WhatsApp-Inbound → Brain-Trigger → Tool-Calls → Outbound → Cal.com-Booking als Sequenz mit Zeitstempeln. Outcome am Ende: SMOKE PASSED oder SMOKE FAILED at step <X>: <reason>.
Inputs
Pflicht: customer_slug (z.B. friseur-im-sueden).
Optional: marvin_phone (Default +4915128945607).
Wenn unklar welcher Slug: liste verfuegbare Customers aus DDB-Table receptionist-customers und frag Marvin welchen.
Ablauf
Phase 1 — Vor-Pruefungen (alle parallel, ~5 Sek)
-
Customer-Config in DDB existiert + state.active=true
aws --profile av-production --region eu-central-1 dynamodb scan \ --table-name receptionist-customers \ --filter-expression "customer_slug = :s" \ --expression-attribute-values '{":s":{"S":"<slug>"}}' \ --output jsonPruefen:
phone_number_idgesetzt,state.active=true,verticalbekannt,booking_backendbekannt, vertical-spezifische Felder gefuellt (beihairdresser:calcom.team_slug,calcom.staff[],calcom.event_type_default_service). -
mcp-whatsapp /health → 200
curl -sS https://mcp-whatsapp.agenticventures.de/health # Erwartet: {"ok":true,"service":"mcp-whatsapp"} -
mcp-calcom /health → 200
curl -sS https://mcp-calcom.agenticventures.de/health # Erwartet: {"ok":true} oder analog -
WhatsApp Access Token gueltig Statt direkten Meta-API-Call (braucht Token-Sichtbarkeit, Sanitization-Risiko): pruefe CloudWatch-Logs der letzten 7 Tage auf
401 Unauthorizedvon graph.facebook.com:aws --profile av-production --region eu-central-1 logs tail \ /aws/ecs/default/mcp-whatsapp-hosted --since 7d \ --filter-pattern '"401 Unauthorized"' 2>&1 | tail -5Wenn Hits in den letzten 24h:
[FAIL] Token vermutlich expired → Skill /whatsapp-token-rotate triggern. -
Brain-Lambda hat CF Access Service-Token im letzten Run geladen
aws --profile av-production --region eu-central-1 logs tail \ /aws/lambda/receptionist-brain --since 7d \ --filter-pattern '"CF Access service token loaded"' 2>&1 | tail -3Wenn leer:
[WARN] Brain wurde seit 7d nicht getriggert oder Secret-Loading scheitert.
Phase 2 — Live-Tail vorbereiten
Vor dem Test bei Marvin nachfragen ob bereit zum WhatsApp-Senden. Beispiel-Test-Texte vorschlagen die in 24h-Service-Window funktionieren:
- „Hi” (einfachste Inbound, triggert Service-Window)
- „Termin morgen Nachmittag?” (loest list_slots + Buttons aus)
- „Termin am Mittwoch um 14 Uhr fuer Damen-Schnitt bei Anja” (kompletter Flow inkl. create_booking)
Marvin bestaetigt → starte parallel-Tail via Monitor-Tool:
# Stream 1: mcp-whatsapp inbound webhooks
aws --profile av-production --region eu-central-1 logs tail \
/aws/ecs/default/mcp-whatsapp-hosted --since 30s --follow \
--filter-pattern '"Webhook" "POST /webhook" "Webhook msg" "Webhook stored"'
# Stream 2: Brain-Lambda invocations + tool-calls + outbound
aws --profile av-production --region eu-central-1 logs tail \
/aws/lambda/receptionist-brain --since 30s --follow \
--filter-pattern 'brain "tool" "send_text" "send_interactive" "book_appointment" "ERROR" "WARN"'
# Stream 3: outbound to graph.facebook.com (status + errors)
aws --profile av-production --region eu-central-1 logs tail \
/aws/ecs/default/mcp-whatsapp-hosted --since 30s --follow \
--filter-pattern '"graph.facebook.com" "401" "200"'Streams in einem Monitor-Tool buendeln mit --line-buffered damit Events sofort kommen.
Phase 3 — Outcome korrelieren
Erwartete Sequenz innerhalb 10 Sek nach Marvin-Send:
Webhook msg from=<marvin_phone> type=text preview='<text>'(mcp-whatsapp)Webhook stored 1 message(s)(DDB-Insert in mcp-whatsapp-inbox)brain invocation: 1 records(Brain-Lambda Stream-Trigger)CF Access service token loaded(Cold-Start) oder direkt zu (5) bei Warm- Brain-Tool-Loop:
list_services/list_slots(bei Termin-Frage) odersend_text(bei „Hi”) POST graph.facebook.com/v23.0/<id>/messages "HTTP/1.1 200 OK"(Outbound erfolgreich)- Bei Termin-Frage:
mark_processed+ Marvin sieht Slot-Buttons auf seinem Handy
Wenn an irgendeiner Stelle Lueck oder ERROR: report SMOKE FAILED at step <N>: <log-snippet> + Fix-Vorschlag.
Phase 4 — Bei Klick auf Slot-Button (optional, wenn Smoke Termin-Frage)
Marvin klickt → erwartete Folge-Sequenz:
Webhook msg from=<marvin_phone> type=interactivemitbutton_reply.id=book|...- Brain →
book_appointmentTool-Call POST mcp-calcom .../create_booking→ 200- Cal.com Booking-UID im Brain-Log + receptionist-events Insert
send_textBestaetigung an Marvin
Bei Erfolg: Booking-UID + Cal.com-URL ausgeben. Skill kann fragen ob Booking gleich gecancelt werden soll (Cleanup im Test-Account).
Pre-conditions (vor Run pruefen)
- AWS-CLI ist auf av-production-Profile authentifiziert (
aws sts get-caller-identityreturnt 425924867359) - Marvin hat sein Handy in der Hand
receptionist-customersDDB-Table existiertmcp-whatsappundmcp-calcomECS-Services sind Running
Bei FAILURE — Fix-Pfade
| Failure-Symptom | Wahrscheinlicher Grund | Fix-Hint |
|---|---|---|
| Vor-Check 4 hat 401-Hits | WhatsApp-Token expired | /whatsapp-token-rotate triggern |
| Vor-Check 5 leer | Brain-Lambda noch nie gelaufen ODER Stream-Trigger kaputt | DDB-Stream-Setup auf mcp-whatsapp-inbox pruefen |
| Webhook kommt nicht in Logs | Meta-Webhook-Config kaputt ODER HMAC-Verify schlaegt | mcp-whatsapp-Logs auf Webhook-Verify-Errors |
| Brain triggered aber kein Tool-Call | System-Prompt-Bug ODER Stream-Event-Format unbekannt | Brain-Logs lesen, Tool-Loop-Iteration-Count pruefen |
| Tool-Call schlaegt mit 401 fehl | CF Access Service-Token revoked oder Secret-Wert kaputt | Service-Token rotaten via Cloudflare-MCP |
| Cal.com create_booking schlaegt | Cal.com API-Key falsch / event_type_id ungueltig | mcp-calcom-Secret + DDB-Customer-Config pruefen |
| Outbound 401 von Meta | Wieder Token-Expired (Smoke gerade rotiert) | /whatsapp-token-rotate |
Output-Format
[receptionist-smoke · friseur-im-sueden · 2026-MM-DDTHH:MM]
Vor-Checks:
[OK] Customer-Config in DDB (vertical=hairdresser, active=true, 1 staff)
[OK] mcp-whatsapp /health 200
[OK] mcp-calcom /health 200
[OK] WhatsApp Token: keine 401s in 24h
[OK] Brain Service-Token: zuletzt geladen 2026-MM-DD HH:MM
Live-Tail aktiv. Marvin: schick jetzt 'Termin morgen Nachmittag?' an +49-<friseur-number>.
[HH:MM:SS] Webhook msg from=4915128945607 type=text preview='Termin morgen Nachmittag?'
[HH:MM:SS] Webhook stored 1 message(s)
[HH:MM:SS] brain invocation: 1 records
[HH:MM:SS] Tool-Call: list_slots(event_type_id=5684152, ...)
[HH:MM:SS] Tool-Call: send_interactive_buttons(...)
[HH:MM:SS] POST graph.facebook.com/.../messages 200
Bot-Antwort auf Marvins Handy: 3 Slot-Buttons.
SMOKE PASSED. (Klick einen Button um book_appointment-Flow zu testen.)Run-Logging
Bei Erstlauf oder bei Failure: Run-Doku nach intern/runs/<datum>-receptionist-smoke-<slug>/_index.md schreiben mit Frontmatter + komplettem Log + Outcome. Bei Re-Runs eines bereits funktionierenden Setups: kein Run-Doku noetig, nur Stdout-Report.
Hinweis
Skill triggert KEINE Inbound-WA — Marvin sendet selbst. Begruendung: WhatsApp-Send durch den Bot an sich selbst zaehlt nicht als 24h-Window-Eroeffnung, plus Smoke soll echte Bedingungen reflektieren.
Related
- receptionist — Plattform-Capability
- whatsapp + calcom — Tool-Backends
- SKILL — Skill der bei Vor-Check-Failure 4 ausgeloest wird
- _index — Customer 1, Erstlauf-Use-Case