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)

  1. 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 json

    Pruefen: phone_number_id gesetzt, state.active=true, vertical bekannt, booking_backend bekannt, vertical-spezifische Felder gefuellt (bei hairdresser: calcom.team_slug, calcom.staff[], calcom.event_type_default_service).

  2. mcp-whatsapp /health → 200

    curl -sS https://mcp-whatsapp.agenticventures.de/health
    # Erwartet: {"ok":true,"service":"mcp-whatsapp"}
  3. mcp-calcom /health → 200

    curl -sS https://mcp-calcom.agenticventures.de/health
    # Erwartet: {"ok":true} oder analog
  4. WhatsApp Access Token gueltig Statt direkten Meta-API-Call (braucht Token-Sichtbarkeit, Sanitization-Risiko): pruefe CloudWatch-Logs der letzten 7 Tage auf 401 Unauthorized von 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 -5

    Wenn Hits in den letzten 24h: [FAIL] Token vermutlich expired → Skill /whatsapp-token-rotate triggern.

  5. 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 -3

    Wenn 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:

  1. Webhook msg from=<marvin_phone> type=text preview='<text>' (mcp-whatsapp)
  2. Webhook stored 1 message(s) (DDB-Insert in mcp-whatsapp-inbox)
  3. brain invocation: 1 records (Brain-Lambda Stream-Trigger)
  4. CF Access service token loaded (Cold-Start) oder direkt zu (5) bei Warm
  5. Brain-Tool-Loop: list_services / list_slots (bei Termin-Frage) oder send_text (bei „Hi”)
  6. POST graph.facebook.com/v23.0/<id>/messages "HTTP/1.1 200 OK" (Outbound erfolgreich)
  7. 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:

  1. Webhook msg from=<marvin_phone> type=interactive mit button_reply.id=book|...
  2. Brain → book_appointment Tool-Call
  3. POST mcp-calcom .../create_booking → 200
  4. Cal.com Booking-UID im Brain-Log + receptionist-events Insert
  5. send_text Bestaetigung 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-identity returnt 425924867359)
  • Marvin hat sein Handy in der Hand
  • receptionist-customers DDB-Table existiert
  • mcp-whatsapp und mcp-calcom ECS-Services sind Running

Bei FAILURE — Fix-Pfade

Failure-SymptomWahrscheinlicher GrundFix-Hint
Vor-Check 4 hat 401-HitsWhatsApp-Token expired/whatsapp-token-rotate triggern
Vor-Check 5 leerBrain-Lambda noch nie gelaufen ODER Stream-Trigger kaputtDDB-Stream-Setup auf mcp-whatsapp-inbox pruefen
Webhook kommt nicht in LogsMeta-Webhook-Config kaputt ODER HMAC-Verify schlaegtmcp-whatsapp-Logs auf Webhook-Verify-Errors
Brain triggered aber kein Tool-CallSystem-Prompt-Bug ODER Stream-Event-Format unbekanntBrain-Logs lesen, Tool-Loop-Iteration-Count pruefen
Tool-Call schlaegt mit 401 fehlCF Access Service-Token revoked oder Secret-Wert kaputtService-Token rotaten via Cloudflare-MCP
Cal.com create_booking schlaegtCal.com API-Key falsch / event_type_id ungueltigmcp-calcom-Secret + DDB-Customer-Config pruefen
Outbound 401 von MetaWieder 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.