# Capordia — latihan peralihan dan pemulihan, versi 1.0.0

Latihan CPU ini membandingkan pemrosesan berkelanjutan dengan pemrosesan yang terputus,
disalin ke folder lain lalu dilanjutkan dalam proses baru. Latihan ini memungkinkan
untuk mengetahui lot mana yang selesai, sedang berjalan, dan perlu dilanjutkan. Latihan ini tidak mengukur
GPU apa pun dan tidak membuktikan migrasi tanpa gangguan.

## Menyiapkan latihan

Gunakan Python 3.10 atau yang lebih baru dengan modul standar `sqlite3` dan
`hashlib`, pada disk lokal yang dapat ditulisi. Tidak diperlukan paket, akses jaringan,
akun, rahasia, atau administrator. Ekstrak semua file
dari folder, lalu buka terminal di folder tersebut. Jika sistem menggunakan
`python3` atau `py -3`, ganti `python` dalam perintah. Skrip dan
kumpulan input tetap terpisah dari folder kerja yang dibuatnya.

Jangan jalankan latihan ini di folder produksi atau pada berbagi
jaringan. Pilih nama folder kerja yang belum ada: program
menolak menggunakan ulang atau menimpa folder yang sudah ada.

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

Perintah ini membuat `essai-capordia/rapport-verification.json` dan folder
setiap skenario. Perintah ini berakhir dengan kode 0 hanya jika semua
pemeriksaan berhasil. Jalankan ulang dengan nama baru untuk percobaan baru.
Perintah ini tidak menghapus percobaan sebelumnya.

## Contoh kami: delapan lot kupon fiktif

Delapan CSV masing-masing berisi enam pengukuran dimensi asli dan
fiktif. Setiap baris berisi `coupon`, `cible_um` dan `mesure_um`. Satuannya
adalah mikrometer bilangan bulat. Tidak ada angka yang berasal dari mesin
produksi atau klien. Untuk setiap lot, pemrosesan menghitung jumlah
kupon, jumlah dan maksimum selisih absolut, dan jumlah selisih
yang kurang dari atau sama dengan 15 µm. Ambang ini adalah aturan latihan, bukan
toleransi industri yang direkomendasikan.

Hasilnya berisi nomor lot, versi resep dan sidik jari
SHA-256 dari input. Penggunaan bilangan bulat di sini memungkinkan perbandingan yang tepat.
Beban GPU dengan perhitungan floating point memerlukan aturan perbandingan
tersendiri dan toleransi yang dibenarkan.

## Membaca status

| Status dalam register | Arti dalam latihan ini | Pemrosesan saat pemulihan |
|---|---|---|
| `termine` | Hasil diterima dan status dicatat dalam satu transaksi | Verifikasi; jangan hitung ulang |
| `en_cours` | Upaya dideklarasikan, tidak ada hasil yang diterima | Periksa otoritas lama lalu izinkan pemulihan |
| `a_reprendre` | Lot belum dimulai atau upaya secara eksplisit dikembalikan ke antrean | Jalankan upaya |

Setelah pemutusan yang disuntikkan pada LOT-004: LOT-001 hingga LOT-003 selesai,
LOT-004 sedang berjalan, LOT-005 hingga LOT-008 perlu dilanjutkan. Tidak ada hasil dari
LOT-004 yang diterima. Setelah `preparer-reprise`, tersisa tiga yang selesai dan
lima yang perlu dilanjutkan. Pada akhirnya, delapan hasil harus sama dengan hasil
referensi. Hanya LOT-004 yang memiliki dua upaya.

## Melakukan peralihan langkah demi langkah

Jalur berikut relatif terhadap folder yang berisi `exercice.py`.
Pemutusan adalah pengecualian yang disuntikkan setelah perhitungan dan sebelum penerimaan;
kode 75 pada tahap ini sudah diharapkan. Proses berhenti dan melepaskan
kuncinya. Ini bukan penghentian mendadak komputer maupun gangguan listrik.

```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` mengambil kunci lokal, memeriksa kumpulan, menutup sumber, menutup
koneksi SQLite dan menyalin folder. Salinan tetap tertutup hingga
verifikasinya selesai; hanya target yang kemudian diizinkan untuk berproduksi.
Perintah eksekusi yang dijalankan pada sumber yang tertutup mengembalikan kode 2
dengan `SOURCE_CLOTUREE`.

Perintah pembandingan menuntut delapan hasil yang diterima dari setiap sisi,
memeriksa masukannya dan keluarnya, lalu membandingkan serialisasi JSON
kanonis dari hasil tersebut. Ekspor teks dapat direkonstruksi dari
SQLite: ekspor tersebut bukan otoritas yang menentukan apakah suatu hasil
diterima.

## Berkas yang dihasilkan

| Berkas | Peran |
|---|---|
| `registre.sqlite` | Status acuan, percobaan, pemilik, penutupan, dan hasil yang diterima |
| `manifeste.json` dan `donnees/` | Kumpulan masukan yang dibekukan beserta sidik jari yang diharapkan |
| `etat.json` | Status yang dapat dibaca dan rekap ketiga status |
| `registre-lots.csv` | Ekspor: id, etat, tentatives, entree_sha256, sortie_sha256 |
| `resultats.json` | Ekspor hasil yang diterima, dalam urutan pengenal |
| `rapport-verification.json` | Di folder demonstrasi global: pemeriksaan, lingkungan, dan keluaran perintah |
| `worker.lock` | Kunci sementara program kami, dihapus saat keluar normal atau saat pemutusan yang disuntikkan |

Berkas `registre-lots-vierge.csv` yang disediakan dalam sumber daya adalah templat
yang lebih luas untuk tim Anda. Berkas itu menambahkan penanggung jawab, mesin yang
diizinkan, kriteria penerimaan, dan alasan pengambilan kembali. Berkas itu tidak
menggantikan basis latihan dan tidak diimpor oleh program.

## Kesalahan yang diverifikasi

Demonstrasi juga menguji peluncuran ulang pekerjaan yang telah selesai, penolakan
penerimaan kedua atas lot yang sama, masukan yang diubah, pengenal yang duplikat
dalam manifes, keluaran yang diubah, kunci yang sudah ada, dan pengecualian
di dalam transaksi penerimaan. Kasus terakhir menyisakan tiga keluaran yang
diterima, bukan empat, lalu menemukan kembali delapan hasil setelah pemulihan.
Pemulihan diuji dengan menyalin status terbaru target ke folder ketiga, sambil
menutup target. Snapshot lama tidak diaktifkan kembali.

Kode keluaran adalah: 0 berhasil; 2 penolakan bisnis yang diharapkan; 75 pemutusan
yang disuntikkan dan diharapkan; 1 kesalahan pembacaan atau basis data. Skenario
global secara eksplisit mengharapkan penolakan yang ditimbulkannya. Kesalahan lain
membuat pengujian gagal.

## Batasan yang harus disertakan bersama hasil

Hanya satu worker yang berpartisipasi dalam latihan ini. Kunci dan bidang penutupan
berfungsi di folder lokal yang dimanipulasi oleh program ini. Keduanya tidak mencegah
seseorang menyalin basis data atau program lain mengabaikan kunci tersebut. Ini bukan
fencing terdistribusi. Sebelum peralihan yang sesungguhnya, mesin lama harus
kehilangan haknya untuk memublikasikan melalui mekanisme independen yang telah diuji.
Jika penghentiannya tidak dikonfirmasi, otoritas kedua tidak boleh dijalankan.

Sebuah transaksi di sini menggabungkan hasil dan status dalam **basis data lokal yang sama**.
Transaksi itu tidak mencakup pengiriman ke sistem eksternal, notifikasi, atau berkas yang
sudah dikonsumsi di tempat lain. Tidak adanya penerimaan ganda yang terverifikasi terbatas
pada basis data ini dan latihan ini. SHA-256 di sini mendeteksi selisih antara bita dan
sidik jari yang diharapkan; manifes yang dapat diubah bersama datanya tidak mengautentikasi
asalnya.

Jika suatu proses dihentikan secara paksa, kunci dapat tetap ada. Verifikasi penghentian
nyatanya sebelum intervensi manual apa pun; latihan ini tidak pernah menghapus secara
otomatis kunci yang dianggap lama. Gangguan saat penyalinan membuat sumber tetap tertutup:
simpan folder dan periksa insidennya, tanpa mengaktifkan kembali dua salinan. Kehilangan
daya, sistem berkas jaringan, konkurensi antar mesin, driver GPU, checkpoint framework,
dan performa tidak dikualifikasi di sini.

## Hasil pemeriksaan kami

Pada 24 September 2026, di Windows AMD64, Python 3.14.6, dan SQLite 3.50.4:
16 pemeriksaan berhasil, 37 perintah dijalankan, 8 hasil yang diterima identik
setelah peralihan. Bukti yang dapat diperiksa adalah `preuve-execution-cpu.json`.
Sidik jari hasil kanonis adalah
`bde1bc833092cc8ca481cda5f44cfef36f14f0a94dff3f856624e169f5456660`.
Angka-angka ini menggambarkan kumpulan 48 baris ini dan bukan benchmark GPU.

Lihat [PROCEDURE.md](PROCEDURE.md) untuk tanggung jawab dan pemulihan,
[SOURCES.md](SOURCES.md) untuk sumber primer, dan [LICENSE.txt](LICENSE.txt)
untuk ketentuan penggunaan kembali.
