# Capordia — Umschalt- und Wiederaufnahmeübung, Version 1.0.0

Diese CPU-Übung vergleicht eine kontinuierliche Verarbeitung mit einer
unterbrochenen Verarbeitung, die in einen anderen Ordner kopiert und dann in
einem neuen Prozess fortgesetzt wird. Sie zeigt, welche Chargen abgeschlossen,
in Bearbeitung und wiederaufzunehmen sind. Sie misst keine GPU und belegt
keine unterbrechungsfreie Migration.

## Die Übung vorbereiten

Verwenden Sie Python 3.10 oder neuer mit den Standardmodulen `sqlite3` und
`hashlib` auf einer lokal beschreibbaren Festplatte. Es sind keine Pakete,
kein Netzwerkzugriff, kein Konto, kein Secret und keine Administratorrechte
erforderlich. Entpacken Sie alle Dateien des Ordners und öffnen Sie dann ein
Terminal in diesem Ordner. Falls das System `python3` oder `py -3` verwendet,
ersetzen Sie `python` in den Befehlen. Das Skript und der Eingabesatz bleiben
getrennt von den Arbeitsordnern, die es erstellt.

Führen Sie diese Übung nicht in einem Produktionsordner oder auf einer
Netzwerkfreigabe aus. Wählen Sie einen Namen für den Arbeitsordner, der noch
nicht existiert: Das Programm verweigert die Wiederverwendung oder das
Überschreiben eines vorhandenen Ordners.

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

Dieser Befehl erstellt `essai-capordia/rapport-verification.json` und die
Ordner der einzelnen Szenarien. Er endet nur dann mit dem Code 0, wenn alle
Prüfungen erfolgreich sind. Starten Sie ihn mit einem neuen Namen für einen
neuen Versuch erneut. Der Befehl löscht keinen vorherigen Versuch.

## Unser Beispiel: acht Chargen fiktiver Coupons

Die acht CSV-Dateien enthalten jeweils sechs originale und fiktive
Dimensionsmessungen. Jede Zeile enthält `coupon`, `cible_um` und `mesure_um`.
Die Einheiten sind ganzzahlige Mikrometer. Keine Zahl stammt von einer
Produktionsmaschine oder einem Kunden. Für jede Charge berechnet die
Verarbeitung die Anzahl der Coupons, die Summe und das Maximum der absoluten
Abweichungen sowie die Anzahl der Abweichungen kleiner oder gleich 15 µm.
Dieser Schwellenwert ist eine Übungsregel, keine empfohlene industrielle
Toleranz.

Das Ergebnis enthält die Chargennummer, die Version des Rezepts und den
SHA-256-Fingerabdruck der Eingabe. Die Verwendung von Ganzzahlen ermöglicht
hier einen exakten Vergleich. Eine GPU-Last mit Gleitkommaberechnungen
erfordert eine eigene Vergleichsregel und begründete Toleranzen.

## Die Zustände lesen

| Zustand im Register | Bedeutung in dieser Übung | Verarbeitung bei der Wiederaufnahme |
|---|---|---|
| `termine` | Ergebnis akzeptiert und Zustand in derselben Transaktion gespeichert | Prüfen; nicht neu berechnen |
| `en_cours` | Versuch angemeldet, kein Ergebnis akzeptiert | Die alte Autorität prüfen, dann die Wiederaufnahme erlauben |
| `a_reprendre` | Charge nicht begonnen oder Versuch ausdrücklich wieder in die Warteschlange gestellt | Einen Versuch ausführen |

Nach der injizierten Unterbrechung bei LOT-004: LOT-001 bis LOT-003 sind
abgeschlossen, LOT-004 ist in Bearbeitung, LOT-005 bis LOT-008 sind
wiederaufzunehmen. Kein Ergebnis von LOT-004 wird akzeptiert. Nach
`preparer-reprise` bleiben drei abgeschlossen und fünf wiederaufzunehmen. Am
Ende müssen die acht Ergebnisse mit denen der Referenz übereinstimmen. Nur
LOT-004 hat zwei Versuche.

## Die Umschaltung Schritt für Schritt wiederholen

Die folgenden Pfade sind relativ zum Ordner, der `exercice.py` enthält. Die
Unterbrechung ist eine injizierte Ausnahme nach der Berechnung und vor der
Akzeptanz; der Code 75 an dieser Stelle ist zu erwarten. Der Prozess beendet
sich und gibt seine Sperre frei. Dies ist weder ein abruptes Herunterfahren
des Rechners noch ein Stromausfall.

```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` nimmt die lokale Sperre, prüft den Satz, schließt die Quelle,
schließt die SQLite-Verbindungen und kopiert den Ordner. Die Kopie bleibt bis
zum Ende ihrer Überprüfung geschlossen; nur das Ziel darf anschließend
produzieren. Ein auf der geschlossenen Quelle gestarteter Ausführungsbefehl
gibt den Code 2 mit `SOURCE_CLOTUREE` zurück.

Der Vergleichsbefehl verlangt acht akzeptierte Ergebnisse auf jeder Seite,
prüft deren Eingaben und Ausgaben und vergleicht dann eine kanonische
JSON-Serialisierung der Ergebnisse. Die Textexporte können aus SQLite
rekonstruiert werden: Sie sind nicht die Instanz, die entscheidet, ob ein
Ergebnis akzeptiert wird.

## Die erzeugten Dateien

| Datei | Rolle |
|---|---|
| `registre.sqlite` | Referenzzustand, Versuche, Eigentümer, Abschluss und akzeptierte Ergebnisse |
| `manifeste.json` und `donnees/` | Fixiertes Eingabe-Set mit den erwarteten Fingerabdrücken |
| `etat.json` | Lesbarer Zustand und Zählung der drei Status |
| `registre-lots.csv` | Export: id, etat, tentatives, entree_sha256, sortie_sha256 |
| `resultats.json` | Export der akzeptierten Ergebnisse, in der Reihenfolge der Identifikatoren |
| `rapport-verification.json` | Im globalen Demonstrationsordner: Kontrollen, Umgebung und Befehlsausgaben |
| `worker.lock` | Temporäre Sperre unseres Programms, entfernt bei seinem normalen Beenden oder der injizierten Unterbrechung |

Die in der Ressource bereitgestellte Datei `registre-lots-vierge.csv` ist eine
umfangreichere Vorlage für Ihr Team. Sie fügt Verantwortlichen, autorisierte
Maschine, Akzeptanzkriterium und Wiederaufnahmegrund hinzu. Sie ersetzt nicht
die Datenbank der Übung und wird nicht vom Programm importiert.

## Die geprüften Fehler

Die Demonstration testet auch den Neustart einer abgeschlossenen Arbeit, die
Ablehnung einer zweiten Akzeptanz desselben Loses, eine geänderte Eingabe, einen
doppelten Identifikator im Manifest, eine verfälschte Ausgabe, eine bereits
vorhandene Sperre und eine Ausnahme innerhalb der Akzeptanztransaktion. Der
letzte Fall hinterlässt drei akzeptierte Ausgaben, nicht vier, und findet dann
nach der Wiederaufnahme die acht Ergebnisse wieder. Der Rückweg wird getestet,
indem der aktuelle Zustand des Ziels in einen dritten Ordner kopiert und das
Ziel abgeschlossen wird. Der alte Snapshot wird nicht reaktiviert.

Die Exit-Codes sind: 0 Erfolg; 2 erwartete geschäftliche Ablehnung; 75 erwartete
injizierte Unterbrechung; 1 Lese- oder Datenbankfehler. Das globale Szenario
erwartet ausdrücklich die Ablehnungen, die es hervorruft. Ein anderer Fehler
lässt den Versuch fehlschlagen.

## Grenzen, die mit den Ergebnissen zu beachten sind

Nur ein Worker nimmt an dieser Übung teil. Die Sperre und das Abschlussfeld
funktionieren in den lokalen Ordnern, die von diesem Programm bearbeitet werden.
Sie hindern eine Person nicht daran, die Datenbank zu kopieren, oder ein anderes
Programm daran, die Sperre zu ignorieren. Das ist kein verteiltes Fencing. Vor
einem echten Wechsel muss die alte Maschine ihr Recht zu veröffentlichen durch
einen unabhängigen und getesteten Mechanismus verlieren. Wenn ihr Stopp nicht
bestätigt ist, startet man keine zweite Autorität.

Eine Transaktion fasst hier Ergebnis und Status in **derselben lokalen Datenbank**
zusammen. Sie deckt keine Übermittlung an ein externes System, eine Benachrichtigung
oder eine anderswo bereits verbrauchte Datei ab. Die geprüfte Abwesenheit doppelter
Akzeptanz beschränkt sich auf diese Datenbank und diese Übung. SHA-256 erkennt hier
eine Abweichung zwischen Bytes und erwartetem Fingerabdruck; ein veränderbares
Manifest mit den Daten authentifiziert nicht deren Ursprung.

Wenn ein Prozess brutal beendet wird, kann die Sperre bestehen bleiben. Vor jedem
manuellen Eingriff den tatsächlichen Stopp überprüfen; die Übung entfernt niemals
automatisch eine als alt eingestufte Sperre. Eine Unterbrechung beim Kopieren
hinterlässt die Quelle abgeschlossen: die Ordner aufbewahren und den Vorfall
untersuchen, ohne zwei Kopien wieder in Betrieb zu nehmen. Der Stromausfall,
Netzwerkdateisysteme, die Konkurrenz zwischen Maschinen, die GPU-Treiber, die
Checkpoints der Frameworks und die Leistung werden hier nicht qualifiziert.

## Ergebnis unserer Kontrolle

Am 24. September 2026, unter Windows AMD64, Python 3.14.6 und SQLite 3.50.4:
16 bestandene Kontrollen, 37 ausgeführte Befehle, 8 identische akzeptierte
Ergebnisse nach dem Wechsel. Der einsehbare Nachweis ist `preuve-execution-cpu.json`.
Der Fingerabdruck der kanonischen Ergebnisse ist
`bde1bc833092cc8ca481cda5f44cfef36f14f0a94dff3f856624e169f5456660`.
Diese Zahlen beschreiben dieses Set von 48 Zeilen und sind kein GPU-Benchmark.

Siehe [PROCEDURE.md](PROCEDURE.md) für die Verantwortlichkeiten und den Rückweg,
[SOURCES.md](SOURCES.md) für die Primärquellen und [LICENSE.txt](LICENSE.txt)
für die Bedingungen der Wiederverwendung.
