Files
clienthub/.planning/milestones/v2.2-phases/21-agente-ai-generazione-preventivo/21-PLAN.md
T
simone f7eb7eec23 docs(planning): archivia v2.1/v2.2/v2.3 e documenta v2.4
.planning/ documentava in dettaglio cio che era vecchio e per niente cio
che e in produzione: le fasi 11-22 (v2.1 e v2.2, chiuse a giugno) erano
ancora in phases/ mentre v1.0 e v2.0 stavano gia in milestones/, e il
lavoro degli ultimi due mesi - gate OTP e ciclo di vita dei retainer, cioe
quello che gira su hub.iamcavalli.net - non aveva nessuna cartella.

- phases/{11,12,14} -> milestones/v2.1-phases/, phases/{18..22} ->
  milestones/v2.2-phases/. Ora phases/ contiene solo la milestone in
  corso, che e quello che state.cjs conta per il progresso
- v2.1-ROADMAP.md ricostruito: era l'unica milestone senza archivio,
  interrotta dal reset del 19/06 e mai chiusa formalmente
- v2.3-ROADMAP.md + v2.3-REQUIREMENTS.md: v2.3 e stata eseguita fuori dal
  ciclo GSD, non esistono PLAN/SUMMARY per fase. L'archivio E la doc
- REQUIREMENTS.md riscritto per v2.4 con il backlog reale
- phases/13 e phases/26: SUMMARY ricostruiti da commit, migration e
  STATUS.md. 26 e il primo numero libero
- research/: cancellate 4 varianti dello stesso PITFALLS e FEATURES/
  SUMMARY, superati da PROJECT.md. Diverse anti-feature erano ormai
  contraddette dai fatti (il Kanban e stato costruito in Phase 19,
  l'email in v2.3, il time tracking esiste)
- cancellati UI-RULES.md e DESIGN-SYSTEM.md (CLAUDE.md li dichiara
  superseded: impongono l'inverso della regola attuale) e HANDOFF.md,
  fermo al 13/06
- SECURITY-*.md -> security/: audit chiuso, ma i report restano la doc di
  cosa e stato ruotato e perche
- PROJECT.md/MILESTONES.md/ROADMAP.md allineati: milestone corrente v2.4,
  sessione OTP 90gg non 30, migrazioni fino alla 0016

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 22:38:36 +02:00

4.0 KiB

Phase 21+22 — Agente AI Preventivo + Pagina Pubblica Deck

Executed: 2026-06-20 Status: Code complete — pending migration 0010 to prod Model used: claude-opus-4-8 Note: Le fasi 21 (AI generation) e 22 (public page) sono state eseguite in un'unica sessione per coerenza architetturale.


Scope eseguito

Fase 21 — Agente AI (AI-01 / AI-02)

  • @anthropic-ai/sdk@0.105.0 installato
  • ANTHROPIC_API_KEY aggiunta a .env.local
  • src/lib/proposal/schema.ts — Zod schema ProposalContent (sezioni AI)
  • src/lib/proposal/agent.tsgenerateProposalContent() → Claude Opus 4.8, JSON strutturato validato Zod
  • src/lib/proposal/assemble.tsassembleProposal() fonde AI + offerta DB + config consulente
  • src/lib/proposal/profile.ts — config statica consulente (bio, fatti, testimonianze, legal) — editare con dati reali
  • src/lib/proposal/queries.tslistProposals, getProposalById, getProposalBySlug
  • src/app/admin/preventivi/actions.tsgenerateProposalDraft, publishProposal, updateProposalTitle, deleteProposal
  • src/app/admin/preventivi/page.tsx — lista preventivi admin
  • src/app/admin/preventivi/genera/page.tsx + GeneraProposalForm.tsx — builder con pre-fill ?lead_id=X
  • src/app/admin/preventivi/[id]/page.tsx — review bozza + pubblica + elimina
  • src/components/admin/AdminSidebar.tsx — voce "Preventivi" + CTA globale lime "Genera preventivo"
  • src/components/admin/leads/LeadDetail.tsx — pulsante "Genera preventivo" → /admin/preventivi/genera?lead_id=X

Fase 22 — Pagina pubblica deck (PUB-01 / PUB-02)

  • src/app/preventivo/[slug]/page.tsx — server component pubblico, gestisce stati draft/published/accepted/rejected
  • src/app/preventivo/[slug]/actions.tsacceptProposal + rejectProposal con guard immutabilità accepted_at
  • src/components/public/proposal/ProposalDeck.tsx — deck navigabile (frecce ←/→ + dot cliccabili + keyboard), light mode iamcavalli
  • Sezioni (20+): Cover, Vision, Index, ChapterDivider, Strategist, Facts, Testimonials, ProblemNode, SynthesisDiagram, SolutionNode, SolutionSynthesis, Scope, Deliverables, Timeline, Pricing, StagesRecap, ComparisonMatrix, NextSteps, Accept, Closing

Schema DB

  • src/db/migrations/0010_proposals.sqlCREATE TABLE IF NOT EXISTS proposals (...)applicare a prod via SSH prima del push
  • src/db/schema.ts — tabella proposals + relations + Proposal/NewProposal types

Flusso end-to-end

Lead (con transcript) → LeadDetail "Genera preventivo"
→ /admin/preventivi/genera?lead_id=X
→ seleziona offerta → "Genera con AI"
→ server action: legge transcript + offerta → chiama Claude Opus 4.8 → Zod validate
→ assembla AssembledProposal (AI + offerta + config) → salva in proposals (draft)
→ redirect /admin/preventivi/[id] → review bozza → "Pubblica"
→ pagina pubblica /preventivo/[slug] — deck 20+ slide
→ cliente sceglie tier A/B/C → accetta → accepted_at IMMUTABILE

Pending post-push

  1. Migration 0010 a prod via ssh -L 54321:localhost:54321 root@178.104.27.55 + script node
  2. Dati reali in src/lib/proposal/profile.ts — bio, credenziali, testimonianze, contatti, foto URL
  3. ANTHROPIC_API_KEY in Coolify (già in .env.local per dev)
  4. Wave 5 (opzionale) — badge CRM su accept/reject + email Resend

Decisioni architetturali

Decisione Scelta Motivo
Output AI JSON strutturato → template fisso Coerenza visiva garantita, zero rischio HTML rotto
Bio/testimonianze File config profile.ts Editing semplice, no UI v1
Entry point LeadDetail + sidebar globale GSD prescrive LeadDetail; sidebar è additive
content jsonb (non text) Parser automatico postgres-js, type-safe
Modello claude-opus-4-8 Migliore qualità copywriting strategico
Phase split 21+22 eseguite insieme Dipendenza diretta, nessun vantaggio a splitparle