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:
@@ -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*
|
||||
|
||||
Reference in New Issue
Block a user