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
- Il Setup Iniziale
- La Ristrutturazione
- Bug Cucciolini e Infidini
- Il Mantra UNDO
- Vittoria alle 03:42
- Insights & Lezioni
- Riferimenti Archivistici
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:
- Apri record sezione in DB
- Ignora campo “Content Markdown” (property in alto)
- Scrivi SOTTO properties nell’area blocchi
- Per code:
/code→ seleziona linguaggio - 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 fa undo
03:30 - Normalize Caratteri
MrWolf aggiunge auto-normalizzazione caratteri UTF-8 corrotti (â€" → —, è → è).
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
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