You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
log "bridge-watchdog: FLAP CAP superato ($what) — STOP respawn, escalo al Capitano"
193
+
jht-tmux-send CAPITANO "[WATCHDOG] $what continua a morire (>${BRIDGE_FLAP_CAP} respawn in $((BRIDGE_FLAP_WINDOW_SEC/60))min). Ho FERMATO il respawn automatico per evitare un crash-loop. Serve diagnosi manuale: controlla /tmp/*-bridge.log. Il Mantenitore farà comunque un canary completo al prossimo sweep.">/dev/null 2>&1||true
194
+
}
195
+
196
+
tg_bots_configured() {
197
+
# vero se almeno un bot Telegram ha un token (channels.telegram.bots.<role>).
198
+
python3 - "$CONFIG"2>/dev/null <<'PYEOF'
199
+
import json, sys
200
+
try:
201
+
d = json.load(open(sys.argv[1]))
202
+
except Exception:
203
+
sys.exit(1)
204
+
bots = (d.get("channels", {}) or {}).get("telegram", {}).get("bots", {}) or {}
205
+
sys.exit(0 if any((b or {}).get("bot_token") for b in bots.values()) else 1)
206
+
PYEOF
207
+
}
208
+
209
+
maybe_respawn_bridges() {
210
+
# Liveness via process_health.py (legge /proc in PYTHON → NIENTE self-match,
211
+
# a differenza di `grep MARKER /proc/*/cmdline` che trova il proprio argv e
212
+
# riporterebbe SEMPRE "vivo"). Unica fonte di verità, condivisa col Mantenitore
213
+
# (step 0 di maintainer-sweep). In steady-state: 1 call, tutti vivi, zero azione.
214
+
local plan PROC_DEAD_BRIDGE_SUITE="" PROC_DEAD_DEEP="" PROC_TG_ALIVE=0 PROC_ALL_OK=1
215
+
# NB: process_health.py esce 1 PROPRIO quando c'è un morto (è il caso che ci
216
+
# interessa) → NON gatare su `|| return` sull'exit code, sarebbe un no-op
217
+
# esattamente quando serve agire. Catturiamo l'output sempre; skip solo se vuoto
Copy file name to clipboardExpand all lines: BACKLOG.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -159,6 +159,7 @@ Versione: `package.json` `v0.1.17` (production ferma a `v0.1.12` dopo blocco Tur
159
159
-**✅ DONE 2026-06-21 (commit `1530430c7` + `32d28df48`)** — affordance UI read-only sul cloud (d3 di `[JHT-WEB-READONLY]`), a livello PAGINA/SEZIONE (no `if` sparsi). **(a) Pagine intere desktop-only**: guard unico nel `(protected)/layout.tsx` → su `isCloudDeploy()` redirect a `/dashboard` per `settings`/`credentials`/`secrets`/`channels`/`providers`/`integrations`/`cron`/`backup`/`setup`/`cli-link` (eccezione `settings/cloud-sync` = sync-infra, resta); `UserMenu` nasconde i link Impostazioni/Backup. **(b) Sezioni-controllo in pagine miste** (la pagina resta, sparisce il controllo): `/team` start/stop + azioni per-agente; `AgentInteraction` (chat+terminale di analista/critico/scrittore/scout/scorer) → `null` su cloud + stop polling; chat composer di `/team/capitano` e `/team/assistente`; `/profile` → `ProfileEditButton`+`ProfileAssistantFab` nascosti = view-only (export resta). La sicurezza è comunque a monte (route 403 via `requireLocalWrite`+`isCloudDeploy`); questo toglie i vicoli ciechi.
160
160
-**⬜ Rifinitura minore residua** — bottoni secondari sulle pagine miste (pulisci-chat, apri-terminale, toggle-terminale in capitano/assistente): innocui sul cloud (agiscono su dati locali assenti) ma volendo si nascondono con lo stesso pattern.
161
161
- ⬜ **`[JHT-CLOUD-INTERACTIVE-RETIRE]` 🟡 (= fix di scala definitivo)** — freeze/ritiro del **path cloud interattivo** ridondante una volta che l'interazione è desktop+tunnel: bus `team_state` control + reconciler, lane `user_to_agent_messages` + `user-messages-poller`, `team_commands` legacy. **NB:** è qui che il costo Vercel per-utente va a ~0 (mitigato nel frattempo dal poll adattivo, `[JHT-DATA-SYNC]` (4), ma non azzerato): solo togliendo i poller di controllo resta **un solo daemon di sync** per VPS. **🟡 In larga parte FATTO 2026-06-21 (dev4, commit `ce96b44eb`)**: **scoperta** che il controllo Start/Stop è retto SOLO dal reconciler (la dashboard scrive `should_run`, nessun path diretto) → spegnerlo romperebbe il controllo. Fix corretto = **fold nel daemon**: `team-state-reconciler` → `reconcileOnce()` chiamata dal cloud daemon ogni tick (riusa `reconcile()`/`applyAction()`: `.team-halted.flag` + heartbeat preservati); poller standalone **non parte più**. `user-messages-poller` **ritirato** (chat web=solo-desktop). `team-commands-poller` + `file-bridge` **restano** (adattivi) finché i loro feeder cloud non spariscono (sentinella web in dismissione lato collega). Entrambi i ritirati ri-attivabili con `JHT_CLOUD_CONTROL_POLLERS=1`. **Effetto**: da 3 poller a 5s/≤30s per-utente → 1 daemon a 60s (+team-commands transitorio). Latenza controllo ≤60s. ⚠️ Caveat: niente più claim single-team (edge multi-VPS/utente). **Test runtime utente** (controllo via dashboard+daemon). Residuo: ritiro `team-commands` quando il feeder web è rimosso; eventuale freeze/delete delle route cloud `team_commands`/`team-state` browser-ramp (lane web/collega). **⚠️ Eccezione (rivisto 2026-06-20):** la **corsia richieste async** (`position_tickets`, `position_feedback`, flag `*_requested` + `pull-desired-state`) **NON si ritira** — non è il bus real-time, è un'event-queue che la VPS pulla con calma (vedi `[JHT-DATA-SYNC]`). **Resta** il push dati one-way + `jht cloud restore` + dashboard read-only. ⚠️ *Ribalta codice shippato 23–31 maggio: scelta freeze-vs-delete deliberata, pezzo per pezzo.*
162
+
- ⬜ **`[JHT-REALTIME-SCALE]` 🟢 (robustezza/scaling daemon event-driven, NON urgente)** — il sync event-driven via Supabase Realtime è live+validato su andris (dietro flag `JHT_REALTIME_SYNC`, vedi `docs/internal/2026-06-26-sync-status-report.md`). Degrada con grazia (col Realtime giù → floor = paracadute ~56 q/h/utente, -94%, nessun dato perso), quindi questi sono affinamenti di scala da fare crescendo a molti clienti, non blocchi: **(1) monitor del rate di riconnessione** per-VPS (conteggio `CHANNEL_ERROR`/`SUBSCRIBED` + alert); **(2) tetto connessioni Realtime Supabase** (~500 concorrenti su Pro = muro di scala vero → bump tier/sharding); **(3) thundering herd** al riavvio del server Realtime (N socket riconnettono insieme → jitter/backoff extra); **(4) unificare l'auth** REST-diretto+websocket (oggi 2 sessioni sullo stesso refresh_token → race di rotazione possibile a scala); **(5) paracadute regolabile** (`JHT_PARACHUTE_SEC`) come leva se il Realtime è inaffidabile. Vedi `[JHT-DATA-SYNC]` / `[JHT-DAEMON-SUPABASE-DIRECT]`.
162
163
- ⬜ **`[JHT-SETUP-LOCAL-FIRST]` 🟢** — rielevare il **Local PC** a path di prima classe ("il team è tuo, accendi/spegni quando vuoi"); allinea la copy execution-mode (oggi "not recommended for daily machines"). Si incastra col Dedicated computer mode.
163
164
164
165
**Sequenza proposta:** I `[TELEGRAM-OPTIONAL]` → II `[DATA-SYNC]` → III `[WEB-READONLY]` → IV `[DASHBOARD-SPLIT]`/`[DESKTOP-COCKPIT]` → V `[VPS-TUNNEL]` → VI `[CLOUD-INTERACTIVE-RETIRE]`. I+II scorporabili subito; V porta il valore "VPS come locale". **Decisioni aperte per l'utente** elencate nel design doc § "Decisioni aperte".
0 commit comments