Prerequisiti (Fase 0)
Contratto firmato + primo pagamento
sub_...) sul price previsto dal contratto, customer collegato all’email del cliente. Verifica su Stripe dashboard e salva sub_id + price_id.Account Mattone piattaforma
app.mattone.co con tools_access corretto. Se ci sono collaboratori (collab1@, collab2@), stessa cosa.Notion — inviti + template
House Manuals ITA/ENG o equivalente). Se il cliente ha un template proprio, preparati alla patch canonical (§ Troubleshooting).Krossbooking creds valide
error, sblocca prima di procedere (senza Kross non ci sono listings su Conduit).Setup piattaforma Mattone
1. Allowlist KB Bridge (BETA)
src/lib/access.ts → BETA_EMAILS. Un commento sopra la riga con: data, contratto, workspace Conduit, apts, sub Stripe.
Branch feat/beta-<nome>, PR, merge, deploy 1-2 min.2. Row conduit_workspace_config
conduit_workspace_config con: workspace_id, workspace_name, workspace_slug, student_id, plan_limit_usd, alert_threshold_pct, billing_mode: partner_markup, notes con contesto.3. Verifica Notion connesso
pms_integrations deve avere una riga provider='notion' con status='connected' per lo student_id.Setup Conduit (workspace + tools + agent)
4. Workspace Conduit
workspace_id (x1...) via GET /v1/workspaces.5. 6 Custom Tools Krossbooking
hostmanager-provision.mjs (o clone per cliente): crea 6 tool via POST /v1/custom-tools con enable_globally=true così tutti gli agent del workspace li vedono.
Tools: check-availability, check-portal-status, get-checkin-instructions, get-reservation-status, get-in-house-guests, get-incomplete-portals.
6. Guest Agent config
operation_mode: copilot, enabled: true, response_language: Original (l’agente risponde nella lingua dell’ospite), 21+ guardrails standard (identità host, no in-persona, no sconti, ecc.) più il guardrail «Note escalation sempre in italiano», trigger Guest inbox messages.
Attacca le 3 skill standard (skill_ids). Se il cliente ha upsell/late-checkin autonomo, attacca anche payment-link-generator.7. francesco@mattone.co admin sul workspace
Sync listings + mapping registry
- Strada A — KB per-listing: Il cliente ha listings sincronizzati su Conduit (via connector Airbnb/Booking o già presenti manualmente). Si popola
apartment_registryconconduit_listing_id, la KB Bridge scopa le note per listing (isolamento perfetto tra apt). Segui gli step 8-13 come scritti. - Strada B — Custom tools only (workspace senza listings): Il cliente ha 0 listings su Conduit e la strategia è 6 custom tools Kross + skill abbinate (regola d’oro Mattone, vedi Custom Tools). L’agent risponde live via API Kross per domande dinamiche (disponibilità, portale, in-house guests). La KB statica (WiFi/regole/come raggiungere) è opzionale e, se serve, si carica manualmente su Conduit come directory globali — saltare step 8-13, andare direttamente al § “Canali + finalizzazione”.
GET /v1/listings?workspace_id=X restituisce >0 listings → Strada A; restituisce 0 e non è colpa di Kross auth → Strada B.8. Verifica listings sync
GET /v1/listings?workspace_id=X deve tornare N listings = N appartamenti attivi Kross. Se 0 → Kross auth failed o partner non collegato. Sblocca prima.9. Popola apartment_registry
apartment_registry con: student_id, notion_page_id, conduit_listing_id, krossbooking_room_type_id, name.
KB Bridge (Notion → Conduit)
10. Dry-run preview
POST /api/conduit/sync-knowledge con {commit: false}, cookie auth del cliente. Aspettati:apartments: N(= listings attivi)unresolvedApartments: 0(se non 0 → registry non completo)incompleteTemplates: 0(se > 0 → vedi § Troubleshooting)
11. Fix template validation (se serve)
12. Commit finale
POST /api/conduit/sync-knowledge con {commit: true} (--max-time 800). Aspettati:created: N * ~30-40(nodi totali)failed: 0,blockedByTemplate: 0directoriesCreated: N(una per listing)
13. Verifica su Conduit
GET /v1/kb/nodes?workspace_id=X&listing_id=Y&parent_id=<Mattone KB Sync folder> deve mostrare le note per-apt. Cerca almeno il nodo [<Apt>] Wi-Fi (rete + password).Canali + finalizzazione
14. Numero WhatsApp italiano
15. Numero voce (se applicabile)
16. Onboarding message al cliente
17. Registra il consumo baseline
conduit_usage_snapshots (il cron lo aggiorna ogni 6h).Troubleshooting
Kross auth failed dopo cambio password
Sintomo:pms_integrations.status = 'error' per provider krossbooking.
Fix: chiedi al cliente le nuove creds. Aggiorna la riga via PUT /api/admin/kross/connect. Il sync listings riparte in automatico. Senza questo il KB Bridge segna unresolvedApartments: N.
Template Notion non canonico
Sintomo:incompleteTemplates: N, ogni apt manca Wi-Fi + Orari + Come raggiungere + Regole + Prima di partire.
Fix in ordine:
- Recupera le credenziali WiFi dal materiale che il cliente ci ha già dato, o chiedigliele.
- Append 23 blocchi canonical sul Notion (heading_2 + paragraphs) tramite
PATCH /v1/blocks/{page_id}/children. Lo script di fill canonical è nel repo interno. - Se il validator continua a leggere il vecchio blocco WiFi (paragrafo
🛜 WI-FI) prima del nuovo, patch il titolo del toggle WiFi originale per includereRete: X — Password: Y. - Se un callout child del toggle contiene “wifi”/“internet”, il matcher lo prende come sub-section e fallisce. Riformula il testo per rimuovere quelle parole.
- Se il primo toggle si chiama “Modem - X” e i suoi children contengono “wifi” nel testo, rinomina il toggle rimuovendo “wifi” (es.
Router X) così il matcher passa al toggle successivo (quello patchato correttamente).
KB Bridge 504 timeout
Sintomo: la route va in timeout esatto a 300s per workspace medio-grandi. Fix:maxDuration = 800 in src/app/api/conduit/sync-knowledge/route.ts. Deploy via PR (già mergiata 2026-08-24).
Copilot non suggerisce niente (“Listing unavailable in Conduit”)
Sintomo: config agent tutta verde ma i suggerimenti restano vuoti. Root cause tipica: apts Airbnb non mappati al listing corretto (registry buco). Fix: verificaapartment_registry.conduit_listing_id per ogni apt che dovrebbe rispondere.
Ticket Conduit “parameters[].description Required”
Sintomo: creazione custom tool fallisce con Zod validation. Fix: aggiungidescription: string per ogni parametro. Se usi la route Mattone, il catalog li genera; se chiami direttamente Conduit API, aggiungi description auto-generate nel payload (vedi lo script di provisioning nel repo interno).
Cliente Strada B — setup rapido
Sintomo/scenario: cliente con workspace Conduit già configurato (agent, skill) ma 0 custom tools Kross e 0 listings su Conduit. Fix (~10 min end-to-end):- Row
conduit_workspace_configsu Supabase (mapping ws → student) — vedi step 2 della procedura. - Aggiungi email cliente a
BETA_EMAILS(branch → PR → merge). Non serve se non useremo mai KB Bridge; utile per abilitare il tool in futuro. - Provisiona i 6 custom tools Kross con
enable_globally=true— clona lo script di provisioning dal repo interno e sostituisciWS,AGENT_ID,STUDENT(ilSTUDENTè l’iddella rigapms_integrationsdi providerkrossbookingdel cliente, NON lostudent_id). - Verifica skill esistenti sull’agent Guest — se mancano
booking-extension-assistant,check-in-access-manager,reservation-status-verification-procedure(le 3 skill minime che coprono gran parte dei tool Kross, uguali per ogni cliente), aggiungile. - Test: apri conversazione test → chiedi “sei disponibile dal 15 al 20 novembre?” → l’agent deve chiamare
check-availability(visibile nei log Conduit).
apartment_registry né lanciare KB Bridge. La KB statica (WiFi/regole) resta nel dominio del cliente: se decide di caricarla, lo fa manualmente o via Notion bridge quando disponibile.