---
title: "CVing: candidarsi a un lavoro su WhatsApp, con la sicurezza dentro ogni azione dell'agente."
url: "https://simonebova.com/it/runs/cving"
lang: "it"
author: Simone Bova
alternates:
  it: "https://simonebova.com/md/it/runs/cving"
  en: "https://simonebova.com/md/en/runs/cving"
  pl: "https://simonebova.com/md/pl/runs/cving"
---

# CVing: candidarsi a un lavoro su WhatsApp, con la sicurezza dentro ogni azione dell'agente.

Un agente WhatsApp che porta una candidatura dall'annuncio all'invio. Perché le regole di sicurezza vanno nel codice, e cosa insegna un incidente in produzione.

Name: CVing

Terrain: Scaleup · HR tech

When: 2026

Role: Architetto e sviluppatore, dalla discovery alla produzione

| Fact | Value |
| --- | --- |
| Terreno | HR tech |
| Canale | WhatsApp |
| Deploy | Cloud del cliente |
| Sicurezza | Dentro ogni azione |

## La situazione

CVing è una scaleup HR tech di Milano. Voleva che una persona potesse candidarsi a un'offerta interamente su WhatsApp: tocca «Candidati via WhatsApp» nell'annuncio, risponde a qualche domanda, verifica la sua email, manda il CV e la candidatura parte. In pratica un modello che parla con chiunque, maneggia dati personali e scrive su un database di produzione. Ho seguito il progetto dalla discovery fino alla produzione sul cloud del cliente.

## Cosa ho fatto

La prima decisione è stata togliere di mezzo la piattaforma conversazionale prevista dal piano iniziale. Quello che contava per CVing, cioè sapere sempre chi sta scrivendo, in che ordine si salvano i dati e come si recupera un errore, stava dietro astrazioni che non controllavo. Ho scritto un orchestratore su misura.

La seconda è stata trattare il prompt come la descrizione di un comportamento e il codice come il posto delle regole. Ogni azione che l'agente può compiere controlla da sola di avere la prova che le serve, qualunque cosa dica il modello. Poi è arrivato il primo incidente in produzione, e le due settimane successive le ho passate a chiudere ogni buco che aveva mostrato.

## Cosa è cambiato

Durante l'incidente alcuni candidati erano rimasti bloccati alla verifica dell'email: l'assistente diceva di controllare la casella e nessuna email partiva. L'ho chiuso con una serie di correzioni, e quasi ognuna ha tolto al modello una decisione che non doveva prendere. Il sistema gira in produzione sul cloud di CVing, e un'azione delicata non dipende più dal fatto che il modello abbia capito bene.

## Cosa ho imparato

Una delle azioni dell'agente collegava un'email esistente al numero WhatsApp di chi scriveva. Sulla carta era manutenzione dell'account. Nei fatti apriva l'accesso a quell'account, e a fermare un modello troppo disponibile o un messaggio scritto apposta c'era solo il prompt. Il nome dell'azione diceva a cosa serviva, e nascondeva quello che permetteva di vedere e di fare. Oggi quell'azione parte solo se la persona ha appena dimostrato di possedere quella stessa email, e in ogni agente che progetto classifico le azioni per l'accesso che concedono.

Nel primo incidente in produzione il codice di verifica scadeva mentre la conversazione raccoglieva gli altri dati. Il sistema di CVing lo rifiutava, il nostro lo credeva ancora valido, e l'assistente diceva al candidato di controllare una casella in cui non arrivava niente. Su un sito il login viene prima di tutto. In una conversazione ogni domanda che arriva dopo consuma il tempo della verifica. Da allora chiedo il codice per ultimo, subito prima dell'invio, e quando il sistema a valle dice di no, il nostro gli crede.

Il prompt chiedeva al modello di riconoscere un codice di verifica dalla forma, e in produzione un nome con delle cifre dentro poteva passare per un codice. Avevamo affidato al giudizio del modello una regola che un controllo di due righe applica sempre allo stesso modo. Il fatto che capisse bene la conversazione lo faceva sembrare capace anche di validare un dato. Oggi rileggo ogni prompt cercando le frasi che chiedono al modello di decidere se un dato è valido, e le sposto nel codice. Su CVing lo stesso controllo rifiuta anche i nomi impossibili.

Il link dell'annuncio porta con sé l'offerta a cui la persona si candida, e arriva nel primo messaggio. In una candidatura lunga quel messaggio usciva dalla memoria del modello, che a quel punto poteva inventarsi l'offerta. Dare al modello più memoria spostava solo il problema più in là, fino alla prossima conversazione abbastanza lunga. Oggi l'offerta viene salvata appena la conversazione inizia e conta più di qualunque cosa il modello ricordi. Da allora tratto così ogni dato che decide dove arriva un'azione.

*// nessuna cifra di conversione qui: non ne ho una misurata.*

[Runs](https://simonebova.com/md/it/runs)

[simone@yempik.ai](mailto:simone@yempik.ai) · [Book a call](https://calendar.app.google/LKDrQPKGV2EAFCMN9)
