Developer · FREE

Polowanie na race

Objawy czasem 409, podwojny zapis, lost update: rysuje wyscig dwoch aktow o wspolny stan, daje rownolegle repro i jedna obrone w bazie albo kolejce. Nie sleep 100 ms.

reviewed:

Jak zainstalować

  1. Uzupełnij pola poniżej (albo zostaw nazwy zmiennych i dopisz w czacie). Wartości z Skill creatora na liście podstawiają się same.
  2. Kopiuj, potem wklej w Claude.ai (instrukcje projektu) albo ChatGPT (Custom Instructions).
  3. Albo pobierz SKILL.md i połóż w folderze skilli Claude Code.
SKILL
Objaw: [OBJAW]. Wspolny stan (wiersz, plik, klucz, kasa, unikalny email): [STAN]. Transakcja / unique / lock (tak/nie, co dokladnie): [TRANSAKCJA]. Dwa request-id z logu (opcjonalnie): [REQUEST_IDS].

NIE PISZ PATCHA NA WEJSCIU. NIE proponuj `sleep`, `setTimeout`, `synchronized` na caly serwis, "retry az przejdzie".

Jesli [STAN] pusty - dopytaj CO jest wspoldzielone i KTO dwoch to rusza, i stop.
Jesli nie da sie wyslac dwoch requestow rownolegle - napisz czego brakuje (endpoint, auth, narzedzie) i stop.

Zwracasz:

## 1. Wyscig
- Akt A: kto, jaka mutacja, jaki klucz.
- Akt B: kto, jaka mutacja, ten sam klucz.
- Stan wspolny: nazwa tabeli/kolejki/pliku + pole.
- Czego brakuje: unique / version column / lock / single consumer / idempotency-key.

## 2. Oś czasu (dwie linie)
```
A: read(v) -------- write(v) ---->
B:    read(v) -------- write(v) ---->
                    ^ lost update / duplikat
```
Wstaw prawdziwe nazwy z [STAN], nie "v".

## 3. Repro ROWNOLEGLE
Nie "odpal dwa razy po kolei". Skrypt:
- `xargs -P` / GNU parallel / k6 (2+ vu, ten sam payload) / dwa `curl` w tle.
- asercja: duplikat wiersza, 409, rozjazd salda, dwa maile.
- to samo dwa razy z rzędu = ten sam wynik (deterministyczne okno, nie "czasem").

## 4. Jedna obrona
Wybierz JEDNA, w tej kolejnosci preferencji:
1. unique constraint / upsert na kluczu biznesowym
2. kolumna wersji (optimistic: UPDATE ... WHERE version=n)
3. jedna kolejka, jeden consumer na klucz
Nie: sleep 100ms, "retry w UI", lock w pamieci procesu.

## 5. Test, ktory pali stary kod
Rownolegly test (k6 albo dwa requesty w tesie integracyjnym). Na starym kodzie ma PADAC. Po "ok, koduj": minimalny diff + ten test.

Jesli [REQUEST_IDS] sa: uzyj ich jako dowodu dwoch aktow, nie zgaduj trzeciego.
Dywiz "-". Kod po angielsku.

Zanim wkleisz

Skill vs zły prompt

Zły prompt

Czasem 409, dodaj sleep i retry, bedzie git.

Skill

Objaw: [OBJAW]. Wspolny stan (wiersz, plik, klucz, kasa, unikalny email): [STAN]. Transakcja / unique / lock (tak/nie, co dokladnie): [TRANSAKCJA]. Dwa request-id z logu (opcjonalnie): [REQUEST_IDS].

NIE PISZ PATCHA NA WEJSCIU. NIE proponuj `sleep`, `setTimeout`, `synchronized` na caly serwis, "retry az przejdzie".

Jesli [STAN] pusty - dopytaj CO jest wspoldzielone i KTO dwoch to rusza, i stop.
Jesli nie da sie wyslac dwoch requestow rownolegle - napisz czego brakuje (endpoint, auth, narzedzie) i stop.

Zwracasz:

Użyj z tym narzędziem

Lekcja: claude-start-06-claude-dla-programisty

Pytania

Jak użyć skilla "Polowanie na race" w Claude?

Uzupełnij pola w nawiasach (albo weź je z profilu Skill creator na /skille), kliknij Kopiuj i wklej treść do instrukcji projektu w Claude.ai. W Claude Code kliknij Pobierz SKILL.md i połóż plik w folderze skilli. Skill działa też w ChatGPT (Custom Instructions). Nie chowa się za paywallem: kopia jest darmowa.

Kiedy tego skilla NIE używać?

Nie gdy to zwykly flaky test UI bez wspoldzielonego stanu (to testy-flaky-izolacja). Nie do dorzuc synchronized na wszystko. Nie gdy nie umiesz wyslac dwoch requestow naraz.