KINDLE HOME

Pulse: come due nomi uguali diventano una cosa sola

Il design che unifica log e notifiche su Pulse, e la collisione di nomi che lo ha quasi bloccato.

Per quasi cinque mesi, nel brain di Giobi, "Pulse" ha significato due cose diverse senza che nessuno se ne accorgesse. Il 22 maggio una sessione aveva costruito una skill di amministrazione per leggere il feedback delle sessioni ABChat — pollici su e giù, pain point, panoramiche — e l'aveva chiamata "Village Pulse", prendendo in prestito la metafora del battito vitale per descrivere la salute d'uso della piattaforma. Mesi dopo, un'altra sessione, lavorando sull'infrastruttura di monitoraggio, aveva bisogno di una tabella in cui far atterrare ogni evento — un monitor che va giù, un errore applicativo, un alert di carico — e aveva scelto lo stesso nome, per la stessa ragione intuitiva: anche quello era, in un certo senso, il battito del sistema. Nessuna delle due sessioni sapeva dell'altra.

La collisione è rimasta invisibile finché Giobi non si è trovato bloccato a metà frase, mentre cercava di spiegare cosa voleva costruire: un hub di notifiche centralizzato. "Pulse può essere il sistema di notifica oltre che quello di ingest", ha scritto, "ma va rivista la skill". Il blocco non era indecisione sul design — era che la parola giusta puntava già altrove.

Cosa diventa Pulse

La tabella pulse, che vive su Postgres dentro one.giobi.com, è già il posto in cui scrivono quasi tutti i sistemi di Giobi: i webhook di Kuma, GlitchTip e Beszel quando qualcosa cambia stato; il router che logga ogni invio Discord e Telegram tentato da efesto o da n8n; la funzione village.notifica() che da otto script di infrastruttura manda i suoi alert sia su abchat sia, in copia, su Pulse. Decidere che "Pulse" significa solo questo — il registro unico di tutto ciò che succede — non è stata una scelta tra due opzioni equivalenti. La tabella era già citata in una dozzina di file del codice di produzione; la skill di audit ABChat, per quanto utile, era un singolo strumento amministrativo usato di rado. Spostare il nome più pesante avrebbe voluto dire toccare controller, modelli, migrazioni. Spostare il più leggero significava rinominare una cartella. La skill vecchia trasloca sotto /abchat audit, come sottocomando di una skill che già esiste, e il nome "Pulse" si libera per il significato nuovo.

La scoperta che ha cambiato il piano

Prima di arrivare al design vero e proprio, un inventario delle fonti di notifica ha trovato qualcosa che nessuno aveva previsto. Uptime Kuma, il monitor che tiene d'occhio i siti e i server di Giobi, ha cinque canali di notifica configurati, e quattro di questi sono marcati come predefiniti — il che significa che ogni volta che un monitor cambia stato, tutti e quattro sparano insieme. Due di questi canali sono puliti: uno manda un webhook verso Pulse, l'altro verso un workflow n8n già messo sotto controllo nei giorni precedenti. Gli altri due, però, sono nativi: un webhook Discord e un bot Telegram configurati direttamente dentro Kuma stesso, che parlano con Discord e Telegram senza passare da nessuno script, da nessun wrapper Python, da nessuna riga di Pulse. Tutto il lavoro di redirect fatto nei giorni precedenti — mettere in pausa gli invii diretti da efesto, far passare tutto da un unico punto di log — non aveva mai toccato questi due canali. Probabilmente è proprio per questo che a Giobi, dopo aver messo tutto in redirect, non è sembrato cambiare granché nel volume di notifiche che riceveva: la fonte più rumorosa, gli alert di uptime, aveva una strada tutta sua che nessuno aveva mai chiuso.

La decisione, una volta trovato il problema, è stata diretta: se Pulse deve essere l'aggregatore unico, i due canali nativi di Kuma vanno disattivati, lasciando solo la strada che passa da Pulse. Fatto lo stesso giorno, verificato interrogando direttamente il database di Kuma.

Come si legge, non solo come si scrive

La seconda metà del problema non era la scrittura ma la lettura. Una tabella che accumula migliaia di righe al giorno non è utile se l'unico modo di guardarla è una lista cronologica con un filtro alla volta — esattamente quello che era stato costruito due giorni prima, in fretta, per rispondere a un "non vedo nessuna notifica stamattina". Giobi ha chiesto qualcosa di più vicino a quello che ci si aspetterebbe da un sistema di notifiche nel duemilaventisei: priorità, aree, tag, criticità come filtri che si combinano, non uno alla volta.

La risposta non è stato un sistema nuovo, ma il riuso di un pattern già esistente altrove nel suo stesso ecosistema: le "lenti" già in uso sull'archivio documentale di GR WorkTech e sui trascritti vocali di Verbatim. Una lente è una domanda salvata nel codice, raggiunta da un parametro nell'URL: non una cartella, che costringe ogni riga ad avere una sola casa, e non un'etichetta, che ha bisogno di qualcuno che tenga il vocabolario aggiornato. È una query con un nome, un colore che dipende dal tipo di domanda che pone — blu per lo stato di una riga, rosso per un allarme, marrone per l'argomento — e una frase che spiega, quando la lente è attiva, cosa contiene e cosa la distingue dalla lente vicina.

Nel grill che ha preceduto la sintesi, due assi che sembravano nuovi si sono rivelati già presenti sotto altro nome. La priorità che Giobi immaginava come qualcosa da calcolare apposta è risultata essere esattamente la severità che Pulse già registra per ogni riga, solo raccontata con parole più umane: critico diventa "ora", alto diventa "presto", il resto diventa "quando capita". Lo stato di lettura — vista, archiviata — è risultato essere lo stesso campo che già decide se un alert infrastrutturale è ancora aperto o è stato risolto, semplicemente riletto con un'etichetta diversa per un pubblico diverso. Nessuna nuova colonna, nessun secondo sistema di classificazione da tenere sincronizzato con il primo.

Cosa resta aperto

Non tutto si è chiuso nella stessa sessione. Lo snooze — nascondere una notifica per un po', in modo diverso dall'archiviarla per sempre — è stato nominato e poi rimandato: Giobi ha scelto la soluzione più semplice per ora, e l'idea di un terzo stato resta annotata per quando', se mai, diventerà un attrito reale invece che un'ipotesi. E l'inventario dei canali nativi, quello che ha trovato Kuma a sorpresa, non è stato chiuso del tutto: GlitchTip e Beszel parlano già bene con Pulse tramite i loro webhook, ma le loro interfacce di amministrazione non sono state controllate con la stessa cura riservata a Kuma, perché i loro container, più minimali, hanno reso l'ispezione rapida più difficile. È il tipo di controllo che vale dieci minuti prima di dichiarare l'audit davvero chiuso.

- FINE -
1