Pianeta Content — Specifica definitiva
Versione 1.0 · 2026-06-02 · autore Claude (Sessione 3) per Gregorio. Prodotta da un workflow multi-agente (ricerca web 2026 + design + 3 critiche avversariali: legale CH/EU, CFO, prodotto), poi sintetizzata a mano contro lo stato reale di codice e DB
yqhixdqipojvgzfadufo. Questo documento corregge il draft interno: dove le critiche hanno smentito il design, vince la critica. I prezzi sono verificati live al 2026-06-02.
0. TL;DR per il founder
La visione è giusta e regge. Il Content Studio è la fabbrica di contenuti: ogni azienda, col suo brand in memoria e il suo settore, genera testo + immagini + video + voce nei formati perfetti per i social scelti e per la landing da sponsorizzare. Il Marketing li distribuisce e ne misura il ritorno. Il confine Content-crea / Marketing-distribuisce è netto, col gate di revisione umana in mezzo (che è anche l'esonero legale dell'AI Act).
Ma la ricerca ha trovato 3 verità scomode che cambiano il piano. Le scrivo subito, in chiaro, perché sono il punto:
-
Stiamo per biforcare il pianeta. Esiste già un Content Creator spedito che scrive su
social_postse 4 funzioni vive (scoperta trend, analisi competitor, auto-post, generazione immagini). Il design "nuovo motore" rischiava di costruirne un secondo in parallelo, senza riconciliare. Decisione presa in questa spec:content_itemsdiventa il livello "concept",social_postsresta il livello "pubblicazione". Non si butta niente, si collega. Questa è la decisione #1, prima di toccare il database. -
Il video costa il 30-40% più di quanto sembrava. Un reel Veo "Fast" a 8 secondi costa CHF 1.06, ma il listino prometteva "5-15 secondi" e a 15s costa CHF 1.98. Il margine reale di un cliente Business a pieno regime è ~76%, non 93%. Fix: i video si contano in secondi (non in "clip"), e i contenuti che costano franchi (video, voce, 3D) hanno un freno di spesa già dalla Fase A, non dopo.
-
La sovranità dei dati oggi è una promessa, non un fatto. La funzione che dovrebbe rimuovere i dati personali prima di mandarli ai fornitori americani (
pseudonymizePii) non è chiamata da nessuna parte nel codice, e il mio endpoint del testo oggi scrive persino il prompt grezzo nel database. Il routing "tutto in Europa" sono zero righe scritte. Quindi: non vendiamo ancora "i tuoi dati restano in Europa / sei già a norma" finché non è costruito e testato. È il rischio penale tuo (CHF 250k), non un dettaglio.
Cosa faccio per il gate del 22 giugno: una demo onesta e solida — generi un post (testo + immagine) nel brand del cliente, lo vedi nel calendario, con l'etichetta AI già applicata. Il motore video/voce e il piano mensile automatico arrivano subito dopo. Le 3 verità sopra diventano i primi task di hardening, alcuni dei quali toccano anche il mio lavoro di oggi (lo dico sotto, §7).
Cosa decidi tu: 7 nodi aperti, in §10, ciascuno con la mia raccomandazione.
1. Visione e confine con Marketing
Cosa è il Pianeta Content. Il motore che trasforma uno scopo business ("riempi i tavoli del martedì", "presenta il nuovo immobile") in contenuti pronti, nel brand del cliente, conformi per legge, in tre tap. L'imprenditore non vede mai un modello AI, un formato, un prompt. Vede uno scopo, tocca, riceve, firma.
Il confine, non negoziabile. Content crea. Marketing distribuisce e misura. Il punto di passaggio è il gate di revisione umana: il cliente apre, guarda, approva. Quella firma è anche l'esonero legale dell'AI Act Art. 50(4) (quando un umano si assume la responsabilità editoriale). Solo dopo la firma il contenuto entra nel calendario di Marketing.
Perché è un moat e non un generatore qualunque, in ordine di forza:
- Dati operativi vivi. Il Content vede CRM + Booking + Web nello stesso sistema. Nessun tool standalone (Higgsfield, Predis, Canva) può proporti "il martedì è scarico → promo martedì" perché non ha i tuoi dati. E parte di questa intelligenza esiste già spedita (scoperta trend + analisi competitor): va agganciata, non reinventata.
- Sovranità — quando sarà vera. I generatori video consumer più forti (Sora 2, Veo consumer) non sono legalmente disponibili in UE/Svizzera. Multiverbe può dare lo stesso risultato con basi legali pulite. Ma è un interruttore da costruire prima di venderlo (vedi §0 punto 3).
- Compliance come feature. L'obbligo di etichettare i contenuti AI scatta il 2 agosto 2026, sanzioni fino a 15M EUR / 3% fatturato. Etichettare in automatico e consegnare la dicitura pronta è vendibile: "i tuoi contenuti AI sono già a norma, ci pensiamo noi".
2. Decisione architetturale #1 — riconciliare con l'esistente (PRIMA di tutto)
Questa sezione nasce dalla critica prodotto. È la decisione da prendere prima di scrivere una riga di migration.
Cosa c'è già, vivo, in produzione:
- Tabella
social_postscon metriche già a schema (metrics_likes/reach/engagement_rate...). È quella che alimenta il Content Creator e il calendario che ho shippato oggi. - 4 edge function:
analyze-market-trends(scoperta trend via Serper),analyze-competitors,auto-generate-posts(post completo da brand intelligence),generate-social-media(immagini via Gemini). - Il mio
generate-text.ts(testo, appena hardened) +useContentStudio.
La decisione (additiva, niente fork):
content_items= livello "concept" (l'idea: scopo, pillar, brand, varianti). Già haparent_item_id+ai_variant_indexnativi.social_posts= livello "pubblicazione" (una riga per canale, con le metriche di ritorno). Le "varianti per canale" SONOsocial_posts.- Un concept genera N
social_postsfigli (uno per canale/formato). Il calendario e le metriche restano dove sono. - Le 4 edge function diventano input del context-assembly (trend/competitor = il "perché ora"), non motori paralleli.
generate-social-media(immagini Gemini consumer) viene marcato "da sostituire" con la stessa serietà digenerate-text.ts: stesso problema di residency.
Senza questa decisione scritta, il vero P0 non è l'endpoint: è che a 3 settimane dal gate biforchiamo il modello dati del pianeta. Con questa decisione, tutto il resto della spec è davvero additivo.
3. Architettura del motore (flusso end-to-end)
INGRESSO (3 trigger)
A. Manuale · "Crea" (preset scopo + 1 foto)
B. Mensile · "Pianifica il mese" → co-direttore propone scheletro 30gg
C. Data-driven · evento operativo (martedì scarico / nuovo immobile / recensione 5★)
│ da Booking/CRM/Web + TREND esterni (analyze-market-trends)
▼
STEP 1 · CONTEXT ASSEMBLY (edge, <300ms) — i 4 slot nascosti dietro un campo solo:
COSA → brand_memory_search (pgvector) + fatti freschi dal CRM/Booking
COME → brand voice (tono, parole-chiave, frasi vietate)
ASPETTO → visual seed di settore (content-seeds.ts già shippato)
PERCHÉ ORA → trend/competitor (le edge function vive) + evento operativo ← NEW
Output: PromptBundle PSEUDONIMIZZATO + brandPrefix cacheable (-90% input)
▼
STEP 2 · MODEL ROUTING (gateway interno, fail-closed, DEFAULT SOVRANO)
▼
TESTO (sync) IMG (async) VIDEO/VOCE (async)
risponde subito ai_generation_jobs ai_generation_jobs (Inngest durabile)
▼
STEP 3-4 · GENERATE → UPSCALE (se serve) · watermark SynthID/C2PA · label Art.50
▼
STEP 5 · DERIVAZIONE FORMATI — da 1 concept → N social_posts figli (canale × ratio × lingua)
▼
STEP 6 · GATE REVIEW (ready → approved) — firma umana = esonero Art.50(4) + review_log
▼
STEP 7 · HANDOFF → social_posts entra in calendario · Marketing pubblica + traccia ROI
│
└──◄ RITORNO METRICHE — le metriche tornano visibili nel Content e nutrono il brand
Il brandPrefix (tono + frasi vietate + seed settore) è identico per tutto il mese dello stesso workspace → passato come blocco cache → -90% costo input testo. I fatti freschi vengono da brand_memory_search (embedding Cohere Embed v3 multilingue via path EU).
4. Schema dati (additivo, corretto)
Migration unica database/migrations/2026-06-02_content_studio_engine.sql. HARD BOUNDARY: DDL via Supabase Dashboard dopo tua review, non via MCP (regola repo). Normalizzare i valori status legacy prima di applicare i CHECK.
content_items(concept-layer): aggiungereplan_id, channel, ratio, cta, language, ai_disclosure jsonb, provenance jsonb, review_log jsonb, scheduled_for. Vincolarestatuscon CHECK (draft/generating/ready/needs_changes/approved/scheduled/handed_to_marketing/archived/failed).parent_item_id/ai_variant_indexgià esistono.content_plans(NUOVA): il piano mensile (period_month,skeleton jsonb,cadencecon guardrail,status). È il moat ricorrente.content_assets(NUOVA): asset multimodali pesanti (video con durata/audio nativo, watermark, provenienza provider,sha256,region,cost_chf). Le immagini semplici possono restare insocial_posts.media_urls.ai_generation_jobs(estendere a poliforma): aggiungerekind, content_item_id, workspace_id, provider, region; rilassaresite_ida nullable; CHECK incrociato sull'owner. Riusa la state machine job già in prod (retry,cost_cap_chf, kill-switch) senza codice nuovo.content_generations(ledger usage): aggiungere telemetriamodality, provider, provider_region, sovereign, pii_pseudonymized, art50_label_applied, machine_marker, fallback_reason. Correzione critica M1: il vocabolariomodalitydeve allinearsi al CHECK reale esistente (text|image|video|audio|...), usareaudiononvoice; decidere secgièvideoo nuovo valore.- Audit contenuti — tabella DEDICATA (correzione critica G4): NON riusare
audit_log_gdpr_art9(è il registro dei dati sanitari, mescolarci marketing inquina la base giuridica). Crearecontent_audit_logappend-only coi suoi event_type. La prova primaria dell'attestazione restacontent_items.review_log. legal_acceptances(correzione critica G5): ildocument_typeè oggi bloccato a 4 valori sia nel DB sia nel tipo TypeScript. Estendere entrambi per registrarecontent_studio_tosevoice_clone_consent. Finché non fatto, nessun consenso voce è registrabile = niente cloning.- RLS: pattern
(SELECT auth.uid())wrap su tutte le nuove tabelle. I worker usano service_role.
5. Routing modelli + gateway sovrano
Un solo modulo astrae i provider (replica il pattern reale site-design/llm-routing.ts), esteso a 4 modalità. Default sovrano, fail-closed. Conversione dichiarata: 1 USD = 0.88 CHF (giugno 2026).
Verità da §0: oggi questo gateway sono zero righe. L'unico codice provider è
generate-text.tsche usa l'endpoint consumer Google (training senza opt-out). Prima di costruire il routing bello, va bloccato in produzione l'endpoint consumer (hard-fail, non solo 503 da chiave mancante).
Provider scelti per modalità (verificati 2026-06-02)
| Modalità | Job | Provider scelto | Regione | Costo | Note |
|---|---|---|---|---|---|
| Testo | Caption/post | Gemini 2.5 Flash | Vertex AI EU | ~0.02/3 caption | Mai AI Studio consumer (training). $0.30/$2.50 per 1M token |
| Testo | Blog/landing/ad | Claude Sonnet 4.6 | Vertex AI EU | ~0.055 (con cache) | Multi-region GA da mag 2026 |
| Testo | Email/outreach + DE/FR | Mistral Medium 3 | FR (Francoforte) | ~0.005 | ZDR + DPA. Resta sovrano |
| Immagine | Standard | FLUX.2 [pro] | Azure Foundry EU | ~0.026/MP | Mai bfl.ai diretto. Forzare EU boundary via ticket MS |
| Immagine | Editing/correzione | FLUX.1 Kontext [pro] | Azure EU | ~0.035 | Per il "correggi questo" (vedi §8) |
| Immagine | Hero food/prodotto | Imagen 4 Ultra | Vertex AI EU | ~0.053 | SynthID incluso. Indemnity da confermare |
| Video | Reel standard | Veo 3.1 Fast | Vertex AI EU (Francoforte) | $0.10/s no-audio · $0.15/s audio | Vedi correzione costi §6 |
| Video | Hero sponsorizzato | Veo 3.1 Standard+audio | Vertex AI EU | $0.40/s | Audio 48kHz = differenziatore. Solo premium |
| Video | Economico sopra-quota | Seedance 2.0 Fast | fal.ai (US) | ~0.16/clip | ByteDance, fuori sovranità → opt-in, mai default |
| Voce | TTS standard | Mistral Voxtral / Azure Neural TTS | FR / CH (Zurigo) | ~0.013/1k char | Default no-cloning. A/B la qualità IT prima del go-live |
| Voce | Cloning consent-safe | ElevenLabs | US (EU solo Enterprise) | ~0.05-0.10/1k char | Solo con gate consenso. Premium |
Scartati (vincolo, non opzione): DeepSeek, OpenRouter, Higgsfield come backend (è un aggregatore = categoria OpenRouter; uso legittimo solo come riferimento UX), bfl.ai diretto, endpoint cinesi diretti, Veo/Imagen/Gemini consumer, Midjourney (no API), Sora 2 / Veo consumer (non disponibili UE/CH). fal.ai non è OpenRouter (inferenza diretta single-model): ammesso come fallback con DPA + pseudonimizzazione + retention off.
Fallback fail-closed: ogni hop fuori EU/CH richiede pseudonymizePii() già applicato a monte e marca sovereign=false sulla telemetria → registro nDSG/GDPR popolato in automatico. Video sopra-cap: STOP + upgrade (mai downgrade silenzioso). Modalità sovranità totale: il fallback economico video diventa lo slideshow (immagini + Ken Burns + musica), non Seedance.
6. Modello di costo (corretto dalla critica CFO)
6.1 La correzione che salva il banco: video in SECONDI, non in clip
Il reel — il contenuto che vende l'abbonamento — costa il 30-87% in più del budget non appena supera gli 8 secondi che il listino stesso prometteva di superare.
| Durata reel | Veo Fast (audio) | Veo Std (audio) |
|---|---|---|
| 8s | CHF 1.06 | CHF 2.82 |
| 15s (promesso) | CHF 1.98 | CHF 5.28 |
Fix #1 (obbligatorio): il cap video si conta in secondi. Pro = 40 secondi/mese, Business = 120 secondi/mese. L'utente sceglie come spezzarli (tre reel da 8s o due da 15s+uno da 10s), tu paghi sempre lo stesso COGS massimo. UI in italiano: "ti restano 24 secondi di video questo mese". Niente crediti astratti.
6.2 Le altre 4 correzioni
- Fix #2 — derivazione multi-ratio del visual = 0.25 unità/ratio. Il re-frame di un'immagine su 3 ratio extra costa ~0.078 (la rigenerazione del soggetto centrato, perché il crop cieco fa schifo). Quindi "deriva su 4 canali" = ~1.75 foto di quota. Il testo per N canali resta gratis (è Gemini Flash, centesimi veri). Sul video la derivazione ratio è fisicamente impossibile gratis: un video si genera per UN ratio (l'utente sceglie il primario); gli altri ratio costano un'altra generazione. Va detto chiaro in UI, non promesso.
- Fix #3 — upscale = 0.5 unità foto, contato nel counter
images_count(oggi manca). - Fix #4 — separare il cap testo dal cap media. Oggi ogni generazione (anche una caption) conta come
ai_generations(cap 100/500/2000). Un piano mensile con 30 post × varianti satura il cap col testo gratis prima di finire le foto. Creareai_text_generationsseparato (cap alto/illimitato) vsai_media_generations(i pezzi pesanti). - Fix #5 — hard-cap sui media pesanti GIÀ in Fase A, non in Fase B (luglio). Il rischio di costo è massimo nelle prime settimane, quando il co-direttore "Auto" è meno tarato. Testo/foto restano soft; video/voce/3D si bloccano duro al cap fin da subito.
6.3 Margini reali (onesti)
| Tier | COGS Content a saturazione (worst case 15s) | % del mensile | Margine lordo reale |
|---|---|---|---|
| Pro (CHF 149) | ~9.8 | 6.6% | ~94% |
| Business (CHF 249) | ~42 (di cui Veo ~20 + CGI ~10) | ~17% | ~76-80% (non 93%) |
Ancora sani. Ma il numero onesto è 76-80% sul Business a pieno regime, non 93%. Il rischio vero è la CGI 3D (margine 58%, COGS ~CHF 5 non verificato): va fuori dal mensile finché il COGS reale non è confermato sotto $6 — resta "1 render incluso" come gancio, il resto add-on a CHF 12.
6.4 Confine "incluso" vs "add-on a consumo"
Principio: centesimi inclusi e percepiti come illimitato-ragionevole; franchi quotati in unità leggibili e gated. È anche copertura legale: niente addebito silenzioso = niente contestazioni. Add-on sempre per contenuto (mai crediti astratti), con prezzo mostrato prima. Regola "i pacchetti non scadono finché l'abbonamento è attivo" + cap di rollover 2x (un churner non accumula 200 foto per bruciarle il mese prima di disdire).
7. Compliance e sovranità (corretto dalla critica legale)
La spec è il miglior documento di compliance-by-design a questo stadio, ma è un piano, non uno stato. Il delta tra "ciò che diciamo di fare" e "ciò che il sistema fa oggi" è esattamente il delta che, in un reclamo, trasforma una "due diligence dimostrabile" in una "dichiarazione non mantenuta" — il discrimine della sanzione penale revFADP.
7.1 I buchi aperti OGGI (alcuni toccano il mio lavoro di stamattina)
- G1 —
pseudonymizePii()non è chiamato da nessuna parte. Greppato tuttofrontend/multiverbe-app: l'helper compare solo nella sua definizione. È codice morto end-to-end. Nessun trattamento Multiverbe verso provider US è oggi pseudonimizzato. Va messo un gate centralizzato fail-closed nel provider-registry, applicato a TUTTI gli endpoint, non delegato al singolo. - G3 — il mio endpoint scrive il prompt grezzo.
generate-text.ts(mio, oggi) salvaprompt: body.promptgrezzo incontent_generations.prompt. Se l'utente scrive "post di ringraziamento per Mario Rossi", quel nome finisce in chiaro nel DB e viaggia non pseudonimizzato al provider. È una correzione al mio lavoro: la colonna deve contenere solo la versione pseudonimizzata o un hash. Lo segnalo onestamente, è P0. - G2 —
api/sales/generate-outreach.ts(Sessione 2, LIVE): stesso bug JWT che ho già segnalato, più invio di dati personali reali (nome/azienda/ruolo/città di un decisore) a Mistral senza pseudonimizzazione né base legale documentata. ServeverifyUser+ un Legitimate Interest Assessment per il cold outreach. Va sollevato col founder/S2: è live. - G6 — il routing sovrano EU sono 0 righe. Venderlo come presente ("i tuoi dati restano in Europa / già a norma") finché non è costruito è pubblicità potenzialmente ingannevole (art. 3 LCSl) e responsabilità verso il cliente. Non usare il claim sovranità nel marketing finché G1+G6 non sono chiusi e testati.
7.2 Etichettatura Art. 50 (tre strati)
- Machine-readable embedded: SynthID (da Imagen/Veo, conservare mai rimuovere) + C2PA embeddato lato backend per FLUX (che non ha watermark nativo).
- Metadati DB (
content_items.ai_disclosure+provenanceimmutabile via trigger). - Disclosure visibile al publish: label IT per canale ("Contenuto creato con l'AI"), configurabile per workspace, default presente.
Il gate Content→Marketing è la prova dell'esonero Art.50(4): alla firma si registra approved_by + reviewed_at + content_hash in content_items.review_log + evento in content_audit_log (tabella dedicata, non quella sanitaria). Un trigger BEFORE INSERT su social_posts/calendario rifiuta se manca label/attestazione. In modalità "Auto" l'esonero non è disponibile (nessun umano si assume responsabilità) → label visibile forzata.
7.3 Altre correzioni legali
- EXIF-strip obbligatorio server-side prima di ogni dispatch (la geolocalizzazione GPS nelle foto del telefono è un dato personale). Default "stripped", non un flag opzionale.
- Foto utente → solo Vertex EU finché non esiste un rilevamento volti affidabile (regola difensiva semplice, più sicura del "vieta volti verso US" non implementabile al MVP).
- Voce/biometria: default TTS preset, nessun cloning. Cloning solo dietro gate proprietario (voice-captcha →
voice_clone_consent), campione vocale cifrato (patternpatient_pseudo_map). Nessun TTS zero-shot accessibile senza consenso valido (fail-closed). - ToS: non promettere indennizzi upstream incerti. Dire "ti giriamo le garanzie del fornitore ove esistenti e nei loro limiti, senza che ciò costituisca garanzia di Multiverbe". Far passare da legale + humanizer.
- Sub-processor: versionare la lista accettata per workspace (in
legal_acceptances) così la notifica 30gg revFADP è una prova, non un'email.
8. UX mobile-first (Nebula Glass) — con i buchi prodotto chiusi
Design system Osservatorio: canvas #09090B, accent cyan #22D3EE + verde #4ADE80, Bricolage Grotesque display + Geist, glass 3 livelli, azioni primarie in thumb-zone, animazioni solo transform/opacity.
Mappa schermate: Oggi (cosa esce + cosa aspetta la firma) · Crea (3 tap) · Piano (mese, off/semi/auto) · Libreria · Brand.
Il flusso "Crea" in 3 tap
- Scopo ("Piatto del giorno") → il sistema sceglie formato, modello, ratio, preset (nascosto).
- Una riga + (opz.) foto → gateway sovrano, anti-slop.
- Scegli 1 di 3 varianti → C2PA + SynthID + label + formati derivati. Le 3 varianti sono leggere: 3 caption diverse + 1 solo visual pesante (protegge i cap).
I buchi prodotto chiusi (dalla critica)
- Editing video post-generazione (#4): trim durata, scelta frame di cover, on/off sottotitoli, scelta/volume musica — tutto gratis (client-side/ffmpeg); ri-generare = 1 unità. Senza questo "Anima foto→reel" è una demo, non una feature.
- Correggi questo vs Rigenera tutto (#6): "Rigenera" ha due rami — Rigenera (1 unità, risultato nuovo) e Correggi (FLUX Kontext edit mirato per il refuso/dettaglio sbagliato). Ogni scarto chiede una micro-ragione (3 chip) che nutre il brand.
- Brand che si auto-apprende (#8): ogni approvazione/scarto/edit scrive segnale in
content_brand_memory. Dopo 5-10 contenuti il brand si costruisce anche per chi ha saltato l'onboarding. È l'antidoto alla "AI slop generica" (200 ristoranti col solo seed settore producono lo stesso post). - Approva in blocco (#7): il piano mensile propone 30 contenuti, ma la review è settimanale con "approva tutto tranne questi", non 30 push singoli (un PMI con 30 firme da fare chiude l'app).
- Stato "nessun canale connesso" (#9): gate soft all'ingresso ("collega un canale per pubblicare"), ma si crea comunque (download manuale come fallback — molte PMI postano a mano).
- Smontare i controlli tecnici già spediti (#10): la UI attuale (
ContentCreatorPage) mostra selettore ratio, style preset, checkbox "doppio passaggio Gemini", prompt visivo, char-counter. Contraddice "3 tap". Vanno derivati/nascosti dietro "Tono e dettagli". - Preset (#11): max 4-5 per settore, ordinati per rilevanza temporale (il "martedì vuoto" sale di martedì) + "Altro: dimmi cosa vuoi" a testo libero (riusa
sector-detection). - Lingua (#12): aggiungere
fr(Romandia) e trattare la lingua come dimensione di derivazione (1 concept → varianti per lingua). In-quota (il testo è centesimi). - Video: guardalo prima (#13): il gate differenzia per modalità — caption/immagine = stack swipe rapido; video = player full-screen, approva dopo la visione (play loggato = bonus attestazione Art.50(4)).
- Ritorno metriche (#14): "Oggi"/"Libreria" mostra il post pubblicato con le sue metriche (read-only da Marketing) e il segnale "questo ha funzionato" rientra in
content_brand_memory. Chiude il ciclo crea→pubblica→impara.
9. Roadmap a fasi (mappata al gate 22 Giu)
FASE A — demo del gate (entro 22 Giu): "genera un post reale, onesto, sovrano sul testo"
Obiettivo: in demo il founder genera un post (testo + immagine) nel brand del cliente, lo vede nel calendario, con label AI. Già fatto oggi: endpoint testo sicuro + flusso + calendario + seed settore.
- [ ] P0 sicurezza/sovranità testo: migrare
generate-text.tsda endpoint consumer Google a Vertex AI EU + cablarepseudonymizePii()+ smettere di scrivere il prompt grezzo (G1/G3). Bloccare in prod l'endpoint consumer (hard-fail). - [ ] Decisione riconciliazione
content_items/social_posts(§2) — scritta, prima della migration. - [ ] Immagine sovrana: agganciare la generazione immagine (oggi
generate-social-mediaGemini consumer) al gateway → FLUX Azure EU o Imagen Vertex EU, nel flusso che ho già wirato. Un concept → caption + immagine nei formati giusti = la demo "wow". - [ ] Label Art.50 sull'immagine (C2PA backend) + EXIF strip.
FASE B1 — motore multimodale (luglio): video + voce + job async
- [ ] Migration additiva completa (§4) via Dashboard.
- [ ] Gateway + adapter (Vertex/Azure/Mistral/fal) + state machine + format-derivation.
- [ ] Endpoint
generate/status/approve/schedule+ worker Inngest durabile + cost kill-switch (hard-cap media già qui). - [ ] Video (Veo Fast EU) con editing post-generazione + "guardalo prima". Voce preset (no cloning).
- [ ] Brand auto-learning loop + ritorno metriche.
FASE B2 — motore a piano + autonomia (agosto)
- [ ] Co-direttore mensile (
content_plans) + approva-in-blocco settimanale. - [ ] Autonomia off/semi/auto con tetto conservativo e budget hard in Auto.
- [ ] Modalità sovranità totale come interruttore (e da qui in poi si può vendere il claim).
FASE C — premium (post-MVP)
- [ ] Voice cloning consent-safe · CGI 3D prodotto · multilingua completo (fr/de/en) · upscale avanzato.
10. Decisioni aperte per il founder (con raccomandazione)
| # | Decisione | La mia raccomandazione |
|---|---|---|
| 1 | Content Studio parte da Pro? (Free/Starter senza il pianeta) | Sì. È il primo gancio di upsell chiaro ("vuoi creare contenuti → Pro"). Allineato al canon. |
| 2 | Quota video: confermi 40s Pro / 120s Business? (in secondi, non clip) | Sì. È la singola correzione che neutralizza l'errore costo. Default reel 8s audio-off + voce separata. |
| 3 | CGI 3D: inclusa o add-on? | Fuori dal mensile finché il COGS reale non è confermato <$6. "1 render incluso" come gancio, resto a CHF 12. |
| 4 | Quota voce 5/20 al mese (numero mio, additivo) | Annotare in decisions-log.md se ok. Default TTS preset, cloning solo premium con consenso. |
| 5 | Vendere il claim "sovranità/a norma" ORA o dopo? | Dopo. Solo quando il routing EU è costruito e testato (Fase B1+). Prima è rischio legale tuo. |
| 6 | generate-outreach.ts (S2): chi lo fixa e quando? |
Subito, è live con PII verso Mistral. Da coordinare con Sessione 2 (verifyUser + LIA). |
| 7 | Higgsfield: solo riferimento UX o valutarne l'uso manuale founder-side? | Solo riferimento UX. Come backend è categoria OpenRouter (vietato). Tu puoi usarlo a mano per ispirazione. |
11. Caveat di onestà (da non spacciare per certezze)
- L'esonero Art.50(4) via review umana è la lettura corrente; il Code of Practice è in 2º draft (mar 2026). Validare con skill
multiverbe-ch-complianceprima di ogni claim legale nel prodotto. - revFADP non ha l'equivalente diretto dell'Art.50: l'obbligo stringente di etichettatura è UE, scatta per i clienti che pubblicano verso utenti UE.
- Prezzi Gemini 3.5 / Cohere Command A non pubblicati con certezza → default resta Gemini 2.5 Flash (prezzo noto).
- "Voxtral = parità ElevenLabs" è un claim vendor → A/B reale sulle voci IT prima di metterlo default.
- Indemnity Imagen ambigua → non è un claim sicuro finché non confermato per iscritto da Google.
- COGS CGI ~$5 non verificato → possibile margine 50%, per questo CGI fuori dal mensile finché non confermato.
- Lock-in Veo: è l'unico video sovrano EU senza vero secondo fornitore, e il suo prezzo è il più volatile della stack. Serve un floor di margine sui pacchetti video che si ricalcola se Google muove il listino.
- Valori "lunghezza caption / hashtag / durata ottimale" sono medie di tool commerciali, non output algoritmici → A/B-testabili. I valori px/ratio/codec sono solidi.
Documento di lavoro. Le sezioni tecniche (schema, routing, costi) sono pronte per l'implementazione; le decisioni di §10 e i caveat di §11 restano al founder. Prossimo passo operativo: chiudere i P0 di Fase A per la demo del 22 giugno.