Metadata-Version: 2.4
Name: rytm-regulatory-monitor
Version: 0.3.4
Summary: Evidence-backed Polish/EU regulatory monitor
Classifier: Operating System :: POSIX :: Linux
Classifier: Operating System :: Microsoft :: Windows :: Windows 10
Classifier: Operating System :: Microsoft :: Windows :: Windows 11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Requires-Python: >=3.12
Description-Content-Type: text/markdown
Requires-Dist: pypdf==6.21.2
Requires-Dist: tzdata==2026.5; sys_platform == "win32"
Provides-Extra: test
Requires-Dist: pytest==9.1.1; extra == "test"

# Rytm 0.3.4 — monitoring regulacyjny Polska / Śląsk / UE

Rytm pobiera publikacje z urzędowych źródeł i przygotowuje polski raport o nowościach istotnych dla producenta aerozoli i pianek PUR. Raport zawiera cytaty, linki, daty i jawne luki źródłowe. Możesz czytać go lokalnie albo odbierać przez Telegram lub Discord. Bot Telegram udostępnia ostatni raport i stan pracy.

**To narzędzie pomocnicze, nie opinia prawna ani gwarancja kompletności monitoringu.** Brak danych ze źródła nie oznacza braku zmian. Przed podjęciem decyzji sprawdź dokument urzędowy i stosowalność do swojego zakładu.

## Wymagania i koszty

- Windows 10/11 lub Linux; dostęp do Internetu podczas pobierania, pracy AI i komunikacji.
- Zalecany Python **3.12–3.14** z [python.org](https://www.python.org/downloads/). Metadane pakietu dopuszczają 3.12+, ale nie jest to deklaracja pełnego wsparcia każdego nowszego interpretera.
- Klucz OpenRouter do raportów AI. Samo `collect` nie wywołuje płatnego modelu.
- Opcjonalnie token bota Telegram z @BotFather albo webhook Discord.

Domyślna konfiguracja 0.3.4 dopuszcza **do 3 prób** przygotowania raportu z limitem **1,50 USD na całe zadanie**, nie na każdą próbę. Próby kończą się po pierwszej publikacji albo po wyczerpaniu limitów. Nieudana próba też może kosztować. Program kontroluje budżet i rezerwacje na podstawie parametrów dostawcy; nie gwarantuje wysokości jego końcowego rachunku ani powstania raportu. Zachowane własne konfiguracje mogą mieć inne limity: przed zgodą przeczytaj wartość wyświetloną przez `rytm report`.

## Instalacja na Windows

1. Zainstaluj zalecanego Pythona i zaznacz **Add python.exe to PATH**. Otwórz nowe okno PowerShell na swoim koncie Windows.
2. Zainstaluj aplikację:

```powershell
py --version
py -0p
py -m pip install rytm-regulatory-monitor
rytm --version
```

Oczekiwany wynik ostatniej komendy: `rytm 0.3.4`. Jeżeli `rytm` nie jest rozpoznawany, używaj `py -m rytm_monitor.app_cli` zamiast `rytm`, np. `py -m rytm_monitor.app_cli --version`. Nie mieszaj instalacji różnych interpreterów.

3. Uruchom kreator i kontrolę:

```powershell
rytm configure
rytm doctor
```

`doctor` sprawdza lokalną konfigurację, sondę Pythona i wybraną automatykę; nie uruchamia AI ani wysyłki raportu. Gotowa konfiguracja nie dowodzi działającego bota. Jeśli go włączyłeś, wymagaj również aktywnego pollera i odpowiedzi w Telegramie.

### Python 3.15

Na części środowisk Windows Python 3.15.2 ma usterkę `calendar/strptime`. `doctor` wykrywa ją komunikatem **„Wykryto problem: usterka interpretera (calendar/strptime)”** i wskazówką **„zainstaluj Python 3.14 i użyj py -3.14”**. Nie poprawiaj ręcznie biblioteki standardowej.

Zainstaluj [Python 3.14.10 dla Windows x64](https://www.python.org/ftp/python/3.14.10/python-3.14.10-amd64.exe) **obok**, bez usuwania 3.15. Zatrzymaj wcześniej zadania i procesy Rytm według procedury aktualizacji poniżej. Potem:

```powershell
py -0p
py -3.14 -m pip install --upgrade rytm-regulatory-monitor
py -3.14 -m rytm_monitor.app_cli --version
py -3.14 -m rytm_monitor.app_cli service start
py -3.14 -m rytm_monitor.app_cli doctor
py -3.14 -m rytm_monitor.app_cli service status
```

**W tej ścieżce używaj konsekwentnie `py -3.14 -m rytm_monitor.app_cli` przy każdym poleceniu.** Gołe `rytm` może nadal wskazywać katalog Scripts Pythona 3.15. `service start` rejestruje zadania z launcherem interpretera, który wykonuje tę komendę. Jeżeli aplikacja nie była jeszcze skonfigurowana, najpierw wykonaj kreator przez ten sam moduł.

## Kreator: sześć kroków

1. Katalog roboczy (workspace): lokalny katalog, np. `C:\Users\Jan\rytm-work`. **Nie wybieraj OneDrive, udziału UNC ani dysku sieciowego.** Pulpit może być przekierowany do OneDrive; bezpieczniejszy jest proponowany katalog w profilu. Istniejący workspace w chmurze wymaga kontroli operatora; aktualizacja nie przenosi go automatycznie.
2. Model: Enter zachowuje domyślne ID `deepseek/deepseek-v4.1-flash` i skonfigurowanego dostawcę. To pole na ID, nie na klucz.
3. Klucz OpenRouter: ukryte pole, w którym nie widać wpisywanych znaków.
4. Kanał wysyłki: Telegram, Discord albo brak.
5. Raport tygodniowy: dzień, godzina oraz oddzielna zgoda na przyszłe płatne raporty.
6. Bot na żądanie: osobna zgoda na włączenie; płatne `/odswiez` możesz pozostawić wyłączone.

W polu ścieżki kreatora wpisuj katalog **bez cudzysłowów**, również ze spacjami. Sekrety w klasycznym PowerShell wklejaj prawym przyciskiem myszy. Cudzysłowy są natomiast potrzebne przy ścieżkach ze spacjami w argumentach poleceń, np. `rytm send "C:\Users\Jan\rytm-work\reports\demo" --dry-run`.

Przed zapisem sprawdź podsumowanie. Odpowiedź „nie” lub Ctrl+C **przed zatwierdzeniem** nie zapisuje konfiguracji. Po zatwierdzeniu zapis lub instalacja zadań mogły już nastąpić; sprawdź `rytm config show` i `rytm doctor`.

### Telegram od początku

1. W Telegramie otwórz zweryfikowanego **@BotFather**, wyślij `/newbot` i wybierz nazwę oraz wolny username kończący się `bot`.
2. Token wpisz wyłącznie w ukrytym polu kreatora. Nie wklejaj go do PowerShell jako argumentu, czatu ani zgłoszenia serwisowego.
3. Otwórz prywatny czat z utworzonym botem i wyślij `/start`. Kreator może odczytać czat; jeśli trzeba, wykonaj `rytm bot pair` przy zatrzymanym pollerze.
4. Po włączeniu bota sprawdź `rytm bot status`, wyślij ponownie `/start` i oczekuj odpowiedzi z listą komend w ciągu kilku sekund. Samo parowanie nie uruchamia bota.

Bot korzysta z połączeń wychodzących; nie wymaga serwera WWW ani otwierania portu na komputerze. Dla tego samego tokena nie uruchamiaj drugiego pollera ani innej aplikacji z webhookiem.

## Instalacja na Linux

Użyj interpretera 3.12–3.14 i prywatnego środowiska wirtualnego:

```sh
python3 -m venv ~/.venv/rytm
~/.venv/rytm/bin/python -m pip install rytm-regulatory-monitor
~/.venv/rytm/bin/rytm --version
~/.venv/rytm/bin/rytm configure
~/.venv/rytm/bin/rytm doctor
```

W dalszych przykładach zastąp `rytm` pełną ścieżką `~/.venv/rytm/bin/rytm`, jeśli nie jest w PATH. Automatyka korzysta z systemd użytkownika; jej praca po wylogowaniu wymaga osobno skonfigurowanego utrzymywania sesji użytkownika.

## Najważniejsze polecenia

| Polecenie | Działanie |
|---|---|
| `rytm` | Stan instalacji i następny krok. |
| `rytm configure` | Kreator konfiguracji. |
| `rytm config show` | Ustawienia; zamiast wartości sekretów tylko status. |
| `rytm doctor` | Kontrola lokalna bez kosztów AI. |
| `rytm sources` | Rzeczywisty katalog źródeł i jawne ograniczenia. |
| `rytm collect` | Pobranie danych z włączonych źródeł. |
| `rytm report` | Płatny raport z już pobranych danych; w terminalu pyta o zgodę. Nie wysyła raportu. |
| `rytm send KATALOG_RAPORTU --dry-run` | Walidacja i podgląd bez wysyłki. |
| `rytm send KATALOG_RAPORTU` | Wysyłka opublikowanego raportu. |
| `rytm weekly` | Pełny cykl teraz; może kosztować i wykorzystuje próbę bieżącego tygodnia. Nie służy jako test. |
| `rytm service stop` | Zatrzymanie automatyki i kopia małego stanu przed aktualizacją. |
| `rytm service start` | Odtworzenie wybranej wcześniej automatyki i kontrola nowego bota. |
| `rytm service status` | Odczyt stanu zadań oraz wersji i PID pollera. |

Bez dat `collect` i `report` obejmują to samo okno według Europe/Warsaw: siedem poprzednich dat **wraz z dniem bieżącym**, od dzisiaj−7 do jutra (koniec wyłączny). To inne okno niż siedem zakończonych dni cyklu `weekly`. Możesz podać własny okres, zawsze parą dat; `--until` jest końcem wyłącznym:

```powershell
rytm collect --since 2026-10-19 --until 2026-10-27
rytm report --since 2026-10-19 --until 2026-10-27
```

Kod `2` z pobierania oznacza luki, nie dowód braku zmian. Pełny katalog może wymagać znacznie więcej czasu niż kilka źródeł. Raport czytaj w pliku `client-report.html` w katalogu wskazanym przez program; wysyłaj cały opublikowany katalog, nie katalog nieudanej próby.

## Harmonogram i bot w tle

```powershell
rytm schedule enable --day pon --time 07:00 --accept-cost
rytm schedule status
rytm bot config --enable --no-allow-refresh
rytm bot install
rytm bot status
```

Pierwsza komenda oznacza zgodę na kolejne płatne raporty. Windows tworzy zadania `Rytm\Weekly` i `Rytm\Bot`, uruchamiane w zalogowanej sesji tego samego użytkownika przez `rytmw.exe`, bez dodatkowej konsoli. Ustaw strefę Windows na Warszawę.

- Komputer musi być włączony, a użytkownik zalogowany; zablokowany ekran nie przeszkadza. Bot nie odpowiada podczas wyłączenia, uśpienia ani po wylogowaniu.
- Zadania mogą działać na baterii. Harmonogram nie wybudza komputera.
- Pominięty termin tygodniowy może zostać uruchomiony po powrocie dostępnego komputera i sesji. **To nie jest automatyczne odtworzenie wszystkich opuszczonych tygodni**: aplikacja podaje niepokryty okres jawnie.
- Restart bota po awarii ma odstęp jednej minuty i do 255 prób. Utworzenie zadania nie zastępuje kontroli heartbeat i odpowiedzi `/start`.

W Telegramie: `/start` lub `/pomoc` pokazuje pomoc, `/status` stan, `/nowosci` ostatni opublikowany raport bez nowej inferencji. `/odswiez` uruchamia pobranie i płatny raport tylko po osobnym włączeniu; do pokazu go nie potrzebujesz.

Wyłączenie: `rytm schedule disable` oraz `rytm bot remove`. Aby zabronić tylko płatnego odświeżania: `rytm bot config --no-allow-refresh`.

## Aktualizacja

### Z 0.3.4 i kolejnych wersji z poleceniem service

W osobnym PowerShell, na tym samym koncie:

```powershell
rytm service stop
```

**Dopiero przy kodzie `0` i potwierdzonym zatrzymaniu** przejdź dalej. Kod `2` oznacza trwającą pracę: poczekaj i ponów stop, bez zabijania analizy.

```powershell
py -m pip install --upgrade rytm-regulatory-monitor
rytm --version
rytm service start
rytm doctor
rytm service status
```

Po każdym błędzie przerwij; nie wykonuj automatycznie kolejnych komend. Na Linux aktualizuj przez Python właściwego venv. W ścieżce Python 3.14 używaj jawnie `py -3.14 -m pip` i modułu CLI 3.14.

### Pierwsza aktualizacja z 0.2.1

**0.2.1 nie ma `rytm service stop`.** Najpierw w niezależnym PowerShell tego samego użytkownika, po zakończeniu bieżącej pracy, zatrzymaj stare zadania natywnie:

```powershell
Get-ScheduledTask -TaskPath '\Rytm\'
Disable-ScheduledTask -TaskPath '\Rytm\' -TaskName 'Weekly'
Disable-ScheduledTask -TaskPath '\Rytm\' -TaskName 'Bot'
Stop-ScheduledTask -TaskPath '\Rytm\' -TaskName 'Weekly'
Stop-ScheduledTask -TaskPath '\Rytm\' -TaskName 'Bot'
Get-ScheduledTask -TaskPath '\Rytm\' | Select-Object TaskName,State
Get-Process rytm* -ErrorAction SilentlyContinue
```

Oczekuj obu zadań wyłączonych i **braku procesów `rytm*`**; sprawdź również, czy nie pozostała ręczna instancja `py -m rytm_monitor.app_cli`. Nie kończ wszystkich procesów Python. Gdy nie potrafisz potwierdzić stopu, nie uruchamiaj pip.

Następnie wykonaj instalację, kontrolę wersji **0.3.4**, `service start`, `doctor` i `service status` jak wyżej. `service start` obsługuje przejście z 0.2.1 na podstawie zapisanych zgód. Wyślij `/start` w Telegramie i sprawdź odpowiedź oraz świeży heartbeat bota wersji 0.3.4.

Aktualizacja pakietu **zachowuje pliki konfiguracji istniejącego workspace**. Nie oznacza automatycznego zastąpienia katalogu źródeł ani parametrów cenowych AI nowymi wartościami domyślnymi. Przed płatnym pokazem operator musi sprawdzić te parametry; nie resetuj workspace ani nie nadpisuj własnych ustawień w ciemno.

Kopia z `service stop` obejmuje mały stan, a nie całe archiwum. **Nie cofaj samego pakietu do 0.2.1 na stanie użytym już przez nową wersję.** Powrót wymaga właściwej kopii sprzed pierwszego startu nowej wersji i nadzoru operatora. Szczegóły zawiera `docs/OPERATOR-RUNBOOK.md` w repozytorium wydania.

## Dane i diagnostyka

Konfiguracja i jawny lokalny plik sekretów są domyślnie w `%APPDATA%\rytm-monitor` na Windows albo `~/.config/rytm-monitor` na Linux (`XDG_CONFIG_HOME` może zmienić lokalizację). Na Windows wymagana jest chroniona DACL katalogu konfiguracji tylko dla bieżącego użytkownika; dodatkowa DACL samego pliku sekretów jest nadawana i naprawiana best effort. To **nie szyfrowany sejf**. Workspace zawiera pobrane dokumenty, bazę, raporty i rejestry wysyłki; logi: `logs\bot.log` i `logs\weekly.log`.

AI wysyła fragmenty i metadane dokumentów do OpenRouter oraz dostawcy modelu; Telegram/Discord otrzymuje wiadomości i załączniki. Publikacje urzędowe mogą zawierać dane osobowe. Nie przekazuj aplikacji receptur ani poufnych danych zakładu. Pełną mapę danych i retencję opisuje `docs/PRIVACY.md` w repozytorium wydania.

| Objaw | Co sprawdzić / zrobić |
|---|---|
| `rytm` nie jest rozpoznawany lub ma starą wersję | `py -0p`, `Get-Command rytm -All`, wersja przez moduł. Wybierz jeden interpreter; przy braku 0.3.4 na PyPI przerwij aktualizację. |
| pip zgłasza WinError 5/32 | Stary proces lub launcher nadal działa. Potwierdź zatrzymanie obu zadań i ich procesów; nie wyłączaj Defendera. |
| doctor: usterka `calendar/strptime` | Python 3.14 obok; wszystkie polecenia przez `py -3.14 -m rytm_monitor.app_cli`. |
| doctor: ostrzeżenie DACL pliku (`broad`, `error`, `not_checked`) | Nie udało się potwierdzić dodatkowej ochrony `secrets.json`. Przy wymaganej prywatnej DACL katalogu ostrzeżenie pliku nie blokuje odczytu/zapisu i nie wymaga działania do normalnej pracy. Obcy właściciel pliku pozostaje odmową. |
| `/start` bez odpowiedzi | `rytm bot status`, `rytm doctor`, Internet, właściwy bot i czat. Stan Running zadania sam nie wystarcza. |
| 401 / `auth` | Token unieważniony lub błędny. Zatrzymaj usługę, zapisz nowy token w kreatorze i uruchom ponownie. |
| 409 / konflikt | Drugi poller lub webhook. Uzgodnij właściciela tokena; Rytm nie kasuje webhooka automatycznie. |
| `collect` kod 2 | Przeczytaj luki źródeł; nie obchodź blokad 403/429 ani limitów. |
| Raport nie powstał | Sprawdź zgodę, klucz, dane i komunikat limitu/walidacji. Nie uruchamiaj płatnej pętli ponowień. |
| Log przestał się dopisywać | W kandydacie znane jest zatrzymanie logowania powyżej około 256 KiB. Sprawdź także `rytm doctor`, status bota i harmonogramu; nie kasuj stanu w celu „naprawy”. Poprawka wymaga potwierdzenia operatora wydania. |
| `send`: `duplicate`, `partial` lub `unknown` | Sprawdź czat i poprzedni wynik. Niepewnej wysyłki nie ponawiaj w ciemno; nie kasuj rejestrów. `duplicate` nie dowodzi dostarczenia. |
| Poniedziałek minął bez raportu | `rytm schedule status`, sesja użytkownika, czas Windows i log `weekly.log`. Powiadomienie o błędzie również może nie dotrzeć przy braku sieci. |

Na terminalu wynik jest czytelny dla człowieka; w potoku lub z `--json` zwykłe wyniki i błędy parsera mają JSON. Pomoc i wersja pozostają tekstowe. Kody: `0` sukces, `1` błąd/odmowa, `2` wynik częściowy albo niegotowość (dla service: zajęte), `3` wyłączony `bot run`, `130` przerwanie. Ich dokładne znaczenie zależy od polecenia.

Licencja: wszelkie prawa zastrzeżone; brak licencji open source.
