Problem: praca, którą trzeba powtarzać
Wpis pokazuje, jak zlecić agentowi zadanie wykonywane cyklicznie, na przykładzie automatu, który co godzinę pobiera aktualny kurs BTC i ETH i zapisuje go do pliku. Takie zadanie da się zrealizować na trzy sposoby:
- Skrypt wykonujący całą pracę. Program napisany samodzielnie albo przez agenta, uruchamiany przez harmonogram systemu (cron, Harmonogram zadań Windows). Realizuje sztywną procedurę: otwórz stronę, znajdź tabelę w określonym miejscu, przepisz liczbę. Działa, dopóki strona się nie zmieni.
- Skrypt wywołujący agenta. Harmonogram systemu uruchamia Claude Code w trybie nieinteraktywnym z gotową instrukcją. Agent wykonuje pracę, a skrypt odpowiada tylko za start o zadanej porze.
- Wbudowane funkcje Claude Code.
/loop, zadania Desktop i/schedulezapewniają harmonogram bez pisania żadnego skryptu.
W dwóch ostatnich wariantach agent dostaje cel, a nie procedurę: „odczytaj kurs z tabeli i dopisz go do arkusza”. Sam znajduje dane na stronie, sprawdza, czy mają sens, i zgłasza, gdy coś się nie zgadza. Do pracy cyklicznej potrzebuje czterech elementów:
| Element | Rola |
|---|---|
| Wyzwalacz | Harmonogram, który uruchamia agenta o zadanej porze |
| Instrukcja | Opis zadania i oczekiwanego wyniku, napisany zwykłym językiem |
| Pamięć między uruchomieniami | Plik albo folder, w którym zostają wyniki poprzednich przebiegów |
| Uprawnienia | Zgody na działania agenta ustawione z góry, bo w trakcie przebiegu nikt nie odpowiada na pytania o zgodę |
Dalsza część wpisu dotyczy wbudowanych mechanizmów:
/loopw otwartej sesji,- zadań zaplanowanych w aplikacji Desktop,
/schedulew chmurze Anthropic.
Trzy sposoby planowania
Wszystkie trzy mechanizmy uruchamiają to samo: instrukcję wykonywaną przez agenta. Różnią się tym, gdzie agent pracuje, jak długo zadanie żyje i do czego agent ma dostęp.
| Cecha | /loop | Zadanie Desktop | /schedule |
|---|---|---|---|
| Do czego | Szybki test i praca obserwowana na bieżąco | Automatyczny asystent na własnym komputerze | Praca przy wyłączonym komputerze |
| Gdzie pracuje agent | Własny komputer | Własny komputer | Chmura Anthropic |
| Wymaga otwartej sesji | Tak | Nie | Nie |
| Najkrótszy odstęp | 1 minuta | 1 godzina (1 minuta, gdy harmonogram ustawia Claude) | 1 godzina |
| Czas działania | 7 dni | Bez limitu | Bez limitu |
| Uwagi | Komputer musi być włączony, dostęp do plików na dysku | Komputer włączony i aplikacja Desktop otwarta, dostęp do plików na dysku | Komputer może być wyłączony, dostęp tylko do projektu na GitHubie |
/loop: pętla w otwartej sesji
Wszystko dzieje się w jednej, otwartej sesji Claude Code. Pętla jest częścią bieżącej rozmowy: kolejne przebiegi trafiają do tego samego okna, agent pamięta wyniki poprzednich, a w przerwach można z nim normalnie rozmawiać. Zamknięcie sesji kończy pętlę.
/loop przyjmuje odstęp czasu i polecenie albo nazwę skilla (zapisanej instrukcji), np. /loop 1h /przeglad-cen. Przykładowa rozmowa, skrócona:
> /loop 30m sprawdź na stronie ezamowienia.gov.pl, czy pojawił się nowy
przetarg na usługi sprzątania w województwie mazowieckim, i podaj tytuł
oraz termin składania ofert
● Utworzyłem zadanie cykliczne 3f9a2c1e: co 30 minut (*/30 * * * *).
Wygasa po 7 dniach. Pierwsze sprawdzenie wykonuję od razu.
● Przejrzałem ogłoszenia z ostatniej doby. Brak nowych przetargów na usługi
sprzątania w województwie mazowieckim.
... 30 minut później ...
● Brak nowych przetargów od poprzedniego sprawdzenia.
> jakie mam zaplanowane zadania?
● Aktywne zadania w tej sesji:
3f9a2c1e co 30 minut przetargi na sprzątanie, ezamowienia.gov.pl
> anuluj pętlę sprawdzającą przetargi
● Anulowałem zadanie 3f9a2c1e.
Jedna sesja może mieć do 50 zaplanowanych zadań.
Skill uruchamiany przez /loop musi być dostępny dla modelu. Jeśli skill ma disable-model-invocation: true albo jest zablokowany w uprawnieniach, nie zostanie wykonany.
Bez podanego odstępu (/loop /przeglad-cen) Claude sam wybiera przerwę po każdym przebiegu, od minuty do godziny, i wypisuje uzasadnienie.
loop.md jako domyślne polecenie
Samo /loop bez argumentów uruchamia wbudowane polecenie porządkowe. Plik .claude/loop.md w folderze projektu (albo ~/.claude/loop.md dla wszystkich projektów) zastępuje je własną treścią. Wtedy /loop 1h uruchamia treść tego pliku bez wpisywania polecenia. Przykład loop.md porządkującego folder z dokumentami od kontrahentów:
Uporządkuj folder `przychodzace/`:
1. Faktury (PDF z „Faktura” w treści) przenieś do `faktury/<rok>-<miesiąc>/`.
2. Umowy przenieś do `umowy/`, nazwę pliku zmień na `<kontrahent>_<data>.pdf`.
3. Duplikaty (ten sam plik pod inną nazwą) usuń, zostaw najstarszą kopię.
4. Plików, których nie umiesz przypisać, nie ruszaj.
5. Wypisz, co przeniosłeś, co usunąłeś i czego nie rozpoznałeś.
Zmiany w loop.md działają od następnego przebiegu, a treść dłuższa niż 25 000 bajtów jest obcinana.
Ograniczenia /loop
- Sesja musi być otwarta i wolna. Przebieg startuje tylko wtedy, gdy agent nie pracuje nad czymś innym.
- Brak nadrabiania. Kilka przegapionych terminów daje jeden przebieg, nie kilka.
- 7 dni. Po tygodniu zadanie wykonuje się ostatni raz i znika.
Godziny w harmonogramie /loop liczą się według czasu lokalnego, czyli zegara komputera.
Zadania cykliczne startują z losowym opóźnieniem, do połowy odstępu i nie więcej niż 30 minut. Pętla godzinna może więc ruszać np. o :17 każdej godziny, a nie o pełnej.
Zadanie Desktop: harmonogram na własnym komputerze
Aplikacja Claude Code Desktop ma zakładkę Scheduled w części Code. Zadanie tworzone tam działa na własnym komputerze, ale nie wymaga otwartej rozmowy: aplikacja sama uruchamia nową sesję o zadanej porze w wybranym folderze. Agent ma dostęp do plików na dysku i do narzędzi skonfigurowanych na komputerze, a zgody na jego działania ustawia się osobno dla każdego zadania.

Różnice względem /loop:
- Bez otwartej sesji. Każdy przebieg to nowa sesja uruchamiana przez aplikację.
- Bez limitu 7 dni. Zadanie działa, dopóki się go nie usunie.
- Zgody ustawione z góry. Pytanie o zgodę zatrzymuje przebieg do ręcznej odpowiedzi.
/schedule: zadanie w chmurze
/schedule tworzy zadanie, które działa w chmurze Anthropic, także przy wyłączonym komputerze. Claude dopytuje o brakujące elementy (projekt, środowisko, konektory) i zapisuje zadanie na koncie. Zarządza się nim przez /schedule list, /schedule update, /schedule run albo na stronie claude.ai/code/routines.
/schedule w poniedziałki o 7:30 przeczytaj raporty sprzedaży z folderu raporty/ za poprzedni tydzień i zapisz w folderze podsumowania/ jednostronicowe podsumowanie dla zarządu
Wymagania:
- Konto claude.ai z planem Pro, Max, Ultra, Team lub Enterprise. Przy kluczu API, Amazon Bedrock, Google Cloud czy Microsoft Foundry polecenie jest niedostępne.
- Projekt na GitHubie. Każdy przebieg pracuje na świeżej kopii repozytorium.
- Limit subskrypcji. Przebiegi zużywają go tak samo jak zwykła praca z Claude. Dodatkowo obowiązuje limit 100 zaplanowanych uruchomień na godzinę na konto.
Różnice względem zadania Desktop:
- Brak pamięci między przebiegami. Zostaje tylko to, co trafiło do repozytorium. Domyślnie zmiany idą do nowej gałęzi
claude/..., więc instrukcja musi wskazać stałą gałąź. - Ograniczony internet. Dostęp tylko do listy zaufanych adresów. Inne strony dopisuje się w ustawieniach środowiska: Network access → Limited i lista Allowed domains.
- Brak narzędzi z komputera. Dostępne są tylko konektory wybrane dla zadania i serwery MCP zadeklarowane w
.mcp.jsonrepozytorium, bez lokalnych narzędzi komputera. - O zgodach decyduje klasyfikator. Powtarzające się blokady zatrzymują przebieg do decyzji w interfejsie webowym.
- Najkrótszy odstęp to 1 godzina. Harmonogram wpisany w formacie cron liczy się w UTC.
Który wariant wybrać
| Sytuacja | Wariant |
|---|---|
| Test instrukcji, krótka seria do 7 dni | /loop |
| Komputer włączony przez większość dnia, praca na dłużej | Zadanie Desktop |
| Komputer wyłączony, projekt na GitHubie | /schedule |
Przykład: monitoring cen w bitomatach
Problem
Cel: monitorować stronę Shitcoins.club i zapisywać do pliku kursy kupna i sprzedaży BTC i ETH, żeby później analizować zebrane dane.
Zadanie automatu, wykonywane co godzinę:
- Wejść na stronę https://shitcoins.club/.
- Odczytać z tabeli kurs kupna i sprzedaży BTC i ETH w PLN.
- Dopisać odczyt do pliku
data/rates.csv. - Obsłużyć problemy: zablokowaną stronę, brak tabeli, brak wiersza kryptowaluty, nielogiczne kursy. W razie problemu przebieg zapisuje w CSV wiersz ze statusem błędu, a szczegóły dopisuje do logu
data/btc-rates.log.
Strona jest chroniona przez Cloudflare, więc prosty skrypt pobierający ją bezpośrednio zwykle zostaje zablokowany (da się to obejść, ale nie jest to tematem wpisu). Agent steruje więc zwykłą przeglądarką przez Playwright MCP, dzięki czemu ruch wygląda jak wizyta człowieka.
Folder projektu btc-atm-rates
Automat działa jako zadanie w aplikacji Claude Code Desktop na własnym komputerze. Składa się z pięciu plików: konfiguracji przeglądarki, opisu źródła, instrukcji dla agenta, arkusza z wynikami i logu problemów. Wszystkie leżą w jednym folderze na dysku, który jest folderem roboczym zadania.
btc-atm-rates/
├── .mcp.json
├── sources.yaml
├── data/
│ ├── rates.csv
│ └── btc-rates.log
└── .claude/
└── skills/
└── btc-rates/
└── SKILL.md
Przeglądarka: Playwright MCP
Plik .mcp.json w folderze projektu daje agentowi dostęp do przeglądarki. Przy pierwszym uruchomieniu w tym folderze Claude Code pyta o zgodę na jego użycie.
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"]
}
}
}
Agent otwiera stronę (browser_navigate), odczytuje jej zawartość jako tekst (browser_snapshot) i zamyka przeglądarkę (browser_close). Tabela w odczycie wygląda tak:
- columnheader "Sprzedajesz po:" [ref=e64]
- columnheader "Kupujesz po:" [ref=e65]
- rowgroup [ref=e66]:
- row [ref=e67]:
- cell "BTC" [ref=e68]
- cell "279620.00 PLN" [ref=e70]
- cell "303540.00 PLN" [ref=e71]
W chwili pisania (7 listopada 2026, wieczór) różnica między kursami wynosiła 23 920 PLN, czyli ok. 8,2% średniej z obu kursów. Tyle kosztuje kupno bitcoina w bitomacie i jego natychmiastowa odsprzedaż.
Opis źródła
Plik sources.yaml określa, co i skąd agent ma odczytać. Tabela na stronie ma przełącznik PLN/EUR i wiersze dla kilku kryptowalut (BTC, ETH, USDT, USDC, SOL, LTC, TRX, BNB). Nowe kryptowaluty dopisuje się do listy assets bez zmiany instrukcji, a innych operatorów jako kolejne pozycje sources.
sources:
- id: shitcoins-club
url: "https://shitcoins.club/"
currency: PLN
assets: [BTC, ETH]
Format danych
Każdy przebieg dopisuje do data/rates.csv po jednym wierszu na kryptowalutę, także gdy odczyt się nie udał:
timestamp,source,asset,currency,bid,ask,spread_pct,status
bid: kolumna Sprzedajesz po (bitomat kupuje od klienta).ask: kolumna Kupujesz po (bitomat sprzedaje klientowi).spread_pct: marża operatora w procentach.status:ok,not_found,blockedalboerror.
Szczegóły problemów trafiają do data/btc-rates.log, jedna linia na problem.
Instrukcja: skill btc-rates
Całe zadanie opisuje skill: zwykły plik tekstowy z instrukcją, którą agent wczytuje przy każdym przebiegu. Budowę skilli opisuje wpis Skille w Claude Code .
---
name: btc-rates
description: Odczytuje kurs kupna i sprzedaży kryptowalut w bitomatach ze źródeł w sources.yaml i dopisuje je do data/rates.csv. Używaj przy cyklicznym zbieraniu kursów.
allowed-tools: Read, Edit, Write, Bash(date *), mcp__playwright__browser_navigate, mcp__playwright__browser_snapshot, mcp__playwright__browser_close
---
# Zbieranie kursów z bitomatów
1. Wczytaj `sources.yaml`.
2. Dla każdego źródła otwórz `url` przez `browser_navigate`, a potem pobierz `browser_snapshot`. Nie używaj WebFetch: strona stoi za Cloudflare i blokuje zwykłe pobieranie.
3. Znajdź tabelę „Tablica kursów”. Upewnij się, że kursy są w walucie `currency` (sufiks komórki, np. `PLN`). Jeśli tabela pokazuje inną walutę, przełącz ją raz na stronie, a gdy to się nie uda, zapisz status `not_found`.
4. Dla każdej kryptowaluty z `assets` odczytaj wiersz, którego pierwsza komórka to dokładnie jej symbol:
- `bid` = kolumna „Sprzedajesz po”,
- `ask` = kolumna „Kupujesz po”.
Nie zamieniaj kolumn. `ask` musi być większe od `bid`, inaczej zapisz status `error` bez kursów.
5. Policz `spread_pct = (ask - bid) / ((ask + bid) / 2) * 100` i zaokrąglij do 0,01.
6. Czas odczytu weź z `date --iso-8601=seconds`, nie z harmonogramu.
7. Dopisz po jednym wierszu na kryptowalutę na końcu `data/rates.csv`. Nie zmieniaj ani nie sortuj istniejących wierszy.
8. Jeśli zamiast strony pojawi się blokada Cloudflare, captcha albo błąd, zapisz status `blocked` albo `error`. Nie próbuj obchodzić zabezpieczeń.
9. Dla każdego statusu innego niż `ok` dopisz linię do `data/btc-rates.log` w formacie `<timestamp> <source> <asset> <status>: <opis problemu>`. Jeśli plik nie istnieje, utwórz go.
10. Zamknij przeglądarkę (`browser_close`).
11. Na koniec wypisz jedną linię podsumowania: bid, ask i spread dla każdej kryptowaluty oraz zmianę bid i ask względem poprzedniego wiersza w CSV.
Uruchomienie przez /loop
Test automatu w folderze projektu:
/loop 1h /btc-rates
Losowe przesunięcie startu nie przeszkadza, bo czas w arkuszu pochodzi z faktycznego momentu odczytu (punkt 6 instrukcji), a nie z harmonogramu. Przez limit siedmiu dni /loop wystarcza na test i krótką serię, ale nie na wielotygodniową historię.
Uruchomienie jako zadanie Desktop
To najwygodniejszy wariant dla tego automatu, jeśli komputer i tak jest włączony przez większość dnia. Arkusz leży na dysku, przeglądarka z .mcp.json jest dostępna, a ruch wychodzi z domowego albo biurowego łącza, które Cloudflare traktuje jak zwykłego użytkownika. Polecenie zadania to /btc-rates, folder roboczy to btc-atm-rates. W zgodach zadania trzeba zezwolić na narzędzia przeglądarki (mcp__playwright__*).