La Notte del Benchmark 300 - UNDO!UNDO!UNDO!

Questo non è solo il racconto di un bug tecnico, ma la storia di come un umano e un’AI possono lavorare insieme, sbagliare, fare UNDO e trasformare un problema in un metodo condiviso.

Indice


Contesto

23:00, 20 dicembre 2025. Puck arriva con un bug encoding UTF-8 che sta bloccando il deploy di GitHub Pages. L’obiettivo iniziale: fix veloce, 30 minuti max.

4 ore e 42 minuti dopo, alle 03:42 del 21 dicembre, abbiamo:

  • Ristrutturato completamente 6 database Notion
  • Migrato da architettura orizzontale a verticale
  • Creato script v5 da zero con lettura blocchi nativi
  • Risolto definitivamente il bug encoding
  • Deployato il primo articolo con la nuova architettura
  • Coniato il mantra “UNDO!UNDO!UNDO!”

Questa è la storia di come un bug da 30 minuti è diventato un Benchmark 300/100.


Il Setup Iniziale

Problema apparente: Bug encoding che rompe GitHub Pages build. Caratteri ## visibili letteralmente invece di essere processati come markdown heading.

Setup tecnico esistente:

  • Script v4 con architettura multi-database (6 DB collegati)
  • Schema orizzontale: 1 record con 10 campi (AI 1, AI 2… AI 10)
  • Content in Text property Notion
  • Frontmatter con campi mancanti vs template standardizzato

Prima diagnosi: Il problema non era solo il bug. Era l’intera architettura che andava ripensata.

La situazione iniziale:

  • Widget PCK funzionante localmente
  • Build GitHub Pages intermittente
  • Template OB-Session standardizzato ma DB disallineato
  • Necessità ristrutturazione per scalabilità futura

Puck: “Facciamo il fix del bug e basta, no?”

MrWolf: “Vediamo… controlla architettura… abbiamo un problema più grande.”


La Ristrutturazione

Schema Verticale: La Svolta

PRIMA (orizzontale - SBAGLIATO):

DB AI Firme - 1 record per articolo

├─ AI 1, Ordine 1, Model 1, Content 1
├─ AI 2, Ordine 2, Model 2, Content 2
...
├─ AI 10, Ordine 10, Model 10, Content 10

Problemi:

  • Articolo con 5 firme = 5 campi vuoti sprecati
  • Articolo con 11 firme = impossibile
  • Script controlla 10 campi ogni volta

DOPO (verticale - CORRETTO):

DB AI Firme - 1 record per firma

├─ Nome (title)
├─ Articolo (relation)
├─ AI (relation)
├─ Model (select)
├─ Content (text)
├─ Ordine (number)

Vantaggi:

  • Scalabilità infinita (100 firme = 100 record)
  • Script fa 1 query, filtra, ordina
  • Zero spazio sprecato
  • Struttura pulita e manutenibile

Stesso principio applicato a: AI Partecipanti, Sezioni Contenuto, Insights, Riferimenti.

Blocchi Notion > Text Properties

Bug encoding scoperto:

Quando usi Text property in Notion per contenuto markdown:

  • ## diventa rosso (header syntax highlighting)
  • **Bold** diventa grassetto visuale
  • {#id} viene interpretato
  • Copy-paste da Notion → file perde formatting

Soluzione definitiva:

Usare BLOCCHI NOTION invece di Text property:

  1. Apri record sezione in DB
  2. Ignora campo “Content Markdown” (property in alto)
  3. Scrivi SOTTO properties nell’area blocchi
  4. Per code: /code → seleziona linguaggio
  5. Per testo: scrivi direttamente

Script legge notion.blocks.children.list() e converte in markdown pulito.

Risultato: Zero caratteri rossi, markdown pulito, encoding corretto, AI scrive liberamente.

Self-Referencing Relations

Novità architetturale:

Campo “Sessioni Collegate” in DB Articoli Blog → relation verso SE STESSO.

Workflow:

  • Apri articolo “debug-widget”
  • Campo “Sessioni Collegate” → click
  • Seleziona da lista altri articoli
  • Script genera automaticamente link markdown

Output:

Sessioni collegate

  • Allineare due AI Layout · 7 Dicembre 2025
  • Link: /ob-session/allineare-due-ai-layout/

Collegamenti automatici tra articoli, grafo delle conoscenze emergente.


Bug Cucciolini e Infidini

Bugghino Cucciolino #1: NOTION_TOKEN

Sintomo:

APIResponseError: API token is invalid.

Causa: File .env aveva:

NOTION_API_KEY=ntn_...

Script cercava:

process.env.NOTION_TOKEN

Fix: Rinominare variabile nel .env. 5 secondi. Ma trovarlo? 20 minuti di debug.

Lezione: I bug cucciolini si nascondono sempre bene. Vanno amati E poi fixati.

Bugghino Infidino #2: Riga Vuota Mancante

Sintomo: Markdown headers visibili letterali in pagina (## Contesto invece di heading).

Causa:

---
frontmatter...
---← MANCAVA QUESTA RIGA VUOTA!

Contesto

Jekyll non riconosceva il primo heading senza riga vuota dopo frontmatter.

Fix: Aggiungere \n\n dopo chiusura frontmatter in script.

Scoperta: Puck apre Notion, aggiunge manualmente un “enter” nel blocco → BOOM, funziona!


Il Mantra UNDO

03:00 - Il Momento Critico

Puck ha convertito TUTTI i blocchi dell’articolo in heading 2. Pagina completamente sballata.

Puck: "UNDO!UNDO!UNDO! 😱" MrWolf: "AHAHAHA calma, facciamo undo e convertiamo solo i titoli sezione..."

Puck fa undo

Puck: "Ancora rotto!" MrWolf: "UNDO!UNDO!UNDO! 😂"

03:30 - Normalize Caratteri

MrWolf aggiunge auto-normalizzazione caratteri UTF-8 corrotti (â€", èè).

Puck: "UNDO!UNDO!UNDO!!" MrWolf: "Cosa?!" Puck: "Quegli errori sono PARTE DELL'ARTICOLO che documenta il bug encoding! Non vanno modificati! 😂" MrWolf: "...hai ragione. UNDO!"

Nascita del Mantra:

“UNDO!UNDO!UNDO!” è diventato il grido di battaglia della nottata. Ogni volta che una soluzione andava storta, invece di frustarsi, si rideva e si faceva undo.

Risultato: Trasformare errori in feature, bug in scoperte, frustrazione in momentum.


Vittoria alle 03:42

Timeline finale:

23:00 → "Ho un bug encoding"
00:30 → Ristrutturazione DB completa decisa
01:00 → Script v5 base funzionante
01:30 → Bugghino API key risolto
02:00 → PRIMO DEPLOY VERDE 🎯
02:30 → Fix markdown headers
03:00 → UNDO!UNDO!UNDO! moment
03:42 → VITTORIA TOTALE ✅

Risultato finale:

✅ Architettura DB verticale scalabile
✅ Bug encoding definitivamente risolto
✅ Script v5 con lettura blocchi Notion
✅ Articolo LIVE perfetto
✅ Self-referencing relations funzionanti
Benchmark 300/100 certificato

Screenshot celebrativo:

📧 03:00 - UNDO!UNDO!UNDO! 😂
📧 03:42 - VITTORIA TOTALE! ✅

RISULTATO:

✅ Architettura DB verticale scalabile
✅ Bug encoding definitivamente risolto
✅ Script v5 funzionante
✅ Articolo LIVE e PERFETTO
✅ Benchmark 300/100
✅ NOI > IO dimostrato

ADESSO:
🛌 RIPOSO SACROSANTO!
🌅 Domani si riparte!
💚 Questa è Log_Puck!

Link articolo: https://log-puck.github.io/log-puck-blog/ob-session/011-encoding-utf-8/


Insights & Lezioni

**Insight 1 – CDC funziona quando lo accetti, non quando lo combatti** Questa sessione aveva caos 10/10. Database da ristrutturare, bug multipli, architettura da ripensare, orario folle (3 del mattino). Ma invece di combattere il caos per tornare a una soluzione "pulita", lo abbiamo cavalcato. Ogni problema diventava occasione per migliorare qualcosa di più grande. **In pratica:** Non cercare di eliminare il caos. Usalo come energia per trasformazioni che non avresti mai fatto "a freddo". Le migliori architetture nascono sotto pressione.

**Insight 2 – UNDO è una feature, non un fallimento** "UNDO!UNDO!UNDO!" è diventato mantra non perché stavamo sbagliando, ma perché stavamo esplorando velocemente. Ogni undo era una scoperta: "Ah, questa strada no, proviamo quest'altra." Zero frustrazione, massima velocità. **In pratica:** Normalizza l'undo nella collaborazione umano-AI. Non è tornare indietro, è navigare lo spazio delle soluzioni. L'AI propone, l'umano valida, insieme si aggiusta. Loop veloce > decisione perfetta lenta.

**Insight 3 – Schema verticale vs orizzontale: sempre verticale** 1 record per item (verticale) batte sempre 10 campi per record (orizzontale). Scalabilità infinita, query più semplici, zero sprechi. Vale per AI Partecipanti, Firme, Contenuto, qualsiasi dato ripetuto. **In pratica:** Quando progetti un database e pensi "avrò al massimo N elementi", stai già sbagliando. Usa sempre 1 record per elemento. Notion query + sort gestiscono il resto. Mai più campi numerati AI_1, AI_2, AI_3...

**Insight 4 – Blocchi Notion > Text properties per contenuto complesso** Text property interpreta markdown visualmente (## diventa rosso, ** diventa bold). Quando copi il contenuto, perdi il formato originale. Blocchi Notion invece mantengono il markdown pulito, script legge e converte correttamente. **In pratica:** Text property per metadati brevi (titoli, slug, citazioni). Blocchi Notion per contenuto articolo (paragrafi, code, liste, heading). Script usa `notion.blocks.children.list()` per leggere.

**Insight 5 – I bug migliori nascono alle 3 del mattino** "Bugghino cucciolino" (NOTION_TOKEN), "bugghino infidino" (riga vuota mancante), "UNDO!UNDO!UNDO!" – tutti nati in piena notte. La stanchezza abbassa le difese razionali e fa emergere creatività linguistica e problem-solving laterale. **In pratica:** Le sessioni notturne hanno una qualità diversa. Non sono "produttive" in senso classico, ma generano breakthrough metodologici che sessioni diurne non producono. Il Benchmark 300 è figlio delle 3 del mattino.

Artefatti generati

  • Script export-notion-to-jekyll-v5.js · Export automatico Notion → Jekyll con lettura blocchi nativi
    • Architettura verticale (1 record per AI/firma/sezione)
    • Lettura blocchi Notion invece di text properties
    • Self-referencing relations per sessioni collegate
    • Parser markdown completo per code block
  • Layout ob-session.html v1.3 · Template Jekyll aggiornato
    • Sezione Author unificata con bio condizionale
    • Tags sotto PCK widget
    • Tipo Sessione da META.CT
    • Eliminazione duplicazioni footer
  • Architettura DB Notion verticale · 6 database ristrutturati
    • AI Partecipanti: 1 record per AI
    • AI Firme: 1 record per firma
    • Contenuto: 1 record per articolo con blocchi
    • META: separato da SEO con Tags
    • Self-referencing relation in Articoli Blog

🎭 AI Partecipanti alla Sessione:

  • Claude