# Capordia — oefening voor omschakeling en hervatting, versie 1.0.0

Deze CPU-oefening vergelijkt een continue verwerking met een onderbroken
verwerking, gekopieerd naar een andere map en hervat in een nieuw proces. Zo
kun je zien welke batches voltooid, bezig en te hervatten zijn. Er wordt geen
enkele GPU gemeten en er wordt geen onderbrekingsvrije migratie aangetoond.

## De oefening voorbereiden

Gebruik Python 3.10 of nieuwer met de standaardmodules `sqlite3` en
`hashlib`, op een lokaal beschrijfbare schijf. Er is geen pakket, netwerktoegang,
account, geheim of beheerder nodig. Pak alle bestanden uit de map uit en open
een terminal in die map. Als het systeem `python3` of `py -3` gebruikt,
vervang dan `python` in de opdrachten. Het script en de invoerset blijven
gescheiden van de werkmapen die het aanmaakt.

Voer deze oefening niet uit in een productiemap of op een netwerkshare. Kies
een naam voor de werkmap die nog niet bestaat: het programma weigert een
bestaande map te hergebruiken of te overschrijven.

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

Deze opdracht maakt `essai-capordia/rapport-verification.json` en de mappen
van elk scenario aan. Ze eindigt met code 0 alleen als alle controles slagen.
Start opnieuw met een nieuwe naam voor een nieuwe poging. De opdracht wist
geen enkele eerdere poging.

## Ons voorbeeld: acht batches fictieve coupons

De acht CSV's bevatten elk zes originele en fictieve dimensionale metingen.
Elke regel bevat `coupon`, `cible_um` en `mesure_um`. De eenheden zijn gehele
micrometers. Geen enkel cijfer komt van een productiemachine of een klant.
Voor elke batch berekent de verwerking het aantal coupons, de som en het
maximum van de absolute afwijkingen, en het aantal afwijkingen kleiner dan of
gelijk aan 15 µm. Deze drempel is een oefenregel, geen aanbevolen industriële
tolerantie.

Het resultaat bevat het batchnummer, de versie van het recept en de
SHA-256-vingerafdruk van de invoer. Het gebruik van gehele getallen maakt hier
een exacte vergelijking mogelijk. Een GPU-belasting met drijvende-kommagetallen
zou een eigen vergelijkingsregel en onderbouwde toleranties vereisen.

## De statussen lezen

| Status in het register | Betekenis in deze oefening | Verwerking bij hervatting |
|---|---|---|
| `termine` | Resultaat geaccepteerd en status opgeslagen in dezelfde transactie | Verifiëren; niet herberekenen |
| `en_cours` | Poging gedeclareerd, geen resultaat geaccepteerd | De oude autoriteit onderzoeken en dan de hervatting toestaan |
| `a_reprendre` | Batch niet begonnen of poging expliciet opnieuw in de wachtrij geplaatst | Een poging uitvoeren |

Na de geïnjecteerde onderbreking op LOT-004: LOT-001 tot LOT-003 zijn
voltooid, LOT-004 is bezig, LOT-005 tot LOT-008 zijn te hervatten. Geen enkel
resultaat van LOT-004 is geaccepteerd. Na `preparer-reprise` blijven er drie
voltooid en vijf te hervatten. Aan het einde moeten de acht resultaten gelijk
zijn aan die van de referentie. Alleen LOT-004 heeft twee pogingen.

## De omschakeling stap voor stap opnieuw doen

De volgende paden zijn relatief ten opzichte van de map die `exercice.py`
bevat. De onderbreking is een uitzondering die wordt geïnjecteerd na de
berekening en vóór de acceptatie; code 75 in deze stap is verwacht. Het proces
stopt en geeft zijn vergrendeling vrij. Dit is geen abrupte stop van de
computer en geen stroomstoring.

```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` neemt de lokale vergrendeling, controleert de set, sluit de bron
af, sluit de SQLite-verbindingen en kopieert de map. De kopie blijft afgesloten
tot het einde van de verificatie; daarna mag alleen de doelmap nog produceren.
Een uitvoeringsopdracht op de afgesloten bron retourneert code 2 met
`SOURCE_CLOTUREE`.

De vergelijkingsopdracht vereist acht geaccepteerde resultaten aan elke kant,
controleert hun invoer en uitvoer, en vergelijkt vervolgens een canonieke
JSON-serialisatie van de resultaten. De tekstexports kunnen opnieuw worden
opgebouwd uit SQLite: zij zijn niet de autoriteit die bepaalt of een resultaat
geaccepteerd is.

## De geproduceerde bestanden

| Bestand | Rol |
|---|---|
| `registre.sqlite` | Referentiestatus, pogingen, eigenaar, afsluiting en geaccepteerde resultaten |
| `manifeste.json` en `donnees/` | Vastgelegde set invoer met de verwachte vingerafdrukken |
| `etat.json` | Leesbare status en telling van de drie statussen |
| `registre-lots.csv` | Export: id, etat, tentatives, entree_sha256, sortie_sha256 |
| `resultats.json` | Export van de geaccepteerde resultaten, in volgorde van de identifiers |
| `rapport-verification.json` | In de algemene demonstratiemap: controles, omgeving en uitvoer van de opdrachten |
| `worker.lock` | Tijdelijk slot van ons programma, verwijderd bij normale afsluiting of bij de geïnjecteerde onderbreking |

Het bestand `registre-lots-vierge.csv` in de bron is een ruimer model
voor jullie team. Het voegt verantwoordelijke, toegestane machine,
acceptatiecriterium en reden voor hervatting toe. Het vervangt niet de database
van de oefening en wordt niet door het programma geïmporteerd.

## De gecontroleerde fouten

De demonstratie test ook het opnieuw starten van een afgeronde taak, het weigeren van een
tweede acceptatie van dezelfde batch, een gewijzigde invoer, een dubbele identifier
in het manifest, een aangetaste uitvoer, een slot dat al aanwezig is en een uitzondering
binnen de transactie van acceptatie. Dat laatste geval laat drie
geaccepteerde uitvoeren achter, niet vier, en vindt daarna de acht resultaten terug na hervatting.
De terugkeer wordt getest door de recente status van het doel naar een derde
map te kopiëren en het doel af te sluiten. De oude momentopname wordt niet opnieuw geactiveerd.

De exitcodes zijn: 0 geslaagd; 2 verwachte zakelijke weigering; 75 verwachte
geïnjecteerde onderbreking; 1 lees- of databasefout. Het algemene scenario verwacht
expliciet de weigeringen die het veroorzaakt. Een andere fout laat de test mislukken.

## Beperkingen om bij de resultaten te houden

Slechts één worker neemt deel aan deze oefening. Het slot en het veld voor afsluiting
werken in de lokale mappen die door dit programma worden beheerd. Ze
voorkomen niet dat iemand de database kopieert of dat een ander programma
het slot negeert. Dit is geen gedistribueerde fencing. Vóór een echte
omschakeling moet de oude machine haar recht om te publiceren verliezen via een
onafhankelijk en getest mechanisme. Als haar stop niet is bevestigd, start men geen
tweede autoriteit.

Een transactie groepeert hier resultaat en status in **dezelfde lokale database**.
Ze dekt geen verzending naar een extern systeem, een melding of een
bestand dat elders al is gebruikt. Het ontbreken van geverifieerde dubbele acceptatie beperkt zich tot deze database en deze oefening. SHA-256 detecteert hier een verschil tussen
bytes en verwachte vingerafdruk; een wijzigbaar manifest met de gegevens
authenticeert hun oorsprong niet.

Als een proces ruw wordt beëindigd, kan het slot aanwezig blijven. Controleer
of het echt is gestopt voordat je handmatig ingrijpt; de oefening verwijdert
nooit automatisch een slot dat als oud wordt beschouwd. Een onderbroken kopie
laat de bron afgesloten achter: bewaar de mappen en onderzoek het incident,
zonder twee kopieën weer actief te maken. Stroomuitval, netwerkbestandssystemen, gelijktijdigheid tussen machines, GPU-stuurprogramma's,
checkpoints van frameworks en prestaties worden hier niet gekwalificeerd.

## Resultaat van onze controle

Op 24 september 2026, onder Windows AMD64, Python 3.14.6 en SQLite 3.50.4:
16 geslaagde controles, 37 uitgevoerde opdrachten, 8 geaccepteerde resultaten die identiek zijn
na de omschakeling. Het raadpleegbare bewijs is `preuve-execution-cpu.json`.
De vingerafdruk van de canonieke resultaten is
`bde1bc833092cc8ca481cda5f44cfef36f14f0a94dff3f856624e169f5456660`.
Deze cijfers beschrijven deze set van 48 regels en zijn geen GPU-benchmark.

Zie [PROCEDURE.md](PROCEDURE.md) voor de verantwoordelijkheden en de terugkeer,
[SOURCES.md](SOURCES.md) voor de primaire bronnen, en [LICENSE.txt](LICENSE.txt)
voor de voorwaarden voor hergebruik.
