Симптом
Тоннель, не поднявшийся на старте демона (например forti упал из-за отсутствия сети), висит мёртвым бесконечно — ни один автоматический путь его не оживляет (без включённого scheduled reconnect, а он по умолчанию off).
Причина
check_alive() (tv/engine.py:462-468) считает тоннель мёртвым по условию result.ok and not proc.is_alive(pid). Для тоннеля с result.ok=False с самого старта это условие НИКОГДА не станет True → он не попадает в dead → его не трогает ни «dead»-ветка keepalive, ни «wake»-ветка с has_dead=False (когда шлюз не менялся). Единственный шанс — полный reconnect_all (сменился шлюз) или scheduled reconnect (если cfg.reconnect.enabled, дефолт False).
Сценарий
Демон стартовал без сети → forti ok=False → сеть появилась через минуту → forti так и висит мёртвым, keepalive его игнорирует.
Направление фикса
В check_alive (или отдельным списком) трекать «никогда не поднявшиеся» тоннели и включать их в «dead»-набор на каждом тике (с тем же cooldown), а не только «был жив — умер».
Найдено адверсариальным ревью (sleep/wake ось), 2026-07-02.
Симптом
Тоннель, не поднявшийся на старте демона (например forti упал из-за отсутствия сети), висит мёртвым бесконечно — ни один автоматический путь его не оживляет (без включённого scheduled reconnect, а он по умолчанию off).
Причина
check_alive()(tv/engine.py:462-468) считает тоннель мёртвым по условиюresult.ok and not proc.is_alive(pid). Для тоннеля сresult.ok=Falseс самого старта это условие НИКОГДА не станет True → он не попадает вdead→ его не трогает ни «dead»-ветка keepalive, ни «wake»-ветка сhas_dead=False(когда шлюз не менялся). Единственный шанс — полныйreconnect_all(сменился шлюз) или scheduled reconnect (еслиcfg.reconnect.enabled, дефолт False).Сценарий
Демон стартовал без сети → forti
ok=False→ сеть появилась через минуту → forti так и висит мёртвым, keepalive его игнорирует.Направление фикса
В
check_alive(или отдельным списком) трекать «никогда не поднявшиеся» тоннели и включать их в «dead»-набор на каждом тике (с тем же cooldown), а не только «был жив — умер».Найдено адверсариальным ревью (sleep/wake ось), 2026-07-02.