
Claude Code 2.1.309–2.1.312: poprawki sandboxa i hooków, a zdarzenie safety_event znika
Cztery wydania Claude Code, 2.1.309, 2.1.310, 2.1.311 i 2.1.312, opublikowane między 22 a 27 października 2026, składają się na jedną większą aktualizację bezpieczeństwa. Naprawiają sandbox, który w kilku miejscach nie trzymał granicy, oraz hooki uprawnień na Windows, które przy braku Git Bash przepuszczały wywołanie narzędzia zamiast je zablokować.
Jest też zmiana, która może po cichu wyłączyć Twoje alerty. Wersja 2.1.307 dodała zdarzenie OpenTelemetry claude_code.safety_event, a 2.1.312 przestaje je wysyłać. Notatki wydania nie podają powodu. Jeśli po poprzednich wydaniach ustawiłeś na nim alarmy, po aktualizacji będą milczeć.
Ten tekst opiera się na notatkach wydań na GitHubie. Wcześniejsze zmiany, w tym wymóg zgody człowieka w hookach modów, opisałem w tekście o wersjach 2.1.304–2.1.306.
W skrócie:
- Sandbox (2.1.309): pliki startowe powłoki nie wykonują się już poza sandboxem,
denyWritedziała przez symlinki, a plik z--mcp-configjest chroniony przed zapisem. - Hooki na Windows (2.1.309 i 2.1.310):
PreToolUseiPermissionRequestnie przepuszczają już wywołania, gdy brakuje Git Bash. - CLAUDE.md (2.1.312): agent nie nadpisze bardzo dużego pliku po przeczytaniu tylko jego początku.
safety_event(2.1.312): zdarzenie przestaje być wysyłane. Sprawdź swoje alerty.
Co zmieniły wersje 2.1.309–2.1.312
Strona wydań GitHuba pokazuje dzień i godzinę, ale nie rok, więc rok 2026 wnioskuję z kontekstu. Wybrałem zmiany związane z bezpieczeństwem i niezawodnością. Pełne listy są znacznie dłuższe.
| Wersja | Data | Zmiana |
|---|---|---|
| 2.1.309 | 22 października | sandbox: polecenia na macOS i Linuksie nie uruchamiają już plików startowych powłoki poza sandboxem |
| 2.1.309 | 22 października | sandbox: wzorce denyWrite na macOS działają także, gdy katalog wzorca jest osiągany przez symlink |
| 2.1.309 | 22 października | sandbox: polecenia i automatycznie zaakceptowane edycje nie mogą zmienić pliku podanego w --mcp-config |
| 2.1.309 | 22 października | Linux: blokady zapisu w sandboxie nie znikają, gdy polecenie w tle przeżyje sesję |
| 2.1.309 | 22 października | Windows: hooki PreToolUse i PermissionRequest z "shell": "powershell" nie przepuszczają wywołania, gdy nie ma Git for Windows |
| 2.1.309 | 22 października | hooki PowerShell blokują wywołanie, gdy program hooka kończy się kodem 2 |
| 2.1.309 | 22 października | sed -i dostaje standardowy monit Basha i działa tak, jak napisano |
| 2.1.309 | 22 października | claude ultrareview wymaga zaufania do katalogu roboczego (w skryptach flaga --trust-workspace) |
| 2.1.310 | 23 października | Windows: hooki nie przepuszczają wywołania, gdy brakuje Git Bash, a polecenie hooka to wyłącznie cytowane ciągi, na przykład ścieżka w cudzysłowie |
| 2.1.310 | 23 października | monit o odczyt pliku pokazuje, dokąd prowadzi symlink |
| 2.1.310 | 23 października | Monitor i monitory wtyczek działają na Bedrocku, Vertex i Foundry |
| 2.1.311 | 26 października | Linux: polecenia w sandboxie nie padają z bwrap: Can't create file przy --plugin-dir będącym też dodanym katalogiem i blockReadsOutsideWorkingDirectories |
| 2.1.311 | 26 października | hooki SubagentStop uruchamiają się raz po zakończeniu subagenta, a nie około dwa razy na minutę |
| 2.1.311 | 26 października | worktree subagenta nie jest usuwane, gdy jego potomny agent w tle jeszcze pracuje |
| 2.1.311 | 26 października | subagenci widzą narzędzia MCP z serwerów, które kończą łączenie już po ich starcie |
| 2.1.311 | 26 października | koniec ponawiania żądań, które API oznaczyło jako nieponawialne (w trybie bez nadzoru mogło to trwać w nieskończoność) |
| 2.1.312 | 27 października | Write nie nadpisuje bardzo dużego CLAUDE.md, pliku reguł ani pliku z @ po przeczytaniu tylko początku |
| 2.1.312 | 27 października | claude_code.safety_event przestaje być wysyłane |
| 2.1.312 | 27 października | oidc.user_id_claim w bramce aplikacji Claude: identyfikacja po claimie innym niż sub, na przykład oid z Entra ID |
| 2.1.312 | 27 października | skills katalogowe i paths: są znajdowane po cd w głąb repozytorium |
| 2.1.312 | 27 października | polityki organizacji są pobierane po zalogowaniu z rozszerzenia VS Code |
Wersja 2.1.309 ma też wiele mniejszych poprawek uprawnień. Przykłady: polecenia złożone ze zmianą katalogu przed git w owiniętej lub poprzedzonej formie dostają teraz monit jak zwykłe cd, reguła deny na Edit(ścieżka) blokuje przekierowanie Basha do tej ścieżki także w poleceniu z podpowłoką, a na Windows PowerShell nie zatwierdza już automatycznie niektórych poleceń cd z dodatkowymi argumentami.
Sandbox: trzy granice, które nie trzymały
Najpoważniejsze są trzy poprawki z 2.1.309. Opiszę je jako ryzyka, bo tak je należy czytać. Notatki wydania nie podają, czy ktoś te luki wykorzystał.
1. Pliki startowe powłoki poza sandboxem. Na macOS i Linuksie powłoka wykonywała swoje pliki startowe przed każdym poleceniem poza sandboxem. Jeśli ktoś mógł wpisać coś do takiego pliku, miał kod uruchamiany bez ograniczeń. To dokładnie ten rodzaj luki, który ma znaczenie przy nieufnych repozytoriach.
2. denyWrite przez symlink. Wzorzec zakazu zapisu nie działał w prawdziwym miejscu ścieżki, gdy katalog wzorca był osiągany przez symlink. Zakaz, który wygląda na ustawiony, a nie działa, jest gorszy od braku zakazu, bo daje fałszywe poczucie bezpieczeństwa. Powiązana poprawka: ochrona zapisu do magazynu profilu też nie działała, gdy katalog konfiguracji był osiągany przez symlink. W 2.1.310 monit o odczyt zaczął dodatkowo pokazywać, dokąd symlink prowadzi, więc widać, co właściwie zatwierdzasz.
3. Plik z --mcp-config. Polecenia w sandboxie i automatycznie zaakceptowane edycje mogły zmienić plik konfiguracji MCP przekazany we fladze. Kto kontroluje ten plik, kontroluje, jakie serwery i narzędzia dostanie agent.
Czwarta: na Linuksie blokady zapisu w sandboxie znikały, gdy polecenie uruchomione w tle przeżyło sesję.
Do tego zmiana domyślnego zachowania: polecenia wyłączone z sandboxa w ustawieniach pytają teraz o zgodę przed zapisem do ścieżek z listy zapisu, gdy sandbox jest włączony, ale nie może się uruchomić. Powrót do wykonania bez sandboxa jest tam odmówiony. To zgodne z kierunkiem, który opisałem wcześniej: lepiej, żeby polecenie się nie wykonało, niż żeby cicho poszło bez ochrony.
Hooki na Windows, które przepuszczały wywołania
Jeśli traktujesz hooki jako warstwę bezpieczeństwa, ta sekcja jest najważniejsza. Dwa różne przypadki, dwie poprawki:
- 2.1.309: hooki
PreToolUseiPermissionRequestz"shell": "powershell"na Windows otwierały się (fail open), gdy Git for Windows nie był zainstalowany. Czyli hook, który miał zablokować wywołanie, przepuszczał je. Osobno: hooki PowerShell nie blokowały, gdy ich program kończył się kodem 2. - 2.1.310: podobna sytuacja, gdy brakowało Git Bash, a polecenie hooka składało się wyłącznie z cytowanych ciągów, na przykład z ścieżki w cudzysłowie.
Wspólny wniosek: hook, który zawodzi cicho i przepuszcza, jest gorszy niż hook, który zawodzi głośno i blokuje. Jak działają hooki i czym różnią się od MCP, skilli i subagentów, opisuje tekst MCP, skill, subagent, hook. Analogiczne zasady w Copilocie omawiam w tekście o hookach w GitHub Copilot, a odpowiednik pytania „kto zatwierdza”, czyli tryb Assisted, w tekście o uprawnieniach i globalnej polityce domyślnej w Copilocie.
Dla organizacji na Windows rada jest praktyczna: zaktualizuj do 2.1.310 lub nowszej i sprawdź w testach, czy hook rzeczywiście blokuje na maszynie bez Git Bash. Nie polegaj na tym, że poprawka działa, bo tego nie mogę potwierdzić w Twoim środowisku.
Zdarzenie safety_event: dodane 21 października, wyłączone 27 października
Wersja 2.1.307 z 21 października dodała zdarzenie claude_code.safety_event. Rejestrowało każde wywołanie narzędzia zatrzymane, zakończone pytaniem o zgodę albo odesłane przez regułę uprawnień, tryb auto, kontrolę bezpieczeństwa, hook lub sandbox. To naturalne źródło alertów o próbach obejścia uprawnień.
Wersja 2.1.312 notuje w swoich zmianach, że Claude Code przestaje wysyłać to zdarzenie. Powodu nie podano.
Co z tego wynika:
- Jeśli po 2.1.307 skonfigurowałeś alarmy na
claude_code.safety_event, po aktualizacji do 2.1.312 przestaną one dostawać dane. Brak alarmów będzie wyglądał jak brak incydentów, a nie jak brak telemetrii. - Na poprzednie rady o obserwowaniu tego zdarzenia, w tym punkt 8 w mojej liście dla CI w tekście o 2.1.305, trzeba dziś patrzeć z zastrzeżeniem. Zdarzenie istniało w wersjach od 2.1.307 do 2.1.311.
- Nie wiem, czy producent planuje zastąpić je czymś innym. Notatki tego nie mówią, więc nie zgaduję.
Co zrobić: sprawdź, czy któryś alert, dashboard lub reguła opiera się na tej nazwie zdarzenia. Jeśli tak, na czas braku następcy oprzyj nadzór na tym, co jest pewne: logach sesji, regułach deny oraz zewnętrznej granicy (kontener, maszyna wirtualna). Alarm, który nie ma jak się uruchomić, nie jest alarmem.
Duże pliki CLAUDE.md: dwie zmiany, jedna po drugiej
W 2.1.309 poprawiono sesje, które w kółko się kompaktowały po przeczytaniu plików pod bardzo dużym zagnieżdżonym CLAUDE.md. Zagnieżdżony CLAUDE.md powyżej limitu rozmiaru ładuje się teraz tylko od początku.
W 2.1.312 poprawiono skutek uboczny w drugą stronę: agent mógł nadpisać bardzo duży CLAUDE.md, plik reguł albo plik dołączony przez @ w podkatalogu, widząc tylko jego początek. Teraz Write prosi Claude’a o przeczytanie całości albo o edycję w miejscu.
To moja interpretacja, nie zapis z notatek: obie zmiany wyglądają na dwie strony tego samego mechanizmu, czyli częściowego ładowania dużych plików. Praktyczny wniosek jest niezależny od przyczyny: jeśli masz rozbudowane instrukcje, zrób kopię lub trzymaj plik w Gicie, a po aktualizacji sprawdź, jak agent zachowuje się na największym pliku z instrukcjami. W 2.1.311 naprawiono jeszcze długie zawieszenia przy starcie, gdy CLAUDE.md zawierał pojedynczą bardzo długą pozycję listy.
Jak utrzymać instrukcje w ryzach, opisuje tekst AGENTS.md: jeden plik instrukcji.
Subagenci i długie sesje (2.1.311)
Wydanie z 26 października to głównie niezawodność:
- Hooki
SubagentStopuruchamiały się około dwa razy na minutę dla każdego działającego subagenta zamiast raz po jego zakończeniu. Jeśli podpiąłeś pod nie logowanie, powiadomienia lub koszty, miałeś zawyżone liczby. - Worktree subagenta bywało usuwane, gdy jego własny agent w tle jeszcze w nim pracował.
- Subagenci nie widzieli narzędzi MCP z serwerów, które kończyły łączenie już po ich starcie.
- Claude Code ponawiał żądania, które API oznaczyło jako nieponawialne. W trybie bez nadzoru (
CLAUDE_CODE_RETRY_WATCHDOG) mogło to trwać w nieskończoność, co przy płatnym API oznacza realny koszt.
Rozbudowane wzorce pracy z subagentami opisuje panel subagentów w modach Claude Code.
Checklista po aktualizacji
- Zaktualizuj do 2.1.312 i przypnij wersję w obrazie runnera. To moje zalecenie, nie zapis z notatek.
- Windows: sprawdź hook
PreToolUsena maszynie bez Git Bash. Oczekiwany wynik to blokada, nie przepuszczenie. - macOS i Linux: przetestuj reguły
denyWriteprzez ścieżkę z symlinkiem. Upewnij się, że plik przekazany w--mcp-confignie jest zapisywalny dla agenta. - Telemetria: wyszukaj w konfiguracji OTel i w alertach nazwę
claude_code.safety_event. Po 2.1.312 nie wyśle ona nic. - Duże CLAUDE.md: zrób test na największym pliku instrukcji i trzymaj go w kontroli wersji.
- Nienadzorowane uruchomienia: ustaw
--max-turnsi--max-budget-usdjako bezpieczniki, bo wcześniejsze ponawianie nieponawialnych żądań mogło generować koszty. Limity planów zestawiłem w tekście o cenach i limitach narzędzi agentowych. - SSO: jeśli używasz bramki aplikacji Claude z Entra ID, nowe
oidc.user_id_claimpozwala identyfikować ludzi pooidzamiast posub.
Najczęstsze pytania
Czy muszę aktualizować Claude Code z 2.1.308? Tak, jeśli pracujesz z nieufnymi repozytoriami, na Windows z hookami albo w trybie auto. Wersja 2.1.309 łata kilka obejść sandboxa. Notatki nie mówią o wykorzystaniu tych luk w praktyce.
Czy hooki na Windows były naprawdę podatne?
Notatki opisują dwa przypadki, w których hook PreToolUse lub PermissionRequest przepuszczał wywołanie: przy braku Git for Windows (2.1.309) i przy braku Git Bash z poleceniem złożonym z cytowanych ciągów (2.1.310). Oba są naprawione. Nie wiem, ilu użytkowników to dotknęło.
Czym zastąpić claude_code.safety_event?
Notatki wydania nie wskazują następcy. Do czasu wyjaśnienia opieraj nadzór na logach sesji, regułach deny i granicy zewnętrznej.
Co z poleceniem /claude-api api-version?
Dodano je w 2.1.307 (21 października) i służy do przenoszenia kodu na wersję API 2026-10-21. Migrację opisałem w tekście o Claude API w wersji 2026-10-21.
Źródła: notatki wydań Claude Code na GitHubie: v2.1.307 (21 października 2026), v2.1.309 (22 października), v2.1.310 (23 października), v2.1.311 (26 października), v2.1.312 (27 października).
Stan na 28 października 2026. Strona wydań nie podaje roku, a powodu wyłączenia safety_event notatki nie wyjaśniają.
EfektywnyDev pisze o AI w praktyce: co zmiana w narzędziu oznacza w codziennej pracy z agentami, a nie tylko w notatkach wydania.
Nowe materiały prosto na maila
Publikuję nowy artykuł albo lekcję kursu — dostajesz jednego maila. Nic poza tym.
Bez cyklu wydawniczego i newsów o każdej premierze modelu
Zapisy do newslettera otwieram partiami, żeby nie zamieniać go w kolejny kanał ze spamem i recyklingiem linków.
Jeśli chcesz dostać informację przy następnym otwarciu zapisów, napisz na [email protected].

O autorze
Marcin Szymański
Od kilkunastu lat buduję systemy w .NET i Azure — obecnie rozproszony monitoring PingView. Piszę tu o pracy człowiek + agenci AI na realnych workflow, nie na demach. Zawodowo prowadzę audyty, rescue projektów i wdrożenia AI-assisted delivery w zespołach.