@@ -1457,6 +1457,143 @@ file `web/app/api/reports/route.ts` (89 righe, 100% mock).
14571457
14581458---
14591459
1460+ ## 🐛 21. ` applications.status ` mai promosso da ` draft ` a ` ready ` dopo Critic PASS
1461+
1462+ ** Sintomo** (rilevato 2026-05-17 ~ 14:30 UTC dalla pagina ` /ready ` ):
1463+
1464+ | Fonte | Cosa dice |
1465+ | ---| ---|
1466+ | Pagina ` /ready ` cloud | CV PRONTI: ** 0** / IN ATTESA CV: 13 |
1467+ | Capitano via Telegram | * "12 CV ready"* (msg 13:14) / * "4 CV ready (Bending, Rinse, Gr4vy, Canonical)"* (00:58) |
1468+ | ` pipeline_overview.png ` (Capitano) | Ready: ** 12** |
1469+ | ** DB SQLite locale ` /jht_home/jobs.db ` ** | ` applications ` = 31 totali, ** TUTTE ` status='draft' ` ** ❌ |
1470+ | Stessa query | ` positions ` = 62 excluded, 13 ready, 10 scored |
1471+
1472+ Tre "verità" diverse:
1473+ - ** Capitano** dice 12 ready (e ha ragione concettualmente: 12 CV con
1474+ Critic PASS, PDF pronto)
1475+ - ** DB** dice 0 ready (e ha ragione tecnicamente: nessuna application
1476+ ha ` status='ready' ` )
1477+ - ** Cloud ` /ready ` ** dice 0 ready (riflette il DB)
1478+
1479+ La pagina web è corretta; il bug è a monte: ** nessuno aggiorna
1480+ ` applications.status ` da ` 'draft' ` a ` 'ready' ` quando il Critic dà PASS
1481+ e il PDF viene generato** .
1482+
1483+ ** Causa** — manca lo step di promotion. Flow attuale:
1484+
1485+ ```
1486+ 1. Scrittore-1 crea draft → INSERT applications (status='draft')
1487+ 2. Critic legge draft + dà voto → write critic_score, critic_notes
1488+ 3. Critic 5.5/10 PASS → ???
1489+ 4. Scrittore-1 genera PDF → UPDATE applications SET cv_path=..., cv_pdf_path=...
1490+ 5. PDF ready → 🚨 NESSUNO esegue: UPDATE applications SET status='ready'
1491+ ```
1492+
1493+ L'evidenza: nei ` wire.jsonl ` Capitano/Scrittore di ` _skills/critic-loop/ `
1494+ e ` _skills/db-update/ ` probabilmente la transizione ` status='ready' `
1495+ non è scritta da nessuna parte. Il Critic riconosce visivamente "PASS"
1496+ nel suo report, ma quel concetto non viene tradotto in DB update.
1497+
1498+ ** Conseguenze a cascata** :
1499+
1500+ 1 . ** Bug #20 (` /reports ` mock)** difficile da fixare a metà strada:
1501+ anche se sostituiamo i mock con query Supabase reali, mostreranno
1502+ sempre 0 perché ` applications.status='ready' ` è 0.
1503+ 2 . ** Pagina ` /applications ` ** probabilmente mostra 31 draft tutti
1504+ "incompleti" — l'utente non vede mai uno stato "pronto".
1505+ 3 . ** Bug #9 (` submit-application ` skill mancante)** auto-bloccato:
1506+ anche se aggiungiamo la skill, dovrebbe pescare solo
1507+ ` WHERE status='ready' ` → 0 record → niente da spedire mai. Il bug
1508+ #9 non si può manifestare finché #21 non è chiuso.
1509+ 4 . ** Trust del Capitano** : il Capitano dice * "ready"* nei suoi report
1510+ ma il DB lo smentisce. Manuale del Capitano e schema DB non sono
1511+ allineati semanticamente.
1512+
1513+ ** Fix proposto** — aggiungere lo step di promotion in 1 di 2 punti:
1514+
1515+ ### Opzione A — Critic chiude con UPDATE atomic
1516+
1517+ In ` agents/_skills/critic-loop/SKILL.md ` aggiungere step finale:
1518+
1519+ ```
1520+ 4. Dopo verdetto:
1521+ - Se PASS: UPDATE applications SET status='ready', ready_at=NOW(),
1522+ critic_score=X, critic_verdict='PASS'
1523+ WHERE id=<app_id>
1524+ - Se FAIL: UPDATE applications SET status='draft' (resta),
1525+ critic_score=X, critic_verdict='FAIL',
1526+ critic_notes='<motivo>'
1527+ WHERE id=<app_id>
1528+ - Se REWRITE: UPDATE applications SET status='rewrite_requested'
1529+ WHERE id=<app_id> (per Scrittore loop)
1530+ ```
1531+
1532+ ### Opzione B — Scrittore promuove dopo PDF generation
1533+
1534+ In ` agents/_skills/cv-generate/SKILL.md ` (o pdf-generate) aggiungere
1535+ ultimo step:
1536+
1537+ ```
1538+ 5. Dopo generazione PDF + Critic PASS confermato:
1539+ UPDATE applications
1540+ SET status='ready', cv_pdf_path=<path>, ready_at=NOW()
1541+ WHERE id=<app_id>
1542+ ```
1543+
1544+ ** Raccomandazione** : ** Opzione A** — il Critic è il "gate" naturale
1545+ (PASS/FAIL), e la promotion è semanticamente "il Critic approva il
1546+ draft". Coerente con il flusso di approvazione.
1547+
1548+ ** Aggiunta a ` db-update ` SKILL.md** : regola esplicita
1549+ * "applications.status='ready' è SOLO impostabile dal Critic, mai
1550+ direttamente dallo Scrittore"* — gate single-writer.
1551+
1552+ ** Dipendenze** :
1553+ - Bug ** #14 ** (state-event log): se attivo, la transition
1554+ ` draft → ready ` viene loggata automaticamente con ` by_agent='critico-s1' ` .
1555+ - Bug ** #9 ** (submit-application): si sblocca DOPO il fix di #21 — la
1556+ skill ` submit-application ` deve filtrare ` WHERE status='ready' ` e
1557+ promuovere a ` 'sent' ` dopo invio.
1558+ - Bug ** #20 ** (` /reports ` mock): si sblocca dopo #21 perché la pagina
1559+ potrà finalmente mostrare numeri reali invece di mock.
1560+
1561+ ** Priorità** : ** alta** . È il ** gate stato-tabella** che disallinea
1562+ Capitano/Critic concettuali dal DB. Sblocca contemporaneamente #9 , #20 ,
1563+ e parzialmente #14 .
1564+
1565+ ** Effort** : piccolo. ~ 10-20 righe in ` critic-loop/SKILL.md ` + 1 regola
1566+ in ` db-update/SKILL.md ` + retrofit eventuale: una query SQL
1567+ ` UPDATE applications SET status='ready' WHERE id IN (...) ` per
1568+ promuovere retroattivamente le 12 application con ` critic_verdict='PASS' `
1569+ attualmente in ` draft ` .
1570+
1571+ ** Validazione** :
1572+ - Dopo fix: nuovo flow Scrittore→Critic deve risultare in
1573+ ` applications.status='ready' ` per i PASS.
1574+ - Query SQL di verifica:
1575+ ``` sql
1576+ SELECT status, critic_verdict, COUNT (* )
1577+ FROM applications
1578+ GROUP BY status, critic_verdict;
1579+ ```
1580+ Atteso: tutte le righe con ` critic_verdict='PASS' ` hanno
1581+ ` status='ready' ` . Nessun ` status='draft' ` con ` critic_verdict='PASS' ` .
1582+ - Pagina ` /ready ` deve mostrare 12 CV PRONTI (corrispondenti ai 12 PASS).
1583+
1584+ ** Riferimento conversazionale** : snapshot pagina ` /ready ` 2026-05-17,
1585+ DB locale ` /jht_home/jobs.db ` ispezionato via SSH.
1586+
1587+ ** Bug collegati / catena** :
1588+ - ** #21 sblocca #9 ** : senza promotion, submit-application non ha cosa spedire.
1589+ - ** #21 sblocca #20 ** : senza promotion, /reports vede 0 ready ovunque.
1590+ - ** #14 ** : se attivo, registra la promotion come event log.
1591+ - ** #17 ** (Capitano passivo): il Capitano avrebbe dovuto notare la
1592+ divergenza tra "12 ready" detto a voce e "0 ready" nel DB, ma non
1593+ ha mai fatto query di verifica ` SELECT status FROM applications ` .
1594+
1595+ ---
1596+
14601597## 📋 Riepilogo priorità
14611598
14621599| # | Bug | Priorità | Effort |
@@ -1471,6 +1608,7 @@ file `web/app/api/reports/route.ts` (89 righe, 100% mock).
14711608| 18 | ** Dottore mai spawnato** (watchdog non lo include) | ** alta** | piccolo-medio |
14721609| 19 | ** Capitano non sa weekly reset Kimi** (dato + C-06 indaga) | media-alta | piccolo |
14731610| 20 | 🚨 ** ` /reports ` 100% mock** — zero query Supabase | ** alta** | piccolo-medio |
1611+ | 21 | 🚨 ** ` applications.status ` mai promosso draft→ready** dopo Critic PASS | ** alta** | piccolo |
14741612| 3 | Capitano gerarchia utente > Sentinella | media | piccolo (prompt) |
14751613| 4 | Performance band 85-95% rispettata | media | piccolo (post #2 +#3 ) |
14761614| 7 | Sync history conversazione su web | media | medio |
0 commit comments