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>
134 lines
5.6 KiB
Markdown
134 lines
5.6 KiB
Markdown
---
|
|
milestone: v1
|
|
audited: 2026-03-09T11:30:00Z
|
|
status: tech_debt
|
|
scores:
|
|
requirements: 46/46
|
|
phases: 4/4
|
|
integration: 4/4
|
|
flows: 4/4
|
|
gaps: []
|
|
tech_debt:
|
|
- phase: cross-phase
|
|
items:
|
|
- "Pipeline singleton non invalidato quando API key cambia (routers/generate.py righe 109-117)"
|
|
- "Campo campagna inviato nel POST /export ma ignorato dal backend (hooks.ts riga 185)"
|
|
- "Job interrotti durante restart container non recuperabili"
|
|
- phase: 03-organization-layer
|
|
items:
|
|
- "brand_name hardcoded in generation_pipeline.py riga 290"
|
|
---
|
|
|
|
# Milestone v1 Audit Report — PostGenerator
|
|
|
|
**Milestone:** v1 — MVP Content Marketing Automation
|
|
**Audited:** 2026-03-09T11:30:00Z
|
|
**Status:** TECH_DEBT (no blockers, accumulated debt)
|
|
|
|
## Scores
|
|
|
|
| Area | Score | Details |
|
|
|------|-------|---------|
|
|
| Requirements | 46/46 | Tutti i requisiti v1 soddisfatti |
|
|
| Phases | 4/4 | Tutte le fasi completate e verificate |
|
|
| Integration | 4/4 | Cross-phase wiring verificato |
|
|
| E2E Flows | 4/4 | Tutti i flussi utente funzionanti |
|
|
|
|
## Phase Verification Summary
|
|
|
|
| Phase | Status | Score | Critical Gaps |
|
|
|-------|--------|-------|---------------|
|
|
| 01 - Core Generation Pipeline | gaps_found → RISOLTO | 3/5 → 5/5 | Slot-merge gap corretto in Phase 2 |
|
|
| 02 - Prompt Control + Output Review | passed | 16/16 | Nessuno |
|
|
| 03 - Organization Layer | passed | 5/5 | Nessuno |
|
|
| 04 - Enrichment | passed | 5/5 | Nessuno |
|
|
|
|
### Phase 1 Gap Resolution
|
|
|
|
Il gap critico originale (result.slot undefined in PostCard) e' stato **risolto**:
|
|
- `OutputReview.tsx` righe 32-41: merge CalendarSlot in PostResult via `jobData.calendar?.slots`
|
|
- `GenerateResponse.calendar` popolato correttamente da `generation_pipeline.py` riga 205
|
|
- BadgePN, BadgeSchwartz, metadata e retry/regen funzionano tutti
|
|
|
|
## Requirements Coverage
|
|
|
|
Tutti i 46 requisiti v1 sono soddisfatti:
|
|
|
|
| Area | Requirements | Status |
|
|
|------|-------------|--------|
|
|
| Calendar & Campaign | CAL-01..07 (7) | Tutti Complete |
|
|
| Format Selection | FMT-01..02 (2) | Tutti Complete |
|
|
| LLM Generation | LLM-01..06 (6) | Tutti Complete |
|
|
| Prompt System | PRM-01..05 (5) | Tutti Complete |
|
|
| CSV & Export | CSV-01..04 (4) | Tutti Complete |
|
|
| Image Keywords | IMG-01..04 (4) | Tutti Complete |
|
|
| Swipe File | SWP-01..04 (4) | Tutti Complete |
|
|
| Web UI | UI-01..08 (8) | Tutti Complete |
|
|
| Infrastructure | INF-01..06 (6) | Tutti Complete |
|
|
|
|
## E2E Flow Verification
|
|
|
|
| Flow | Status | Details |
|
|
|------|--------|---------|
|
|
| 1. Genera Calendario → Progress → Review → CSV | Funzionante | Pipeline completa, polling 2s, merge slot, download CSV con edits |
|
|
| 2. Swipe File → Topic Override → Generazione | Funzionante | CRUD swipe + picker inline + override pre-LLM + mark-used |
|
|
| 3. Prompt Editor → Genera → Rigenera singolo | Funzionante | CRUD prompts, file letti a runtime, regen con topic/notes override |
|
|
| 4. Unsplash Config → Genera → Thumbnail + CSV URLs | Funzionante | Settings API key, UnsplashService con cache, resolve keyword→URL, thumbnail lazy |
|
|
|
|
## Cross-Phase Integration
|
|
|
|
| From | To | Via | Status |
|
|
|------|----|-----|--------|
|
|
| Phase 1 (GenerationPipeline) | Phase 2 (Regen) | POST /generate/single + PostCard handleRegen | WIRED |
|
|
| Phase 1 (CalendarService) | Phase 3 (Topic Override) | CalendarRequest.topic_overrides | WIRED |
|
|
| Phase 1 (CSVBuilder) | Phase 4 (Unsplash) | image_url_map in build_csv() | WIRED |
|
|
| Phase 2 (OutputReview localResults) | Phase 4 (Thumbnails) | PostCard cover_image_keyword startsWith(http) | WIRED |
|
|
| Phase 3 (SwipeService) | Phase 1 (GenerateCalendar form) | useSwipeItems + topicOverrides state | WIRED |
|
|
| Phase 4 (UnsplashService) | Phase 1 (Pipeline) | _resolve_unsplash_keywords after batch | WIRED |
|
|
|
|
## Tech Debt
|
|
|
|
### Media Priorita'
|
|
|
|
**1. Pipeline singleton non invalidato su API key change**
|
|
- File: `backend/routers/generate.py` righe 109-117
|
|
- Impatto: Utente che cambia API key via Settings deve riavviare il container
|
|
- Fix: Invalidare `_pipeline_instance = None` nel PUT /settings quando api_key cambia
|
|
|
|
### Bassa Priorita'
|
|
|
|
**2. Campo campagna inviato inutilmente nel POST export**
|
|
- File: `frontend/src/api/hooks.ts` riga 185
|
|
- Impatto: Nessuno (Pydantic ignora campi extra), solo rumore
|
|
- Fix: Rimuovere `campagna` dal payload frontend o aggiungerlo al schema backend
|
|
|
|
**3. brand_name hardcoded in generation_pipeline.py**
|
|
- File: `backend/services/generation_pipeline.py` riga 290
|
|
- Impatto: Brand name non personalizzabile senza modifica codice
|
|
- Fix: Leggere da settings.json (commento nel codice indica intenzione futura)
|
|
|
|
**4. Job interrotti durante restart non recuperabili**
|
|
- Impatto: Job in-flight durante restart sono persi
|
|
- Fix: Salvare stato intermedio su disco durante la generazione (non prioritario per uso single-user)
|
|
|
|
### Totale: 4 items across 2 aree (1 media, 3 bassa)
|
|
|
|
## Human Verification Pending
|
|
|
|
Le seguenti verifiche richiedono il deployment su VPS e un test manuale:
|
|
|
|
1. **Web UI accessibile** su https://lab.mlhub.it/postgenerator/
|
|
2. **Generazione end-to-end** con API key Anthropic reale
|
|
3. **CSV in Excel** con caratteri italiani intatti
|
|
4. **Unsplash thumbnails** con API key Unsplash reale
|
|
5. **Persistenza dati** Swipe File dopo restart container
|
|
|
|
## Conclusion
|
|
|
|
Il milestone v1 e' **funzionalmente completo**. Tutti i 46 requisiti sono implementati e verificati a livello di codice. I 4 flussi E2E sono collegati correttamente cross-fase. Il tech debt accumulato e' minimo (4 items, nessuno bloccante) e puo' essere accettato per procedere al deploy e alla validazione umana.
|
|
|
|
---
|
|
|
|
_Audited: 2026-03-09T11:30:00Z_
|
|
_Auditor: Claude Opus 4.6 (gsd-audit-milestone orchestrator) + Claude Sonnet 4.6 (gsd-integration-checker)_
|