diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index 7f406f0..6037f7c 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -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/` → diff --git a/.planning/STATE.md b/.planning/STATE.md index f12db35..5d5ccca 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -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/`. -- **`.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/` → 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 diff --git a/STATUS.md b/STATUS.md index 029d55b..7fd3a6d 100644 --- a/STATUS.md +++ b/STATUS.md @@ -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/` +→ 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//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