Commits
Plantillas a la base de dades: la primera millora post-MVP d'Auto Magazine
Primer dia de millors post-MVP: les plantilles del PDF passen del filesystem a la base de dades i el panell guanya un CRUD complet verificat en producció.
Aquest dilluns he encetat la primera millora post-MVP: una secció de Plantillas al panell. Fins ara les plantilles del PDF només es tocaven per filesystem, i la carpeta va hornejada a la imatge Docker: qualsevol edició feta des del panell s'hauria perdut al proper docker compose up --build. La decisió central, tancada amb el grilling (ADR 0002), és que la font de veritat passen ser les files de la base de dades.
Abans de tocar codi
El matí ha anat d'habilitar el terreny. He instal·lat el pack de skills de mattpocock i definit com hi treballa l'agent: el tracker són GitHub Issues, amb labels de triage per defecte (needs-triage, needs-info, ready-for-agent, ready-for-human), i les decisions de domini es llegeixen del glosari i dels ADRs abans d'explorar res. El glosari ha canviat de nom (CONTEXT.md → GLOSSARY.md) i de contingut: Edició n'és la peça canònica — el document era anterior a multi-edició i s'havia desviat del producte, amb el Número com a correlatiu —, i hi entren la Cabecera com a marca mare, l'Esqueleto i la Hoja de estilo maestra.
També m'he endut tres correccions de procés en una sola sessió: el grilling ha de preguntar de forma interactiva (la recomanació és una opció marcada, no la resposta), la spec i els tickets són passos amb autorització individual — vaig publicar sis issues abans de tenir el vist-i-plau de la spec —, i quan hi ha una skill del pack per a un pas, se segueix al peu de la lletra: l'auditoria va trobar la spec sense el format obligatori i tickets per capes en lloc de tracer bullets verticals.
Quatre tickets en un dia
La primera tracer bullet (issue #2, TDD, suite de 171 en verd) ha portat les plantilles a la base de dades: seed idempotent a l'arrancar que importa les 7 de fàbrica que falten sense pijar res, render que materialitza les files a un directori temporal per a WeasyPrint, i firma de maqueta segellada amb el hash de les files. El panell ha guanyat la secció «07 Plantillas» amb llistat per rol i fitxa sencera, i s'ha desplegat en producció (commit 1b97e3e) comprovant contra la base de dades real del volum datos/: les 7 plantilles de fàbrica i les 2 edicions existents, intactes.
Entremig, un fix que vaig veure jo mateix provant el ticket: el contingut de la fitxa desbordava la targeta (un pre de 1.989 px contra 954 disponibles). Arreglat globalment al sistema de disseny (pre-wrap, overflow-wrap: anywhere) i amb tipografia pujada a 1rem perquè el codi es pogués llegir.
Després ha entrat la resta de la família: l'editor de plantilles amb referència de variables, errors de Jinja amb fitxer i línia i errors de sintaxi CSS detectats amb tinycss2 i presentats al panell (commit 6aeb386); el botó «Restaurar original» a les fitxes de fàbrica, la via perquè les millores d'una actualització arribin a una edició ja muntada (fe1f687); i plantilles lliures amb esborrat a Limpieza (26b0c38). El code-review d'aquest últim ha caçat tres fallos de fons: la seed reimportava una plantilla de fàbrica esborrada i l'entrada de la paperera quedava encallada; una plantilla lliura podia prendre el nom d'una de fàbrica que el motor tria pel seu nom fix; i qualsevol plantilla lliura desfasava la maqueta sense canviar el PDF, perquè la firma segellava totes les files i no només les que el motor usa.
Verificació de punta a punta
L'últim ticket ha estat el recorregut complet en Chromium, amb informe visual i captures. Docker no hi és a l'equip local, així que el flux s'ha fet per HTTP sobre dades temporals (crear l'Edició, pujar un .docx, extreure, maquetar), i la prova crítica — que un rebuild no perdi el que s'ha editat — a fxserver: fila de portada.html comparada amb el fitxer de fàbrica, edició de prova, reconstrucció de la imatge, fila intacta, i producció tornada al seu estat. El CRUD complet de Plantillas queda verificat i en producció, sobre una font de veritat que ja no es perd als rebuilds.