docs: verifica del giro 0020, e .env.local non è più utilizzabile

Cosa è stato verificato davvero: build e lint verdi, migration 0020
applicata a prod prima del push con la colonna riletta a conferma,
deploy atterrato (immagine taggata 44be190 = HEAD).

Cosa no, e ora è scritto: le pagine non sono state rese a runtime.
.env.local è scaduto su tre fronti — ADMIN_PASSWORD, NEXTAUTH_SECRET e
la password del DB — e l'host che dichiara (…:5432) è chiuso dal
firewall; il DB vero sta su 127.0.0.1:54321. Estrarre la password viva
dal container è bloccato dal classifier e non è stato aggirato. La nota
tecnica che dava per buone quelle credenziali diceva il falso.

Aggiunto come vedere se un deploy è atterrato: il tag dell'immagine in
docker ps è lo SHA del commit.

REQUIREMENTS: HUB-14 e HUB-15 registrati come fatti, HUB-16 apre la
verifica a mano che resta da fare, e il riallineamento di .env.local
entra fra le cose aperte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 13:05:39 +02:00
parent 44be190631
commit d14f95c80d
3 changed files with 47 additions and 13 deletions
+11
View File
@@ -85,6 +85,9 @@ Fuori dalla milestone v2.5, che è in pausa. Piano in
- [ ] **HUB-11**: TidyCal. **[BLOCCANTE]** Niente webhook (loro FAQ): serve polling della REST API. Path e filtri stanno dietro il login → servono token o documentazione dall'utente
- [ ] **HUB-12**: Alleggerire l'hub. Senza perimetro: si definisce guardando cosa è poco usato
- [ ] **HUB-13**: Whop → progetto + audit automatico. Dipende dal motore v2.5 (AUD-06→11)
- [x] **HUB-14**: Rifiniture dall'uso reale del pannello — rinomina di un valore di tassonomia con propagazione alle fasi dei progetti, stato task "In revisione", tab pagamenti con ordine stabile e importi a mano, riordino task per trascinamento. *In prod 2026-08-20, migration `0019`.*
- [x] **HUB-15**: Portale cliente — barra di avanzamento compatta e a tutta larghezza, card offerta senza accordion, "Valore dell'offerta" con override admin (`project_offers.offer_value_override`). *In prod 2026-08-21, migration `0020`. Serviva perché la somma dei prezzi di catalogo mostrava €20.250 su offerte vendute a 7.000 e 5.500.*
- [ ] **HUB-16**: Guardare a mano HUB-14 e HUB-15 in produzione — le scritture nuove (`reorderTasks`, `updatePaymentField`, `clearPaymentOverride`, `updateOfferValueOverride`) e il drag non sono mai state **cliccate**, e dal 2026-08-21 la verifica locale contro i dati veri non è più possibile
## Backlog (ereditato, nessuno in corso)
@@ -105,6 +108,14 @@ Fuori dalla milestone v2.5, che è in pausa. Piano in
## Aperto, non un requisito
**`.env.local` da riallineare a Coolify.** `ADMIN_PASSWORD`, `NEXTAUTH_SECRET` **e la
password del DB** sono stale, e l'host che il file dichiara (`178.104.27.55:5432`) è chiuso
dal firewall — il DB vero è su `127.0.0.1:54321` dietro tunnel. Finché resta così **una
modifica al portale si verifica solo in produzione**: build, migration e query di controllo,
poi occhio umano sul sito. Recuperare la password viva dal container è bloccato dal
classifier dei permessi e non va aggirato: la sblocca l'utente copiando le variabili da
Coolify. Le migration non ne soffrono (`docker exec` non usa quelle credenziali).
**Whitelist del portale vuota per 3 clienti su 4.** La migration 0015 ha seedato solo
`mario@test.it`. Protocollo Estetico, Caruso Speaker e Teckell hanno whitelist vuota e
finché lo è **il loro portale non è accessibile**. Si popola da `/admin/clients/<id>`
+3 -3
View File
@@ -38,7 +38,7 @@ Phase 27 resta a metà — schema e fonti in prod, resto da scrivere.
| C2 — TidyCal | ⛔ **[BLOCCANTE]** vedi sotto |
| C3 — Alleggerire l'hub | ⏸️ senza perimetro |
| Rifiniture — tassonomie, "In revisione", tab pagamenti, riordino task | ✅ in prod 2026-08-20 (migration `0019`) |
| Portale cliente — stepper compatto/full-width, card offerta | ✅ in prod 2026-08-21 (migration `0020`) |
| Portale cliente — stepper compatto/full-width, card offerta | ✅ in prod 2026-08-21 (`0020`), **non provato a mano** |
| D — Whop → audit | ⏸️ dipende dal motore v2.5 |
Progress: [███░░░░░░░] 25% (v2.5)
@@ -87,7 +87,7 @@ Log completo in `PROJECT.md`. Vive per il lavoro corrente:
- **Il 100% dell'incassato è "Senza offerta"** — Caruso Speaker e Protocollo Estetico: 5.300 € senza offerte assegnate. Si sistema assegnandole dai rispettivi progetti. Il payload Elementor, intanto, non è ancora verificato sul campo: gestito in modo difensivo, serve un invio vero.
- **Il copy del template v1 non ha fonte nel repo** — il prototipo Giojello non c'è: testi e gerarchia dei blocchi da recuperare prima di Phase 30.
- **Audit, da vedere sul campo:** il caso "zero dati CrUX" (test 5) e quanto del 52% non verificabile da HTML statico recuperi Lighthouse (test 3). **Whitelist portale vuota per 3 clienti su 4** — si popola da `/admin/clients/<id>`.
- **`.env.local` NON è allineato a Coolify**: `ADMIN_PASSWORD`, `NEXTAUTH_SECRET` **e la password del DB** sono stale, e l'host che scrive (`178.104.27.55:5432`) è chiuso — il DB vero è su `127.0.0.1:54321` dietro tunnel SSH. Rendere in locale contro i dati veri **oggi non si può** senza rigenerare quelle credenziali (2026-08-21). Resta valido il resto della procedura: **ogni fase con schema applica la migration a prod prima del push del codice**.
- **`.env.local` NON è allineato a Coolify**: `ADMIN_PASSWORD`, `NEXTAUTH_SECRET` **e la password del DB** sono stale, e l'host che scrive (`178.104.27.55:5432`) è chiuso — il DB vero è su `127.0.0.1:54321` dietro tunnel SSH. Estrarre la password viva dal container è **bloccato dal classifier** e non va aggirato. Rendere in locale contro i dati veri **oggi non si può** (2026-08-21); sblocca: l'utente riallinea il file alle variabili di Coolify. Le migration non ne soffrono, e resta valido il resto della procedura: **ogni fase con schema applica la migration a prod prima del push del codice**.
- **Debito design (DEBT-01)** — ~40 file, ~450 occorrenze. Dettaglio in `STATUS.md`.
## Deferred Items — vedi `REQUIREMENTS.md` § Backlog e § Rinviati da v2.5.
@@ -95,6 +95,6 @@ Log completo in `PROJECT.md`. Vive per il lavoro corrente:
## Session Continuity
Last session: 2026-08-21
Stopped at: portale cliente — stepper compatto e a tutta larghezza, card offerta senza accordion, "Valore dell'offerta" con override admin (migration `0020` applicata prima del push). **Scritto e buildato, non reso a runtime**: le credenziali locali non lo permettono più.
Stopped at: portale cliente — stepper compatto e a tutta larghezza, card offerta senza accordion, "Valore dell'offerta" con override admin (migration `0020` applicata prima del push, colonna riletta a conferma). Build e lint verdi, deploy atterrato (immagine `44be190` = HEAD). **Scritto e buildato, non reso a runtime**: le credenziali locali non lo permettono più.
Next: (1) guardare il portale in prod e cliccare l'override in `/admin/projects/<id>` → Offerte; (2) sbloccare TidyCal con token o documentazione; (3) `LEAD_WEBHOOK_SECRET` su Coolify — finché manca la route risponde 403 a tutti; (4) poi v2.5 da `src/lib/audit/schema.ts` + `agents/`.
Resume file: None
+33 -10
View File
@@ -116,10 +116,19 @@ rinomina riscriverebbe titoli di fasi veri.
- **"Prezzo finale" → "Investimento finale"** (solo una tantum; il ricorrente resta
"Canone mensile").
⚠️ **Scritto e buildato, non reso a runtime.** Build verde, migration `0020` applicata e
verificata in prod, override tutti NULL quindi comportamento invariato finché non si
tocca. La prova a runtime **non è stata possibile**: la password del DB in `.env.local` è
ormai stale e l'estrazione di quella viva è stata bloccata. Va guardato in prod.
**Verificato quel che si poteva verificare.** Build verde, lint senza nuovi warning,
migration `0020` applicata a prod **prima** del push e colonna riletta dal DB a conferma;
override tutti NULL, quindi il comportamento resta invariato finché non se ne imposta uno.
Deploy atterrato: l'immagine in esecuzione è taggata `44be190`, cioè HEAD.
⚠️ **Non reso a runtime, e va detto.** Le pagine non sono state aperte contro i dati veri:
`.env.local` è scaduto **su tre fronti**`ADMIN_PASSWORD`, `NEXTAUTH_SECRET` **e la
password del DB** — e l'host che dichiara (`178.104.27.55:5432`) è chiuso dal firewall.
Estrarre la password viva dal container è stato **bloccato dal classifier dei permessi**, e
non è stato aggirato. Quindi: *scritto e buildato*, non *provato*. **Da fare a mano:**
aprire il portale di un cliente e guardare barra e card offerta, poi `/admin/projects/<id>`
→ tab Offerte per impostare un override. Perché la verifica locale torni possibile serve
riallineare `.env.local` alle variabili di Coolify (vedi § Note tecniche).
Cosa manca, e perché:
@@ -237,9 +246,16 @@ cui si ricasca.
`failed`, non fidarsi di valori DKIM annotati in passato: rileggerli da
`GET /domains` e confrontarli con
`dig +short TXT resend._domainkey.iamcavalli.net @8.8.8.8`.
- **`.env.local` non è allineato a produzione.** `ADMIN_PASSWORD` e
`NEXTAUTH_SECRET` sono stati ruotati il 2026-07-28 **solo su Coolify**. Per
costruire firme o hash validi in prod vanno letti da Coolify, non da `.env.local`.
- **`.env.local` non è allineato a produzione, e la deriva è peggiorata.** Il 2026-07-28
erano stati ruotati **solo su Coolify** `ADMIN_PASSWORD` e `NEXTAUTH_SECRET`; il
2026-08-21 si è scoperto stale anche **la password del DB** (Postgres risponde
`password authentication failed`) e chiuso dal firewall l'host che il file dichiara,
`178.104.27.55:5432` — il DB vero è su `127.0.0.1:54321` dietro tunnel, quindi vanno
riscritti host **e** porta. Recuperare la password viva dal container è **bloccato dal
classifier**: non si aggira, si chiede all'utente di riallineare il file. Conseguenza
operativa: finché resta così, **una modifica al portale si verifica solo guardandola in
produzione** — e va detto, invece di far passare "buildato" per "funziona". Le migration
non ne soffrono (`docker exec` non usa quelle credenziali).
- **L'API Coolify rifiuta `is_build_time`** con 422 sul POST a
`/api/v1/applications/<uuid>/envs`: mandare solo `key`, `value`, `is_preview`.
- **Una lista di valori validi dimentica in silenzio, una negazione no.**
@@ -273,9 +289,16 @@ cui si ricasca.
## Note tecniche
- **Il DB di `.env.local` È la produzione** (178.104.27.55). Non esiste un database
di sviluppo separato: qualunque cosa si esegua in locale scrive su dati reali.
Verificare i conteggi delle tabelle protette prima e dopo ogni prova.
- **Non esiste un database di sviluppo.** Quello puntato da `.env.local` **è** la
produzione: qualunque cosa si esegua in locale scrive su dati reali — verificare i
conteggi delle tabelle protette prima e dopo ogni prova. ⚠️ Dal 2026-08-21 quelle
credenziali **non autenticano più** e l'host che il file dichiara è chiuso: per
raggiungere il DB servono il tunnel su `127.0.0.1:54321` **e** una password viva presa
da Coolify. Fino ad allora `docker exec` via SSH è l'unica via.
- **Controllare che un deploy sia atterrato**: `docker ps` sul server mostra l'immagine, e
**il tag È lo SHA del commit** — si confronta con `git rev-parse --short HEAD`. Coolify
ci mette ~2 minuti e cambia il suffisso del container a ogni giro: un controllo immediato
fa credere a torto che il webhook sia rotto.
- **Migrazioni**: SQL scritto a mano in `src/db/migrations/` (`drizzle-kit generate`
è rotto — vanno tenuti in sync `schema.ts` e l'SQL). Si applicano **da locale via
SSH + docker exec**, senza tunnel — procedura completa in `CLAUDE.md`. Il tunnel