Komputer gaśnie, kiedy Claude Code skończy pracę
Zostawiam wieczorem agentów z dłuższą robotą. Rano komputer albo chodził całą noc na pusto, albo zgasł w połowie edycji, bo wyłączył go zegar. Napisałem narzędzie, które czeka na koniec pracy.
Kod na GitHubie ↗Problem: zegar nie wie, co robi agent
Claude Code nie ma opcji „wyłącz komputer, jak skończysz”. Zostają dwa wyjścia i oba są złe. Można zostawić komputer włączony do rana i płacić za prąd, gdy nic się nie dzieje. Można też ustawić wyłączenie po czasie albo usypianie po bezczynności. Tylko że Windows liczy bezczynność po ruchach myszki i klawiatury, a agent nie rusza myszką. Timer tnie według zegara.
Claude AutoShutdown zamienia „wyłącz o trzeciej” na „wyłącz, kiedy praca się skończy”. Tak to wygląda w trakcie pracy: dwie sesje jeszcze pracują, więc nic się nie wyłączy.

Jak rozpoznaje, że praca się skończyła
Nie zgaduje z obciążenia systemu. Co 10 sekund czyta to, co Claude Code sam zapisuje na dysku: rejestr sesji w ~/.claude/sessions/, transkrypt każdej sesji i transkrypty wszystkich subagentów, także tych zagnieżdżonych, które powstają przy rozgałęzionych workflowach.
Z ostatnich wpisów transkryptu wynika stan tury. Odpowiedź modelu zakończona normalnie zamyka turę; wywołanie narzędzia, wiadomość użytkownika albo podsumowanie po kompaktowaniu zostawia ją otwartą. Cokolwiek innego jest nieznane i też blokuje wyłączenie. Lista jest zamknięta: nowy typ wpisu, którego program nie zna, nigdy nie zostanie uznany za „skończone”.
Sesja liczy się jako żywa tylko wtedy, gdy jej proces działa i czas startu procesu zgadza się z zapisanym co do sekundy. Dzięki temu Windows, który nadał ten sam numer PID nowemu programowi, nie oszuka monitora. Działający claude.exe, którego nie ma w rejestrze, też blokuje wyłączenie.
Dlaczego nie patrzy na CPU
To było pierwsze, co przyszło mi do głowy, i pierwsze, co odrzuciłem po pomiarze. Sesja czekająca na mnie zużywała od 0,9 do 2,0% procesora, z pikami do 5,0%. Sesja, która pracowała: 2,7%, z pikami do 5,3%. Rozkłady się pokrywają, więc żaden próg ich nie rozdzieli. Większość pracy agenta dzieje się po stronie serwera, a lokalnie proces głównie czeka.
Druga pułapka była mniej oczywista. Program czyta końcówkę transkryptu, żeby ustalić stan tury. Na początku czytał 256 KB. Na moim komputerze było 494 pojedynczych wpisów większych niż 256 KB, największy miał 5,1 MB. Taki wpis nie mieścił się w oknie odczytu, więc sesja wychodziła jako „nieznana”. Teraz okno zaczyna od 256 KB i rośnie do 16 MB, aż znajdzie cały wpis.
Wyłączenie, hibernacja, uśpienie
W ustawieniach wybierasz, co ma się stać na końcu:
shutdown: wyłączenie (shutdown /s /t 0 /f),hibernate: hibernacja (shutdown /h),sleep: uśpienie przezSetSuspendStatez Windows API,lock: tylko blokada ekranu,nothing: nic, do testów.
Jedna uwaga z README: jeśli hibernacja jest w Windows włączona, uśpienie często i tak kończy się hibernacją. Tak działa Windows.
Bezpieczniki
Program, który sam gasi komputer, musi się bardziej bać wyłączenia za wcześnie niż za późno. Dlatego wyłączenie przechodzi przez 17 niezależnych bramek. Najważniejsze:
- startuje rozbrojony, uzbrojenie wymaga kliknięcia i potwierdzenia,
- każdy warunek musi być zielony 3 razy z rzędu, a każda sesja cicha od co najmniej 300 sekund,
- Ty też musisz być nieaktywny przez 600 sekund, więc nie wyłączy komputera, przy którym siedzisz,
- przed akcją jest 90 sekund odliczania z przyciskiem Anuluj (działa też Esc), a po anulowaniu 60 sekund przerwy,
- plik
STOPw katalogu programu blokuje wszystko, bez względu na resztę, - błąd skanera blokuje wyłączenie: „nic nie widzę” nie znaczy „wszystko skończone”,
- procesy z listy
guard_patterns, na przykład render w ffmpeg, też blokują, - przykładowy config ma
dry_run: true, więc na start program tylko zapisuje w logu, co by zrobił.
Instalacja
Tylko Windows. Najprościej pobrać plik .exe z Releases. Nie jest podpisany, więc SmartScreen za pierwszym razem ostrzeże. Ze źródeł potrzebny jest Python 3.14, bez żadnych dodatkowych pakietów:
git clone https://github.com/kamiljan11/claude-autoshutdown.git
cd claude-autoshutdown
python -m pytest -qProgram uruchamiasz przez Claude AutoShutdown.vbs (bez okna konsoli). Nie potrzebuje uprawnień administratora: do wyłączenia własnego komputera wystarczy zwykłe konto.
Czego nie robi
- Sesja, która czeka na Twoją zgodę na użycie narzędzia, ma otwartą turę, więc blokuje wyłączenie. Celowo.
- Jeśli przerwiesz agenta klawiszem Esc w trakcie wywołania narzędzia, tura zostaje otwarta i program nie rozpozna, że sesja jest porzucona.
- Nie wie nic o pracy poza Claude Code, na przykład o trwającym
git push. Na to sąguard_patterns. - Nie ma instalatora.
Kod jest na licencji MIT: github.com/kamiljan11/claude-autoshutdown. README opisuje każdą bramkę i każdy pomiar, o którym tu piszę.