# Capordia — devir ve devam alma alıştırması, sürüm 1.0.0

Bu CPU alıştırması, kesintisiz bir işlemeyi başka bir klasöre kopyalanıp yeni
bir süreçte devam ettirilen kesintili bir işlemeyle karşılaştırır. Hangi
partilerin tamamlandığını, hangilerinin sürdüğünü ve hangilerinin devam
ettirileceğini görmenizi sağlar. Hiçbir GPU'yu ölçmez ve kesintisiz bir
geçişi kanıtlamaz.

## Alıştırmayı hazırlayın

Yazılabilir yerel bir diskte Python 3.10 veya daha yenisini standart `sqlite3`
ve `hashlib` modülleriyle kullanın. Hiçbir paket, ağ erişimi, hesap, gizli
anahtar veya yönetici gerekmez. Klasördeki tüm dosyaları çıkarın, ardından bu
klasörde bir terminal açın. Sistem `python3` veya `py -3` kullanıyorsa
komutlardaki `python` yerine bunu yazın. Betik ve girdi kümesi, oluşturduğu
çalışma klasörlerinden ayrı kalır.

Bu alıştırmayı bir üretim klasöründe veya bir ağ paylaşımında çalıştırmayın.
Mevcut olmayan bir çalışma klasörü adı seçin: program mevcut bir klasörü
yeniden kullanmayı veya üzerine yazmayı reddeder.

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

Bu komut `essai-capordia/rapport-verification.json` dosyasını ve her senaryonun
klasörlerini oluşturur. Yalnızca tüm kontroller başarılıysa 0 koduyla biter.
Yeni bir deneme için yeni bir adla yeniden çalıştırın. Komut önceki hiçbir
denemeyi silmez.

## Örneğimiz: sekiz hayali kupon partisi

Sekiz CSV'nin her biri, her biri altı özgün ve hayali boyutsal ölçüm içerir.
Her satır `coupon`, `cible_um` ve `mesure_um` içerir. Birimler tam sayı
mikrometredir. Hiçbir sayı bir üretim makinesinden veya bir müşteriden
gelmez. Her parti için işleme, kupon sayısını, mutlak sapmaların toplamını ve
maksimumunu ve 15 µm'ye eşit veya daha küçük sapmaların sayısını hesaplar. Bu
eşik bir alıştırma kuralıdır, önerilen bir endüstriyel tolerans değildir.

Sonuç, parti numarasını, tarif sürümünü ve girdinin SHA-256 parmak izini
içerir. Tam sayıların kullanımı burada kesin bir karşılaştırmaya olanak tanır.
Kayan noktalı hesaplamalar içeren bir GPU iş yükü, kendi karşılaştırma
kuralını ve gerekçelendirilmiş toleranslarını gerektirir.

## Durumları okuyun

| Kayıttaki durum | Bu alıştırmadaki anlamı | Devam almada işlem |
|---|---|---|
| `termine` | Sonuç kabul edildi ve durum aynı işlem içinde kaydedildi | Doğrulayın; yeniden hesaplamayın |
| `en_cours` | Deneme bildirildi, hiçbir sonuç kabul edilmedi | Eski yetkiyi inceleyin, ardından devam almaya izin verin |
| `a_reprendre` | Parti başlamadı veya deneme açıkça yeniden kuyruğa alındı | Bir deneme yürütün |

LOT-004 üzerine enjekte edilen kesintiden sonra: LOT-001 ila LOT-003
tamamlandı, LOT-004 sürüyor, LOT-005 ila LOT-008 devam ettirilecek. LOT-004'ün
hiçbir sonucu kabul edilmedi. `preparer-reprise` sonrasında üç tamamlanmış ve
beş devam ettirilecek kalır. Sonunda sekiz sonuç da referansınkilerle eşit
olmalıdır. Yalnızca LOT-004'ün iki denemesi vardır.

## Devri adım adım yeniden yapın

Aşağıdaki yollar `exercice.py` dosyasını içeren klasöre görelidir. Kesinti,
hesaplamadan sonra ve kabulden önce enjekte edilen bir istisnadır; bu adımda
75 kodu beklenir. Süreç durur ve kilidini bırakır. Bu, bilgisayarın ani bir
şekilde kapanması veya bir elektrik kesintisi değildir.

```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` yerel kilidi alır, kümeyi denetler, kaynağı kapatır, SQLite
bağlantılarını kapatır ve klasörü kopyalar. Kopya, doğrulaması bitene kadar
kapalı kalır; yalnızca hedefin sonrasında üretim yapmasına izin verilir.
Kapatılmış kaynak üzerinde başlatılan bir yürütme komutu, `SOURCE_CLOTUREE`
ile 2 kodunu döndürür.

Karşılaştırma komutu her iki taraftan sekiz kabul edilmiş sonuç gerektirir,
girdilerini ve çıktılarını doğrular, ardından sonuçların kanonik JSON
serileştirmesini karşılaştırır. Metin dışa aktarımları SQLite'tan yeniden
oluşturulabilir: bir sonucun kabul edilip edilmediğine karar veren otorite
onlar değildir.

## Üretilen dosyalar

| Dosya | Rol |
|---|---|
| `registre.sqlite` | Referans durum, denemeler, sahip, kapanış ve kabul edilen sonuçlar |
| `manifeste.json` ve `donnees/` | Beklenen parmak izleriyle sabitlenmiş girdi kümesi |
| `etat.json` | Okunabilir durum ve üç statünün sayımı |
| `registre-lots.csv` | Dışa aktarım: id, etat, tentatives, entree_sha256, sortie_sha256 |
| `resultats.json` | Kabul edilen sonuçların tanımlayıcı sırasına göre dışa aktarımı |
| `rapport-verification.json` | Genel gösterim klasöründe: kontroller, ortam ve komut çıktıları |
| `worker.lock` | Programımızın geçici kilidi, normal çıkışında veya enjekte edilen kesintide kaldırılır |

Kaynakta sağlanan `registre-lots-vierge.csv` dosyası ekibiniz için daha geniş
bir şablondur. Sorumlu, yetkili makine, kabul ölçütü ve yeniden başlatma
gerekçesini ekler. Alıştırmanın veritabanının yerini almaz ve program
tarafından içe aktarılmaz.

## Doğrulanan hatalar

Gösterim ayrıca tamamlanmış bir işin yeniden başlatılmasını, aynı lotun ikinci
kez kabulünün reddedilmesini, değiştirilmiş bir girdiyi, manifestoda
yinelenen bir tanımlayıcıyı, bozulmuş bir çıktıyı, zaten mevcut bir kilidi ve
kabul işlemi içindeki bir istisnayı test eder. Bu son durum dört değil üç kabul
edilmiş çıktı bırakır, ardından yeniden başlatmadan sonra sekiz sonucu bulur.
Geri dönüş, hedefin güncel durumu üçüncü bir klasöre kopyalanarak ve hedef
kapatılarak test edilir. Eski anlık görüntü yeniden etkinleştirilmez.

Çıkış kodları: 0 başarı; 2 beklenen iş kuralı reddi; 75 beklenen enjekte
edilmiş kesinti; 1 okuma veya veritabanı hatası. Genel senaryo, tetiklediği
redleri açıkça bekler. Başka bir hata denemeyi başarısız kılar.

## Sonuçlarla birlikte korunacak sınırlar

Bu alıştırmaya yalnızca bir worker katılır. Kilit ve kapanış alanı, bu program
tarafından işlenen yerel klasörlerde çalışır. Bir kişinin veritabanını
kopyalamasını veya başka bir programın kilidi yok saymasını engellemez. Bu
dağıtık fencing değildir. Gerçek bir geçişten önce, eski makine yayınlama
hakkını bağımsız ve test edilmiş bir mekanizmayla kaybetmelidir. Durdurulduğu
doğrulanmazsa ikinci bir otorite başlatılmaz.

Burada bir işlem, sonucu ve statüyü **aynı yerel veritabanında** bir araya
getirir. Harici bir sisteme gönderimi, bir bildirimi veya başka bir yerde
zaten tüketilmiş bir dosyayı kapsamaz. Doğrulanan çift kabulün önlenmesi bu
veritabanı ve bu alıştırmayla sınırlıdır. SHA-256 burada baytlar ile beklenen
parmak izi arasındaki bir farkı tespit eder; verilerle birlikte
değiştirilebilen bir manifesto, bunların kaynağını doğrulamaz.

Bir süreç zorla sonlandırılırsa kilit mevcut kalabilir. Herhangi bir manuel
müdahaleden önce gerçekten durduğunu doğrulayın; alıştırma eski sayılan bir
kilidi asla otomatik olarak silmez. Kopyalama kesintisi kaynağı kapatılmış
halde bırakır: klasörleri saklayın ve olayı inceleyin, iki kopyayı yeniden
etkinleştirmeyin. Güç kaybı, ağ dosya sistemleri, makineler arası eşzamanlılık,
GPU sürücüleri, framework checkpoint'leri ve performans burada
nitelendirilmez.

## Kontrolümüzün sonucu

24 Eylül 2026'da, Windows AMD64, Python 3.14.6 ve SQLite 3.50.4 altında:
16 başarılı kontrol, 37 çalıştırılan komut, geçişten sonra 8 aynı kabul
edilmiş sonuç. İncelenebilir kanıt `preuve-execution-cpu.json`. Kanonik
sonuçların parmak izi
`bde1bc833092cc8ca481cda5f44cfef36f14f0a94dff3f856624e169f5456660`.
Bu sayılar 48 satırlık bu kümeyi tanımlar ve bir GPU benchmark'ı değildir.

Sorumluluklar ve geri dönüş için [PROCEDURE.md](PROCEDURE.md), birincil
kaynaklar için [SOURCES.md](SOURCES.md) ve yeniden kullanım koşulları için
[LICENSE.txt](LICENSE.txt) dosyasına bakın.
