chore: complete v1 milestone

Archived:
- milestones/v1-ROADMAP.md (full phase details)
- milestones/v1-REQUIREMENTS.md (46/46 shipped)
- milestones/v1-MILESTONE-AUDIT.md (audit report)

Created:
- MILESTONES.md (project milestone history)

Deleted:
- REQUIREMENTS.md (fresh one for next milestone)

Updated:
- PROJECT.md (requirements → Validated, decisions with outcomes)
- ROADMAP.md (collapsed to one-line v1 summary)
- STATE.md (reset for next milestone)

v1 MVP: 4 phases, 10 plans, 46 requirements, 8080 LOC
Timeline: 2 days (2026-03-07 → 2026-03-09)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Michele
2026-03-09 11:59:07 +01:00
parent d8f298463b
commit 1c9199bf38
8 changed files with 518 additions and 396 deletions

View File

@@ -2,7 +2,7 @@
## What This Is
Sistema di automazione per la generazione di caroselli Instagram in bulk per una pagina B2B che promuove consulenza AI a PMI italiane. Non un semplice generatore di testi: un motore di content marketing strategico che orchestra campagne coordinate secondo framework di persuasion nurturing, livelli di consapevolezza Schwartz e rotazione nicchie verticali. L'output principale e' un CSV compatibile con Canva Bulk Create.
Sistema di automazione per la generazione di caroselli Instagram in bulk per una pagina B2B che promuove consulenza AI a PMI italiane. Un motore di content marketing strategico che orchestra campagne coordinate secondo framework di persuasion nurturing, livelli di consapevolezza Schwartz e rotazione nicchie verticali. L'output principale e' un CSV compatibile con Canva Bulk Create. Costruito con FastAPI + React, deployato su VPS Hostinger come container Docker.
## Core Value
@@ -12,22 +12,21 @@ Generare un calendario editoriale completo (13 post = 2 settimane) di caroselli
### Validated
(None yet — ship to validate)
- v1 Calendar & Campaign (CAL-01..07) — v1
- v1 Format Selection (FMT-01..02) — v1
- v1 LLM Content Generation (LLM-01..06) — v1
- v1 Prompt System (PRM-01..05) — v1
- v1 CSV & Export (CSV-01..04) — v1
- v1 Image Keywords (IMG-01..04) — v1
- v1 Swipe File (SWP-01..04) — v1
- v1 Web UI (UI-01..08) — v1
- v1 Infrastructure (INF-01..06) — v1
Full details: `.planning/milestones/v1-REQUIREMENTS.md`
### Active
- [ ] Calendar Generator che produce cicli di 13 post con distribuzione Persuasion Nurturing
- [ ] Integrazione Claude API per generazione contenuti carosello in formato JSON strutturato
- [ ] Sistema di prompt editabili (file-based) per ogni combinazione formato+tipo contenuto
- [ ] CSV Builder con header compatibile Canva Bulk Create (8 slide per carosello)
- [ ] Format Selector automatico (tipo_contenuto x livello_schwartz -> formato_narrativo)
- [ ] Campaign Planner con sequenza 4 fasi (attira/cattura/coinvolgi/converti)
- [ ] Rotazione nicchie B2B (generico 50%, verticali 50% in rotazione)
- [ ] Topic generation ibrida: auto-generati dall'LLM + override manuale
- [ ] Swipe File per cattura rapida idee/topic
- [ ] Web UI completa: genera calendario, genera singolo post, prompt editor, swipe file, impostazioni
- [ ] Image keyword generation per ogni slide (fetch Unsplash opzionale se API key configurata)
- [ ] Deploy Docker su VPS Hostinger (lab.mlhub.it/postgenerator/)
(None — define next milestone requirements with `/gsd:new-milestone`)
### Out of Scope
@@ -37,9 +36,22 @@ Generare un calendario editoriale completo (13 post = 2 settimane) di caroselli
- Analytics/tracking performance — fase successiva dopo validazione del content engine
- Multi-utente/autenticazione — uso personale di Michele
- Template Canva generation — i template si creano manualmente su Canva
- Video/Reel generation — solo caroselli per MVP
## Context
### Current State
Shipped v1 MVP con 8,080 LOC (4,157 Python + 3,923 TypeScript) in 48 file sorgente.
Tech stack: FastAPI 0.115 + React 19 + Tailwind v4 + TanStack Query + Vite.
Deploy target: Docker single container su VPS Hostinger (lab.mlhub.it/postgenerator/).
Storage: file system (prompts/, outputs/, data/, swipe_file.json) — no database.
**Pending validation:**
- Deploy su VPS e test end-to-end con API key reali (Claude + Unsplash)
- Qualita' prompt italiani con dati reali
- CSV import in Canva Bulk Create con caratteri italiani
### Framework Strategici Integrati
Il sistema combina tre framework. Ogni post generato porta il tag di tutti e tre i layer:
@@ -53,79 +65,54 @@ Il sistema combina tre framework. Ogni post generato porta il tag di tutti e tre
- 1 post promozione (convertire, L1/L2)
**2. 5 Livelli di Consapevolezza (Schwartz):**
- L5 (inconsapevole): storytelling emotivo, domande provocatorie
- L4 (consapevole problema): nominare il problema, agitarlo
- L3 (consapevole soluzioni): educare sui criteri, posizionarsi
- L2 (consapevole prodotto): casi studio, testimonianze, FAQ
- L1 (pronto acquisto): offerta chiara, urgenza, social proof
- L5 (inconsapevole) → L4 (consapevole problema) → L3 (consapevole soluzioni) → L2 (consapevole prodotto) → L1 (pronto acquisto)
**3. 4 Funzioni del Contenuto:**
- Intrattenere -> Educare -> Persuadere -> Convertire
**4 Step di Campagna:**
- Attira -> Cattura -> Coinvolgi -> Converti
### 7 Formati Narrativi
**3. 7 Formati Narrativi:**
PAS, AIDA, BAB, Listicle, Storytelling/Eroe, Dato+Implicazione, Obiezione+Risposta
### Struttura Carosello (8 slide)
1. COVER (hook + subtitle)
2. PROBLEMA (agitazione)
3. CONTESTO (dati/scenario)
4. SVILUPPO A (primo punto)
5. SVILUPPO B (approfondimento)
6. SVILUPPO C (esempio pratico)
7. SINTESI (recap/trasformazione)
8. CTA (call to action)
### Regole di Copywriting
- Comunicare sempre: chi sei, perche' fidarsi, perche' sei unico, come puoi aiutarlo
- "Cosa fare" mai "come farlo" — il come e' cio' per cui pagano
- Tono: diretto, provocatorio, costruttivo
- Lingua: italiano
- Target: imprenditori e manager italiani
**4. Struttura Carosello (8 slide):**
COVER → PROBLEMA → CONTESTO → SVILUPPO A → SVILUPPO B → SVILUPPO C → SINTESI → CTA
### Nicchie B2B Target
- Generico PMI/imprenditori (~50%)
- Dentisti/Studi medici
- Avvocati/Studi legali
- E-commerce
- Local business
- Agenzie (mktg/consulenza)
### Header CSV Canva Bulk Create
```
campagna,fase_campagna,tipo_contenuto,formato_narrativo,funzione,livello_schwartz,
target_nicchia,data_pub_suggerita,cover_title,cover_subtitle,cover_image_url,
s2_headline,s2_body,s2_image_url,s3_headline,s3_body,s3_image_url,
s4_headline,s4_body,s4_image_url,s5_headline,s5_body,s5_image_url,
s6_headline,s6_body,s6_image_url,s7_headline,s7_body,s7_image_url,
cta_text,cta_subtext,cta_button_label
```
I campi metadato (prima di cover_title) restano nel CSV per analisi ma Canva li ignora.
Generico PMI (~50%), Dentisti/Studi medici, Avvocati/Studi legali, E-commerce, Local business, Agenzie
## Constraints
- **Stack**: Python 3.12 + FastAPI backend, React + Tailwind frontend — adattato a VPS echosystem
- **LLM**: Claude API (anthropic SDK) — provider principale
- **Storage**: File system locale (no DB) — prompts/, outputs/, data/, swipe_file.json
- **Stack**: Python 3.12 + FastAPI backend, React + Tailwind frontend
- **LLM**: Claude API (anthropic SDK)
- **Storage**: File system locale (no DB)
- **Deploy**: Docker su VPS Hostinger, URL https://lab.mlhub.it/postgenerator/
- **Immagini**: keyword generate dal sistema, Unsplash fetch opzionale (API key non ancora disponibile)
- **Template Canva**: placeholder con nomi identici alle colonne CSV (da cover_title in poi)
- **Immagini**: keyword + Unsplash opzionale
- **Template Canva**: placeholder con nomi identici alle colonne CSV
- **Lingua**: tutti i contenuti generati in italiano
- **Interfaccia**: Web UI come interfaccia principale (non CLI)
- **Interfaccia**: Web UI come interfaccia principale
## Key Decisions
| Decision | Rationale | Outcome |
|----------|-----------|---------|
| Claude API come LLM provider | Familiarita' con ecosistema Anthropic, qualita' output italiano | — Pending |
| FastAPI + React (non Flask + HTML/JS) | Migliore separazione, UI piu' ricca, coerenza con echosystem VPS | — Pending |
| File system storage (no DB) | Semplicita' MVP, prompt e config come file editabili | — Pending |
| Nomi placeholder dal briefing | Template Canva creato dopo, basato sui nomi CSV definiti | — Pending |
| Topic generation ibrida | Auto-generati di default, override manuale per trend/intuizioni | — Pending |
| Unsplash opzionale | Genera keyword sempre, fetch immagini solo se API key configurata | — Pending |
| Claude API come LLM provider | Familiarita' ecosistema Anthropic, qualita' output italiano | v1 Good |
| FastAPI + React (non Flask + HTML/JS) | Migliore separazione, UI ricca, coerenza VPS echosystem | v1 Good |
| File system storage (no DB) | Semplicita' MVP, prompt e config come file editabili | v1 Good |
| Nomi placeholder dal briefing | Template Canva creato dopo, basato sui nomi CSV definiti | v1 Good |
| Topic generation ibrida | Auto-generati + override manuale per trend/intuizioni | v1 Good |
| Unsplash opzionale | Keyword sempre, fetch solo se API key configurata | v1 Good |
| root_path SOLO via Uvicorn --root-path | Mai nel costruttore FastAPI — pitfall subpath risolto | v1 Good |
| CSV utf-8-sig + CANVA_FIELDS locked | Compatibilita' Excel, header bloccati con assert | v1 Good |
| Pipeline singleton con fallback disco | Mantiene _jobs tra request, ricostruisce da JSON | v1 Good |
| Design stone/amber B2B | Non gradienti viola generici, palette professionale | v1 Good |
| Risoluzione Unsplash una volta dopo batch | Batch efficiente, no re-risoluzione su regen singolo | v1 Good |
| Dizionario statico IT→EN (~30 keyword) | No API traduzione esterna, keyword B2B sufficienti | v1 Good |
| Lazy init services (PromptService, SwipeService) | Sincronizzazione con lifespan FastAPI directory creation | v1 Good |
| localResults separato in OutputReview | Edit inline senza mutare cache TanStack Query | v1 Good |
| topic_overrides come dict[int, str] | Chiave = slot_index, Pydantic converte str key → int | v1 Good |
## Tech Debt (from v1)
- Pipeline singleton non invalidato su API key change (media)
- Campo campagna inviato ma ignorato in export (bassa)
- brand_name hardcoded in generation_pipeline.py (bassa)
- Job interrotti durante restart non recuperabili (bassa)
---
*Last updated: 2026-03-07 after initialization*
*Last updated: 2026-03-09 after v1 milestone*