{"automazioni":{"attive":11,"elenco":[{"attiva":true,"comando_lancio":"/Users/massimo/Library/Scripts/linkedin/run_flask.sh","descrizione":"Tiene sempre acceso il server web del CRM LinkedIn (porta 5051) e lo\nriavvia automaticamente in pochi secondi se si spegne per qualunque\nmotivo (crash, errore, riavvio del Mac, errore di rete). Grazie a\nquesto watchdog l'app sul telefono trova sempre il server vivo via\nl'URL pubblico Tailscale, anche quando sei fuori casa.\nUsa waitress (server Python di produzione) invece del dev server\ndi Flask che andava in crash per leak di semaphore.\n","has_log":true,"id":"flask-watchdog","label":"com.linkedin-crm.flask","last_run":{"iso":"2026-05-16 10:36","rel":"94g fa"},"log_path":"/Users/massimo/Library/Logs/linkedin/flask_crm.log","nome":"Server CRM (watchdog automatico)","note":"KeepAlive=true + ThrottleInterval=10 nel plist. Se killi il processo\na mano (o va in crash), launchd rilancia waitress entro 10 secondi\nsenza intervento manuale. L'app \"Apri Database LinkedIn\" resta come\nscorciatoia per aprire il browser; non \u00e8 pi\u00f9 l'unica via per avviare\nFlask.\n","plist":"/Users/massimo/Library/LaunchAgents/com.linkedin-crm.flask.plist","schedule_human":"Sempre attivo (riavvio entro 10s se cade)","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/app.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/linkedin/run_flask.sh"},{"attiva":true,"comando_lancio":"/Users/massimo/Library/Scripts/linkedin/run_tailscale_boot.sh","descrizione":"Tiene sempre accesi Tailscale e il Funnel (il tunnel internet che espone\nil CRM al tuo cellulare). Si attiva al login del Mac e ricontrolla ogni\nora: se per qualche motivo Tailscale cade, entro 1 ora torna su da solo.\nServe perche' l'app Tailscale del Mac non ha un'opzione \"parti al login\"\nvisibile, e dopo un riavvio puo' restare spenta.\n","has_log":true,"id":"tailscale-boot","label":"com.linkedin-crm.tailscale-boot","last_run":{"iso":"2026-08-18 22:43","rel":"3h fa"},"log_path":"/Users/massimo/Library/Logs/linkedin/tailscale_boot.log","nome":"Tunnel pubblico CRM (Tailscale, auto-riavvio)","note":"URL pubblico stabile del CRM:\nhttps://macbook-pro-di-massimo-gabellone-3.taile8c9a1.ts.net/\nControlli manuali: `~/bin/tailscale status`, `~/bin/tailscale funnel status`.\n","plist":"/Users/massimo/Library/LaunchAgents/com.linkedin-crm.tailscale-boot.plist","schedule_human":"Avvio al login + controllo ogni ora","schedule_plist":null,"script":"/Users/massimo/Library/Scripts/linkedin/run_tailscale_boot.sh","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/linkedin/run_tailscale_boot.sh"},{"attiva":null,"comando_lancio":"/Users/massimo/Library/Scripts/linkedin/run_auto_export.sh","descrizione":"Ogni giorno alle 9:00 gestisce il ciclo dell'archivio LinkedIn: richiede\nl'export, attende ~24h, scarica il ZIP pronto, importa le nuove\nconnessioni nel DB, aggiorna gli accettati sulle campagne in corso.\nProduce in media 3-4 import a settimana.\n","has_log":true,"id":"auto-export","label":null,"last_run":{"iso":"2026-05-14 09:00","rel":"96g fa"},"log_path":"/Users/massimo/Library/Logs/linkedin/auto_export.log","nome":"Export archivio LinkedIn","note":"Chrome deve essere loggato su LinkedIn. Il wrapper chiude temporaneamente\nla finestra Chrome del CRM (profilo DatabaseLinkedIn-ChromeProfile) se e'\naperta, perche' altrimenti AppleScript parla con quella istanza non\nloggata e il download salta. Il Flask del CRM resta up, la finestra\nviene riaperta automaticamente a fine run. Window handle AppleScript\nusa `id` stabile (non `index`, che cambia col focus).\n","plist":"/Users/massimo/Library/LaunchAgents/com.linkedin-auto-export.plist","schedule_human":"Ogni giorno alle 9:00 (+ al login)","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/linkedin_auto_export.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/linkedin/run_auto_export.sh"},{"attiva":false,"comando_lancio":"/Users/massimo/Library/Scripts/linkedin/run_benvenuto.sh","descrizione":"(SEZIONE: AUMENTO CONNESSIONI \u2014 gestione rete, NON offerta commerciale.)\nOgni giorno alle 11:00 invia un messaggio di benvenuto personalizzato\n(per portfolio + lingua) ai nuovi collegamenti accettati che non hanno\nancora ricevuto un messaggio. Apre la chat LinkedIn in finestra Chrome\ninvisibile, pause umane 15-42s tra un messaggio e l'altro.\nUsa la preview (vedi automation \"reminder-preview-benvenuto\") per sapere\nchi escludere o per modificare il testo dei singoli messaggi.\n","has_log":true,"id":"invia-benvenuto","label":"com.linkedin-benvenuto","last_run":{"iso":"2026-04-12 11:00","rel":"128g fa"},"log_path":"/Users/massimo/Library/Logs/linkedin/benvenuto.log","nome":"Aumento connessioni \u2014 Messaggi di benvenuto","note":"Chrome loggato. Finestra renderizza layout desktop (1400x900) invisibile\nall'utente. Internamente: se la tabella benvenuto_preview ha righe\ngenerated_at=oggi e incluso=1, usa quelle (testo incluso eventuali\nmodifiche), altrimenti fallback sulla query originale.\n","plist":"/Users/massimo/Library/LaunchAgents/com.linkedin-benvenuto.plist","schedule_human":"Ogni giorno alle 11:00 (preview alle 10:00)","schedule_plist":{"hour":11,"minute":0,"weekday":null},"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/invia_benvenuto.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/linkedin/run_benvenuto.sh"},{"attiva":true,"comando_lancio":"/Users/massimo/Library/Scripts/linkedin/run_reminder_preview_benvenuto.sh","descrizione":"Ogni giorno alle 10:00 (un'ora prima che partano i messaggi di benvenuto)\nrigenera la preview con gli accettati di oggi e invia un'email di avviso\ncon il numero di messaggi e il link al pannello \"Preview messaggi di\nbenvenuto\". Hai 1 ora per escludere contatti o modificare il testo dei\nsingoli messaggi prima dell'invio delle 11:00.\n","has_log":true,"id":"reminder-preview-benvenuto","label":"com.linkedin-preview-benvenuto","last_run":{"iso":"2026-08-18 10:00","rel":"16h fa"},"log_path":"/Users/massimo/Library/Logs/linkedin/preview_benvenuto.log","nome":"Reminder preview messaggi di benvenuto","note":"Email inviata a info@massimogabellone.com con link http://127.0.0.1:5051/benvenuto-preview.","plist":"/Users/massimo/Library/LaunchAgents/com.linkedin-preview-benvenuto.plist","schedule_human":"Ogni giorno alle 10:00","schedule_plist":{"hour":10,"minute":0,"weekday":null},"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/reminder_preview_benvenuto.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/linkedin/run_reminder_preview_benvenuto.sh"},{"attiva":false,"comando_lancio":"/Users/massimo/Library/Scripts/linkedin/run_campagna.sh","descrizione":"(SEZIONE: AUMENTO CONNESSIONI \u2014 serve a far crescere la rete, NON a vendere.)\nOgni luned\u00ec alle 9:00 invia fino a 100 richieste di collegamento.\nSe hai modificato la selezione nel pannello \"Connessioni consigliate\"\n(Gestione Contatti), usa quella. Altrimenti genera una selezione\nbilanciata automatica sui portfolio attivi (NGO, Fondi, Universit\u00e0,\nCultura). Hard limit 100 ogni 7 giorni (quota LinkedIn). Nota\npersonalizzata in italiano o inglese a seconda della location.\n","has_log":true,"id":"campagna-settimanale","label":"com.linkedin-campagna","last_run":{"iso":"2026-06-15 09:00","rel":"64g fa"},"log_path":"/Users/massimo/Library/Logs/linkedin/campagna.log","nome":"Aumento connessioni \u2014 Richieste settimanali di collegamento","note":"Internamente: se la tabella connessioni_consigliate ha righe incluso=1\nchiama genera_da_preview (in genera_campagna.py), altrimenti\ngenera_campagna bilanciata. Poi invia_richieste.py.\nEsclude i portfolio Business, Musicisti, Pianista.\n","plist":"/Users/massimo/Library/LaunchAgents/com.linkedin-campagna.plist","schedule_human":"Ogni luned\u00ec alle 9:00 (preview alle 8:00)","schedule_plist":{"hour":9,"minute":0,"weekday":1},"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/campagna_settimanale.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/linkedin/run_campagna.sh"},{"attiva":true,"comando_lancio":"/Users/massimo/Library/Scripts/linkedin/run_reminder_preview_campagna.sh","descrizione":"Ogni luned\u00ec alle 8:00 (un'ora prima che parta la campagna di richieste\ncollegamento) invia un'email di avviso con il numero di connessioni\nselezionate e il link al pannello \"Connessioni consigliate\". Hai 1 ora\nper modificare la selezione (includere/escludere contatti o rigenerare\nla lista). Se la preview \u00e8 vuota, la rigenera prima di inviare l'avviso.\n","has_log":true,"id":"reminder-preview-campagna","label":"com.linkedin-preview-campagna","last_run":{"iso":"2026-04-20 08:00","rel":"120g fa"},"log_path":"/Users/massimo/Library/Logs/linkedin/preview_campagna.log","nome":"Reminder preview campagna settimanale","note":"Email inviata a info@massimogabellone.com con link http://127.0.0.1:5051/connessioni-consigliate.","plist":"/Users/massimo/Library/LaunchAgents/com.linkedin-preview-campagna.plist","schedule_human":"Ogni luned\u00ec alle 8:00","schedule_plist":{"hour":8,"minute":0,"weekday":1},"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/reminder_preview_campagna.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/linkedin/run_reminder_preview_campagna.sh"},{"attiva":true,"comando_lancio":"/Users/massimo/Library/Scripts/jobscreening/run_feedback_check.sh","descrizione":"Ogni giorno alle 20:30 fa due passaggi sulle candidature inviate negli\nultimi 30 giorni:\n1) incrocia con le email in Apple Mail e classifica ogni candidatura\n   in CONFERMATO / INVITO / RIFIUTATO / IN_ATTESA / SOSPETTO\n   (Gemini per capire il tipo di email);\n2) per le SOSPETTE via LinkedIn apre davvero la pagina dell'offerta\n   in Chrome e verifica se LinkedIn mostra il badge \"Candidato\":\n   se s\u00ec le conferma, se no le resetta a PERTINENTE cos\u00ec auto_apply\n   le rilancia al prossimo giro (10:00 del giorno dopo).\nLe SOSPETTE non-LinkedIn restano in rosso nel pannello per verifica\nmanuale.\n","has_log":true,"id":"feedback-candidature","label":"com.massimo.feedback-check","last_run":{"iso":"2026-07-16 14:15","rel":"33g fa"},"log_path":"/Users/massimo/Library/Logs/jobscreening/feedback_check.log","nome":"Controllo feedback candidature","note":"Vista utente: http://127.0.0.1:5051/candidature-feedback (bottone\n\"Rilancia analisi\" per eseguire on-demand, bottone \"Verifica su\nLinkedIn\" per rilanciare solo il passaggio 2). Richiede Apple Mail DB\naccessibile (~/Library/Mail/V10/MailData/Envelope Index), GEMINI_API_KEY\ne Chrome loggato su LinkedIn.\n","plist":"/Users/massimo/Library/LaunchAgents/com.massimo.feedback-check.plist","schedule_human":"Ogni giorno alle 20:30","schedule_plist":{"hour":20,"minute":30,"weekday":null},"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/auto_screening/check_application_feedback.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/jobscreening/run_feedback_check.sh"},{"attiva":true,"comando_lancio":"/Users/massimo/Library/Scripts/linkedin/run_reminder_pronte_manuali.sh","descrizione":"(SEZIONE: CANDIDATURE LAVORO \u2014 Tier 2 auto_screening.) Ogni giorno alle\n10:30 (30 min dopo il run auto_screening delle 10:00) manda un'email con\nil numero di offerte in stato PRONTA_MANUALE e il link al pannello\n/pronte-manuali. Sono le offerte che l'automazione non ha potuto chiudere\nda sola (captcha, Workday, Taleo, registrazione) ma che ha gia' preparato\ncon cover letter + URL form + CV: ti basta 1-2 min per ciascuna.\nSe la coda e' vuota, niente email (nessun rumore a vuoto).\n","has_log":true,"id":"reminder-pronte-manuali","label":"com.linkedin-crm.reminder-pronte-manuali","last_run":{"iso":"2026-08-18 10:30","rel":"15h fa"},"log_path":"/Users/massimo/Library/Logs/linkedin/pronte_manuali.log","nome":"Offerte pronte al mattino \u2014 Reminder 10:30","note":"Vista utente: http://127.0.0.1:5051/pronte-manuali. La prima volta che\nsi usa il pannello, trascina il segnalibro \"Compila dati Massimo\" nella\nbarra di Chrome: riempie nome/indirizzo/email/DOB/CAP e incolla la cover\ndal clipboard.\n","plist":"/Users/massimo/Library/LaunchAgents/com.linkedin-crm.reminder-pronte-manuali.plist","schedule_human":"Ogni giorno alle 10:30","schedule_plist":{"hour":10,"minute":30,"weekday":null},"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/reminder_pronte_manuali.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/linkedin/run_reminder_pronte_manuali.sh"},{"attiva":true,"comando_lancio":"/Users/massimo/Library/Scripts/linkedin/run_reminder.sh","descrizione":"Ogni giorno alle 9:00 invia via email il promemoria con connessioni da\nricontattare, scadenze del giorno e attivit\u00e0 aperte nel CRM.\n","has_log":true,"id":"reminder-email","label":"com.linkedin-crm.reminder","last_run":{"iso":"2026-08-18 09:00","rel":"17h fa"},"log_path":"/Users/massimo/Library/Logs/linkedin/reminder.log","nome":"Reminder email quotidiano","note":null,"plist":"/Users/massimo/Library/LaunchAgents/com.linkedin-crm.reminder.plist","schedule_human":"Ogni giorno alle 9:00","schedule_plist":{"hour":9,"minute":0,"weekday":null},"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/send_reminder.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/linkedin/run_reminder.sh"},{"attiva":null,"comando_lancio":"cd \"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation\" && /usr/local/bin/python3 genera_connessioni_consigliate.py","descrizione":"Ricalcola la lista di contatti proposti per la prossima campagna\nsettimanale e la salva nella tabella preview. Stessa logica bilanciata\ndi genera_campagna.py, ma NON tocca scrape_targets: serve solo a\npopolare il pannello /connessioni-consigliate dove puoi modificare la\nselezione prima del luned\u00ec mattina.\nNormalmente viene chiamato dal pannello (pulsante \"Aggiorna lista\")\no dal reminder delle 8:00.\n","has_log":false,"id":"genera-connessioni-consigliate","label":null,"last_run":null,"log_path":null,"nome":"Genera \"Connessioni consigliate\" (preview)","note":"--limit N per cambiare la dimensione della preview (default 100).","plist":null,"schedule_human":"Manuale (dal pannello Connessioni Consigliate)","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/genera_connessioni_consigliate.py","tipo":"manuale","wrapper":null},{"attiva":null,"comando_lancio":"cd \"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation\" && /usr/local/bin/python3 genera_campagna.py","descrizione":"Crea manualmente una campagna di richieste collegamento bilanciata.\nNormalmente viene chiamata dalla campagna settimanale automatica; usala\na mano se vuoi aggiungere una campagna extra o limitare a un solo\nportfolio.\n","has_log":false,"id":"genera-campagna","label":null,"last_run":null,"log_path":null,"nome":"Genera campagna (ad hoc)","note":"Opzioni principali \u2014 --portfolio fondi, --limit 50, --dry-run.","plist":null,"schedule_human":"Manuale","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/genera_campagna.py","tipo":"manuale","wrapper":null},{"attiva":null,"comando_lancio":"cd \"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation\" && /usr/local/bin/python3 invia_richieste.py","descrizione":"Prende i target di una campagna (di default l'ultima generata) e invia\nle richieste di collegamento su LinkedIn con la nota personalizzata.\nChrome invisibile, pause umane. Normalmente viene chiamato dalla\ncampagna settimanale automatica; usalo a mano per riprendere un invio\ninterrotto o per una campagna specifica.\n","has_log":true,"id":"invia-richieste","label":null,"last_run":{"iso":"2026-08-18 10:40","rel":"15h fa"},"log_path":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/invio_YYYYMMDD.log","nome":"Invia richieste di una campagna","note":"Log scritto con data del giorno. --data YYYY-MM-DD per campagna specifica, --dry-run per simulare.","plist":null,"schedule_human":"Manuale","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/invia_richieste.py","tipo":"manuale","wrapper":null},{"attiva":true,"comando_lancio":"/Users/massimo/Library/Scripts/linkedin/run_scrape_viewers.sh","descrizione":"Scarica da LinkedIn Premium la lista di chi ha visto il tuo profilo\nnegli ultimi giorni, fa cross-reference con i target delle campagne\nin corso per evidenziare i lead caldi.\n","has_log":true,"id":"scrape-viewers","label":"com.linkedin-crm.scrape-viewers","last_run":{"iso":"2026-08-14 19:00","rel":"4g fa"},"log_path":"/Users/massimo/Library/Logs/linkedin/viewers.log","nome":"Chi ha visitato il profilo","note":"Richiede LinkedIn Premium loggato in Chrome.","plist":"/Users/massimo/Library/LaunchAgents/com.linkedin-crm.scrape-viewers.plist","schedule_human":"Mercoled\u00ec e Venerd\u00ec alle 19:00","schedule_plist":{"hour":19,"minute":0,"weekday":3},"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/scrape_profile_viewers.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/linkedin/run_scrape_viewers.sh"},{"attiva":true,"comando_lancio":"/Users/massimo/Library/Scripts/linkedin/run_weekly_maintenance.sh","descrizione":"Genera il report settimanale di una campagna ed esporta la lista InMail\nper i lead caldi. Aggiorna automaticamente gli accettati confrontandoli\ncon le nuove connessioni del database.\n","has_log":true,"id":"follow-up","label":"com.linkedin-crm.weekly-maintenance","last_run":{"iso":"2026-08-16 21:00","rel":"2g fa"},"log_path":"/Users/massimo/Library/Logs/linkedin/follow_up.log","nome":"Report campagne + follow-up","note":"Export CSV in automation/campagne/.","plist":"/Users/massimo/Library/LaunchAgents/com.linkedin-crm.weekly-maintenance.plist","schedule_human":"Ogni domenica alle 21:00","schedule_plist":{"hour":21,"minute":0,"weekday":7},"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/follow_up_campagna.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/linkedin/run_weekly_maintenance.sh"},{"attiva":true,"comando_lancio":"/Users/massimo/Library/Scripts/linkedin/run_weekly_maintenance.sh","descrizione":"Dopo 14 giorni senza risposta, segna come ignorati i target in campagna,\nliberando spazio nel funnel. Eseguito automaticamente dopo il follow-up\nsettimanale.\n","has_log":true,"id":"marca-ignorati","label":"com.linkedin-crm.weekly-maintenance","last_run":{"iso":"2026-08-16 21:00","rel":"2g fa"},"log_path":"/Users/massimo/Library/Logs/linkedin/marca_ignorati.log","nome":"Marca richieste ignorate","note":"Soglia predefinita 14 giorni.","plist":"/Users/massimo/Library/LaunchAgents/com.linkedin-crm.weekly-maintenance.plist","schedule_human":"Ogni domenica alle 21:05 (sequenziale al follow-up)","schedule_plist":{"hour":21,"minute":0,"weekday":7},"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/marca_ignorati.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/linkedin/run_weekly_maintenance.sh"},{"attiva":null,"comando_lancio":"cd \"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation\" && /usr/local/bin/python3 genera_preview_ignorati.py","descrizione":"Ricalcola l'elenco di target in campagna da oltre N giorni (default 14)\nsenza accettazione, da marcare ignorati. Popola la tabella\nignorati_preview, tutti inclusi di default. Normalmente viene chiamato\ndal pannello /ignorati-preview (pulsante \"Rigenera\").\n","has_log":false,"id":"genera-preview-ignorati","label":null,"last_run":null,"log_path":null,"nome":"Genera \"Preview target da marcare ignorati\"","note":"--giorni N per cambiare la soglia, --dry-run per simulare.","plist":null,"schedule_human":"Manuale (dal pannello Richieste ignorate)","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/genera_preview_ignorati.py","tipo":"manuale","wrapper":null},{"attiva":null,"comando_lancio":"cd \"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation\" && /usr/local/bin/python3 genera_preview_benvenuto.py","descrizione":"Ricalcola la preview dei messaggi di benvenuto per i nuovi collegamenti\naccettati e la salva nella tabella benvenuto_preview. Ogni messaggio \u00e8\ngia' personalizzato per portfolio e lingua, tutti inclusi di default.\nNormalmente viene chiamato dal pannello /benvenuto-preview (pulsante\n\"Rigenera preview\") o dal reminder delle 10:00.\n","has_log":false,"id":"genera-preview-benvenuto","label":null,"last_run":null,"log_path":null,"nome":"Genera \"Preview messaggi di benvenuto\"","note":"--dry-run per simulare senza scrivere nel DB.","plist":null,"schedule_human":"Manuale (dal pannello Preview messaggi di benvenuto)","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/genera_preview_benvenuto.py","tipo":"manuale","wrapper":null},{"attiva":null,"comando_lancio":"cd \"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation\" && /usr/local/bin/python3 genera_messaggi_benvenuto.py","descrizione":"Per ogni accettato non ancora contattato, calcola il messaggio di\nbenvenuto corretto (portfolio + lingua + link alla landing) e lo\nsalva nel DB pronto per l'invio. Serve quando vuoi preparare i\nmessaggi in batch prima dell'invio automatico delle 11:00.\n","has_log":false,"id":"genera-messaggi-benvenuto","label":null,"last_run":null,"log_path":null,"nome":"Genera messaggi di benvenuto (batch)","note":"--data YYYY-MM-DD per limitare a una campagna.","plist":null,"schedule_human":"Manuale","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/genera_messaggi_benvenuto.py","tipo":"manuale","wrapper":null},{"attiva":null,"comando_lancio":"cd \"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation\" && /usr/local/bin/python3 riscrape_da_rigenerare.py --limit 15","descrizione":"Recupera i profile_url per i contatti in stato \"da_rigenerare\" cercando il \nnome e l'ente direttamente su LinkedIn. Risolve le omonimie e sposta i profili\nsicuri in stato \"nuovo\", pronti per le prossime campagne.\n","has_log":false,"id":"riscrape-da-rigenerare","label":null,"last_run":null,"log_path":null,"nome":"Ricerca url nuove connessioni (riscrape)","note":"Usa Chrome Headless. Esegue ricerche distanziate da pause umane.","plist":null,"schedule_human":"Manuale (quando ci sono profili da rigenerare)","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/riscrape_da_rigenerare.py","tipo":"manuale","wrapper":null},{"attiva":null,"comando_lancio":"cd \"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin\" && ./bulk_scrape.sh","descrizione":"Usa la ricerca di LinkedIn (bulk_scrape.sh) per trovare profili nuovi pertinenti ai\nportfolio attivi (NGO, Fondi, Universit\u00e0, Cultura) e li salva in\nscrape_targets, pronti per le prossime campagne di richieste.\n","has_log":true,"id":"scrape-targets","label":null,"last_run":{"iso":"2026-08-18 11:56","rel":"14h fa"},"log_path":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/scrape_targets.log","nome":"Cerca nuovi target per portfolio (Scouting)","note":"Filtra in automatico per portfolio e max-pages. Lungo, attenzione al rate-limit LinkedIn.","plist":null,"schedule_human":"Manuale (quando il pool target scende sotto ~200)","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/bulk_scrape.sh","tipo":"manuale","wrapper":null},{"attiva":null,"comando_lancio":"cd \"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation\" && /usr/local/bin/python3 invia_offerta.py","descrizione":"(SEZIONE: OFFERTA SERVIZI \u2014 messaggio commerciale a contatti gi\u00e0\naccettati.) Per ogni campagna \"attiva\" del pannello\n/campagne-offerta popola la coda (connessioni accettate da \u226520\ngiorni che matchano il portfolio) e invia fino a \"cadenza\"\nmessaggi al giorno, dai pi\u00f9 vecchi ai pi\u00f9 nuovi. Salta chi ha gi\u00e0\nscritto in chat cose con parole negative chiare. Template per\nportfolio + IT/EN. Se nessuna campagna \u00e8 attiva, non fa nulla.\n","has_log":false,"id":"invia-offerta","label":null,"last_run":null,"log_path":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/offerta.log","nome":"Offerta servizi \u2014 Invio giornaliero","note":"Opzioni --dry-run, --portfolio NOME, --max-invii N. Plist launchd\nNON creato volutamente: si abilita quando almeno una campagna offerta\nsar\u00e0 attiva, per non girare a vuoto ogni giorno. \"Esegui subito\" \u00e8\nanche disponibile dal pannello di dettaglio della singola campagna.\n","plist":null,"schedule_human":"Manuale finch\u00e9 non viene attivato il plist (vedi note)","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/invia_offerta.py","tipo":"manuale","wrapper":null},{"attiva":null,"comando_lancio":"cd \"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation\" && /usr/local/bin/python3 classifica_risposte_offerta.py","descrizione":"(SEZIONE: OFFERTA SERVIZI.) Legge i messaggi ricevuti DOPO un invio\ndi offerta e classifica con Gemini ogni risposta in una delle 5\ncategorie concordate (1 nessuna, 2 interesse, 3 non ora, 4\nconcorrente, 5 no esplicito). Aggiorna categoria_risposta e testo\nrisposta in offerta_coda, preparando le transizioni di stato gestite\nda \"regole-follow-up-offerta\".\n","has_log":false,"id":"classifica-risposte-offerta","label":null,"last_run":null,"log_path":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/classifica_risposte.log","nome":"Offerta servizi \u2014 Classificatore risposte (Gemini)","note":"Usa GEMINI_API_KEY da config.py (env var in override). Rate limit\ngestito con sleep 4s tra chiamate.\n","plist":null,"schedule_human":"Manuale finch\u00e9 non viene attivato il plist (vedi note)","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/classifica_risposte_offerta.py","tipo":"manuale","wrapper":null},{"attiva":null,"comando_lancio":"cd \"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation\" && /usr/local/bin/python3 regole_follow_up_offerta.py","descrizione":"(SEZIONE: OFFERTA SERVIZI.) Applica le regole temporali su\nofferta_coda: silenzio di 30 gg dopo primo invio \u2192 follow-up da\ninviare; cat 3/4 \u2192 pausa con riesame a 90 gg; cat 5 \u2192 out; cat 2 \u2192\n\"interessato\" (esce dal flusso automatico, gestito a mano). Al\n90\u00b0 giorno sposta \"in_pausa\" a \"da_rivedere_manualmente\" per\ndecisione umana.\n","has_log":false,"id":"regole-follow-up-offerta","label":null,"last_run":null,"log_path":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/regole_follow_up.log","nome":"Offerta servizi \u2014 Transizioni stato (follow-up / pausa / out)","note":"Da lanciare dopo \"classifica-risposte-offerta\". Idempotente e\nveloce (solo UPDATE). --dry-run disponibile.\n","plist":null,"schedule_human":"Manuale finch\u00e9 non viene attivato il plist (vedi note)","schedule_plist":null,"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/automation/regole_follow_up_offerta.py","tipo":"manuale","wrapper":null},{"attiva":true,"comando_lancio":"/Users/massimo/Library/Scripts/jobscreening/run_screening.sh","descrizione":"(SEZIONE: CANDIDATURE LAVORO \u2014 Tier 1 triage.)\nOgni giorno alle 10:00 scarica le email di avviso offerte (LinkedIn,\nIndeed, Profilcultura), le analizza con Gemini e decide il match\n\"spietato\". Se l'offerta \u00e8 Tier 1/2 (Easy Apply o form semplice) tenta\nla candidatura automatica; se \u00e8 Tier 3 (form complesso) la prepara\nin stato PRONTA_MANUALE per la tua revisione.\n","has_log":true,"id":"auto-screening","label":"com.massimo.jobscreening","last_run":{"iso":"2026-08-18 10:00","rel":"16h fa"},"log_path":"/Users/massimo/Library/Logs/jobscreening/screening.log","nome":"Candidature lavoro \u2014 Job Screening","note":"Include il \"React Bypass\" per superare i blocchi dei bottoni su Fever\ne Greenhouse. Se un form richiede risposte aperte, usa Gemini per\nrispondere \"onestamente\" basandosi sul tuo portfolio.\n","plist":"/Users/massimo/Library/LaunchAgents/com.massimo.jobscreening.plist","schedule_human":"Ogni giorno alle 10:00","schedule_plist":{"hour":10,"minute":0,"weekday":null},"script":"/Users/massimo/Desktop/dati 2026/lavoro/gemini/linkedin/auto_screening/auto_screening.py","tipo":"automatica","wrapper":"/Users/massimo/Library/Scripts/jobscreening/run_screening.sh"}],"totali":25},"campagne_offerta_servizi":0,"candidature":{"in_attesa":0,"non_analizzate":0,"pipeline":{"anti_loop_hits":4,"attive":55,"bloccata":1,"candidatura_inviata":23,"in_coda":0,"incerta":0,"non_pertinente":2,"pertinente":0,"pronta_manuale":29,"storico":470,"totale":57},"sospette":3,"totale_ultimi_30gg":4},"candidature_feedback":0,"db":{"azioni_in_scadenza_7gg":0,"per_portfolio":{"Business":365,"Cultura":796,"Fondi Internazionali":448,"Musicisti":333,"NGO":138,"Pianista":7,"Universit\u00e0":163},"per_priorita":{"alta":2,"normale":2244},"per_stato":{"TABU":5,"archiviato":1041,"contattato":1101,"interessato":1,"nuovo":87,"scartato":11},"senza_portfolio":0,"totale_connessioni":2246,"ultimo_import":"2026-08-14T11:25:38.080709"},"dormienti_alta_priorita":0,"generato_alle":"2026-08-19T02:18:16.753321","outreach":{"benvenuto_in_coda_oggi":0,"connessioni_consigliate_incluse":82,"connessioni_consigliate_totali":82},"outreach_aumento_connessioni":0,"raccomandazioni":[],"reminders":{"attivi":0,"scaduti":0},"timeline_30gg":[]}
