Perfetto. Ora il reset è davvero pulito: Nessun processo della galleria attivo Nessun processo usa SQLite Lock daemon volti assente Lock daemon prototype assente database.sqlite assente WAL e SHM assenti 1. Ricrea il database vuoto cd /home/nvme/dockerdata/prove/s137js || exit 1 node db/init.js Dovresti vedere la creazione delle tabelle e infine: ✅ init completato 2. Verifica subito i conteggi Fallo prima di avviare server o daemon: sqlite3 -header -column \ api_v1/database.sqlite \ " SELECT (SELECT COUNT(*) FROM photos) AS photos, (SELECT COUNT(*) FROM faces) AS faces, (SELECT COUNT(*) FROM persons) AS persons, (SELECT COUNT(*) FROM face_scan_jobs) AS scan_jobs, (SELECT COUNT(*) FROM face_cluster_runs) AS cluster_runs, (SELECT COUNT(*) FROM face_prototype_jobs) AS prototype_jobs, (SELECT COUNT(*) FROM person_face_prototypes) AS prototypes; " Il risultato deve essere: photos faces persons scan_jobs cluster_runs prototype_jobs prototypes ------ ----- ------- --------- ------------ -------------- ---------- 0 0 0 0 0 0 0 3. Verifica specificamente le persone sqlite3 -header -column \ api_v1/database.sqlite \ " SELECT id, user, name, created_at FROM persons; " Deve restituire zero righe. In particolare, Jessica non deve comparire. 4. Verifica che non esistano vecchie run sqlite3 -header -column \ api_v1/database.sqlite \ " SELECT (SELECT COUNT(*) FROM face_cluster_runs) AS cluster_runs, (SELECT COUNT(*) FROM face_clusters) AS clusters, ( SELECT COUNT(*) FROM face_cluster_memberships ) AS memberships, ( SELECT COUNT(*) FROM person_face_reference_exclusions ) AS reference_exclusions, ( SELECT COUNT(*) FROM face_recognition_index_state ) AS recognition_index_states; " Atteso: cluster_runs 0 clusters 0 memberships 0 reference_exclusions 0 recognition_index_states 0 5. Controlla l’integrità sqlite3 \ api_v1/database.sqlite \ "PRAGMA integrity_check;" Atteso: ok 6. Avvia i processi Terminale 1: server cd /home/nvme/dockerdata/prove/s137js || exit 1 npm start Controlla nel log: DB PATH: /home/nvme/dockerdata/prove/s137js/api_v1/database.sqlite Terminale 2: daemon scansione volti cd /home/nvme/dockerdata/prove/s137js || exit 1 npm run face:daemon Terminale 3: daemon prototype cd /home/nvme/dockerdata/prove/s137js || exit 1 npm run prototype:daemon All’avvio, il daemon prototype dovrebbe mostrare: pending_jobs: 0 7. Controlla processi e lock Da un quarto terminale: pgrep -af \ 'runFaceScanDaemon|runPrototypeDaemon|server.js' Controlla i lock: cd /home/nvme/dockerdata/prove/s137js || exit 1 ls -l \ face-scan-daemon.lock \ prototype-worker-daemon.lock Entrambi devono esistere mentre i daemon sono attivi. 8. Verifica nuovamente le persone Dopo l’avvio del server e dei daemon: sqlite3 -header -column \ api_v1/database.sqlite \ " SELECT id, user, name, created_at FROM persons; " Deve essere ancora vuoto. È normale che nel frattempo vengano ricreati automaticamente: photos face_scan_jobs faces embedding Non devono invece essere ricreati automaticamente: persons face_cluster_runs person_face_prototypes person_face_reference_exclusions face_prototype_jobs 9. Attendi il completamento della scansione Controlla: npm run face:status Quando avrai: pending: 0 processing: 0 error: 0 verifica gli embedding: sqlite3 -header -column \ api_v1/database.sqlite \ " SELECT (SELECT COUNT(*) FROM photos) AS photos, (SELECT COUNT(*) FROM faces) AS faces, ( SELECT COUNT(*) FROM faces WHERE length(embedding) = 512 ) AS valid_embeddings, ( SELECT COUNT(*) FROM persons ) AS persons, ( SELECT COUNT(*) FROM face_cluster_runs ) AS cluster_runs; " A scansione conclusa è plausibile ottenere nuovamente: photos 84 faces 30 valid_embeddings 30 persons 0 cluster_runs 0 Solo dopo questa verifica esegui il clustering persistente: npm run face:cluster -- \ --user Fabio \ --scope all \ --min-cluster-size 3 \ --min-samples 2 \ --persist Questa volta la prima run del nuovo database dovrà essere quella appena generata, senza vecchie run precedenti.ù https://prova.patachina.it/faces.html?v=70