# Capordia — ćwiczenie przełączenia i wznowienia, wersja 1.0.0

To ćwiczenie CPU porównuje przetwarzanie ciągłe z przetwarzaniem przerwanym,
skopiowanym do innego folderu, a następnie wznowionym w nowym procesie. Pozwala
stwierdzić, które partie są zakończone, w toku i do wznowienia. Nie mierzy
żadnego GPU i nie demonstruje migracji bez przerwy.

## Przygotowanie ćwiczenia

Użyj Pythona 3.10 lub nowszego z modułami standardowymi `sqlite3` i
`hashlib`, na lokalnym dysku z prawem zapisu. Żaden pakiet, dostęp sieciowy,
konto, sekret ani uprawnienia administratora nie są potrzebne. Rozpakuj
wszystkie pliki z folderu, a następnie otwórz terminal w tym folderze. Jeśli
system używa `python3` lub `py -3`, zastąp `python` w poleceniach. Skrypt i
zbiór danych wejściowych pozostają oddzielone od folderów roboczych, które
tworzy.

Nie uruchamiaj tego ćwiczenia w folderze produkcyjnym ani na udziale
sieciowym. Wybierz nazwę folderu roboczego, która nie istnieje: program
odmawia ponownego użycia lub nadpisania istniejącego folderu.

```text
python exercice.py demonstration --dossier essai-capordia
```

To polecenie tworzy `essai-capordia/rapport-verification.json` oraz foldery
każdego scenariusza. Kończy się kodem 0 tylko wtedy, gdy wszystkie kontrole
zakończą się powodzeniem. Uruchom ponownie z nową nazwą, aby wykonać nową
próbę. Polecenie nie usuwa żadnej poprzedniej próby.

## Nasz przykład: osiem partii fikcyjnych kuponów

Osiem plików CSV zawiera po sześć oryginalnych i fikcyjnych pomiarów
wymiarowych. Każdy wiersz zawiera `coupon`, `cible_um` i `mesure_um`.
Jednostkami są całkowite mikrometry. Żadna liczba nie pochodzi z maszyny
produkcyjnej ani od klienta. Dla każdej partii przetwarzanie oblicza liczbę
kuponów, sumę i maksimum odchyleń bezwzględnych oraz liczbę odchyleń
mniejszych lub równych 15 µm. Ten próg jest regułą ćwiczenia, a nie zalecaną
tolerancją przemysłową.

Wynik zawiera numer partii, wersję receptury i skrót SHA-256 danych
wejściowych. Użycie liczb całkowitych pozwala tu na dokładne porównanie.
Obciążenie GPU z obliczeniami zmiennoprzecinkowymi wymagałoby własnej reguły
porównania i uzasadnionych tolerancji.

## Odczyt stanów

| Stan w rejestrze | Znaczenie w tym ćwiczeniu | Działanie przy wznowieniu |
|---|---|---|
| `termine` | Wynik zaakceptowany i stan zapisany w tej samej transakcji | Sprawdź; nie przeliczaj ponownie |
| `en_cours` | Próba zadeklarowana, żaden wynik niezaakceptowany | Zbadaj poprzedni organ, a następnie zezwól na wznowienie |
| `a_reprendre` | Partia nierozpoczęta lub próba wyraźnie przywrócona do kolejki | Wykonaj próbę |

Po wstrzykniętym przerwaniu na LOT-004: LOT-001 do LOT-003 są zakończone,
LOT-004 jest w toku, LOT-005 do LOT-008 są do wznowienia. Żaden wynik
LOT-004 nie jest zaakceptowany. Po `preparer-reprise` pozostają trzy
zakończone i pięć do wznowienia. Na końcu osiem wyników musi być równych
wynikom referencyjnym. Tylko LOT-004 ma dwie próby.

## Powtórzenie przełączenia krok po kroku

Poniższe ścieżki są względne wobec folderu zawierającego `exercice.py`.
Przerwanie to wyjątek wstrzyknięty po obliczeniu i przed akceptacją; kod 75
na tym etapie jest oczekiwany. Proces zatrzymuje się i zwalnia swoją blokadę.
Nie jest to nagłe zatrzymanie komputera ani awaria zasilania.

```text
python exercice.py initialiser --dossier manuel/reference --proprietaire reference
python exercice.py executer --dossier manuel/reference
python exercice.py initialiser --dossier manuel/source --proprietaire atelier-source
python exercice.py executer --dossier manuel/source --interrompre-sur LOT-004
python exercice.py etat --dossier manuel/source
python exercice.py basculer --source manuel/source --destination manuel/cible --proprietaire atelier-cible
python exercice.py preparer-reprise --dossier manuel/cible
python exercice.py executer --dossier manuel/cible
python exercice.py comparer --reference manuel/reference --candidat manuel/cible
```

`basculer` przejmuje lokalną blokadę, kontroluje zbiór, zamyka źródło, zamyka
połączenia SQLite i kopiuje folder. Kopia pozostaje zamknięta do końca jej
weryfikacji; dopiero potem tylko cel jest upoważniony do produkcji. Polecenie
wykonania uruchomione na zamkniętym źródle zwraca kod 2 z `SOURCE_CLOTUREE`.

Polecenie porównania wymaga ośmiu zaakceptowanych wyników po każdej stronie,
sprawdza ich dane wejściowe i wyjściowe, a następnie porównuje kanoniczną
serializację JSON wyników. Eksporty tekstowe można odtworzyć z SQLite: nie są
one autorytetem decydującym o tym, czy wynik jest zaakceptowany.

## Pliki, które powstają

| Plik | Rola |
|---|---|
| `registre.sqlite` | Stan referencyjny, próby, właściciel, zamknięcie i zaakceptowane wyniki |
| `manifeste.json` i `donnees/` | Zamrożony zestaw danych wejściowych z oczekiwanymi odciskami |
| `etat.json` | Czytelny stan i liczba trzech statusów |
| `registre-lots.csv` | Eksport: id, etat, tentatives, entree_sha256, sortie_sha256 |
| `resultats.json` | Eksport zaakceptowanych wyników w kolejności identyfikatorów |
| `rapport-verification.json` | W globalnym folderze demonstracyjnym: kontrole, środowisko i wyniki poleceń |
| `worker.lock` | Tymczasowa blokada naszego programu, usuwana przy jego normalnym zakończeniu lub przy wstrzykniętym przerwaniu |

Plik `registre-lots-vierge.csv` dostarczony w zasobie to szerszy szablon dla
Twojego zespołu. Dodaje odpowiedzialnego, dozwoloną maszynę, kryterium
akceptacji i powód wznowienia. Nie zastępuje bazy ćwiczenia i nie jest
importowany przez program.

## Sprawdzone błędy

Demonstracja testuje również ponowne uruchomienie zakończonej pracy, odrzucenie
drugiej akceptacji tego samego lotu, zmienione dane wejściowe, zduplikowany
identyfikator w manifeście, zmieniony wynik, już istniejącą blokadę oraz wyjątek
wewnątrz transakcji akceptacji. Ten ostatni przypadek pozostawia trzy
zaakceptowane wyniki, a nie cztery, a następnie odnajduje osiem wyników po
wznowieniu. Powrót jest testowany przez skopiowanie świeżego stanu celu do
trzeciego folderu i zamknięcie celu. Nie reaktywuje się starego snapshota.

Kody wyjścia to: 0 sukces; 2 oczekiwana odmowa biznesowa; 75 oczekiwane
wstrzyknięte przerwanie; 1 błąd odczytu lub bazy danych. Globalny scenariusz
wyraźnie oczekuje odmów, które wywołuje. Inny błąd powoduje niepowodzenie testu.

## Ograniczenia, które należy zachować wraz z wynikami

W tym ćwiczeniu uczestniczy tylko jeden worker. Blokada i pole zamknięcia
działają w lokalnych folderach obsługiwanych przez ten program. Nie powstrzymują
jednak osoby przed skopiowaniem bazy ani innego programu przed zignorowaniem
blokady. To nie jest fencing rozproszony. Przed prawdziwym przełączeniem stara
maszyna musi utracić prawo do publikowania przez niezależny i przetestowany
mechanizm. Jeśli jej zatrzymanie nie jest potwierdzone, nie uruchamia się
drugiego autorytetu.

Transakcja grupuje tutaj wynik i status w **tej samej lokalnej bazie**.
Nie obejmuje wysyłki do systemu zewnętrznego, powiadomienia ani pliku już
zużytego gdzie indziej. Brak zweryfikowanej podwójnej akceptacji ogranicza się
do tej bazy i tego ćwiczenia. SHA-256 wykrywa tutaj rozbieżność między bajtami
a oczekiwanym odciskiem; modyfikowalny manifest wraz z danymi nie
uwierzytelnia ich pochodzenia.

Jeśli proces zostanie gwałtownie zabity, blokada może pozostać. Sprawdź jego
rzeczywiste zatrzymanie przed jakąkolwiek ręczną interwencją; ćwiczenie nigdy
nie usuwa automatycznie blokady uznanej za starą. Przerwanie kopiowania
pozostawia źródło zamknięte: zachowaj foldery i zbadaj incydent, nie
przywracając dwóch kopii do działania. Utrata zasilania, sieciowe systemy
plików, współbieżność między maszynami, sterowniki GPU, checkpointy frameworków
i wydajność nie są tu kwalifikowane.

## Wynik naszej kontroli

24 września 2026, w systemie Windows AMD64, Python 3.14.6 i SQLite 3.50.4:
16 udanych kontroli, 37 wykonanych poleceń, 8 identycznych zaakceptowanych
wyników po przełączeniu. Możliwy do sprawdzenia dowód to `preuve-execution-cpu.json`.
Odcisk kanonicznych wyników to
`bde1bc833092cc8ca481cda5f44cfef36f14f0a94dff3f856624e169f5456660`.
Te liczby opisują ten zestaw 48 wierszy i nie są benchmarkiem GPU.

Zobacz [PROCEDURE.md](PROCEDURE.md), aby poznać obowiązki i powrót,
[SOURCES.md](SOURCES.md), aby poznać źródła pierwotne, oraz [LICENSE.txt](LICENSE.txt),
aby poznać warunki ponownego wykorzystania.
