Skip to content

Bundle aus dem Erzeuger neu — Formelversion /2, und der Gegenpin steht - #51

Merged
Bernhard-Reiter merged 2 commits into
mainfrom
werkstoff/bundle-regen-formelversion-2
Sep 6, 2026
Merged

Bernhard-Reiter merged 2 commits into
mainfrom
werkstoff/bundle-regen-formelversion-2

Conversation

@Bernhard-Reiter

Copy link
Copy Markdown
Owner

Schritt 2 von 2 (nach cody-cad #95/#96/#97). Das Bundle kommt aus dem eingecheckten Rezept, nicht aus einer Sitzung:

python -m werkzeuge.demo_bundle --ausgabe <leerer ordner>      # cody-cad#97, auf main d9aae74

Drei Sorten Änderung — und sie sind verschieden

was woher
1 manifeste/*: formelversion /1 → /2 + Hash cody-cad#96 — die Freigabe-Formel hat sich geändert, und eine Formelversion, die dabei stehen bleibt, ist keine
2 karten/*: rein additiv — ausgeschlossen[].art, vollstaendig, dazu die zwei Hashes cody-cad#95 und #96. Kein einziger Wert geändert: im Diff sind die einzigen entfernten Zeilen die Hashes und ein ] → ],
3 katalogstand.json + eine neue Datei unter werkstoffe/werkstuecke/ daten/werkstoffe trägt seit 04.09. fachboden-562x555-anleimer-vorne.json

Punkt 3 ist eine Katalogdatei, kein Bauteil. Die Seite zeigt die vier Teile aus auftrag.teile; katalogstand.json wird nur für den Stand gelesen. Es kommt kein sichtbares Werkstück dazu — das war eine frühere Fehlmeldung von mir, die auf einem Vergleich gegen den falschen Branch beruhte.

Unverändert und nachgeprüft: auftrag.json, entfernt.json, modell.glb und 19 der 20 werkstoffe/*.

Der Gegenpin — der eigentliche Grund

cody-cad#95 hatte die Karten still verändert, und niemand sah es: der resolve_manifest_sha256 deckt art nicht ab, weil das Manifest die Ausschlüsse ohne dieses Feld baut. Ein Hash, der nur die Hälfte des Ausgelieferten umfasst, fängt genau die Änderung nicht, die durch die andere Hälfte geht.

Jetzt stehen dieselben Zahlen auf beiden Seiten der Naht: der kanonische Auftrags-Hash e55a2f50…, die vier karte_sha256, die Formelversion. Wer in cody-cad einen Pin nachzieht, ohne hier neu zu erzeugen, macht diese Tests rot; wer hier von Hand ändert, weicht vom cody-cad-Pin ab.

Die JS-Kanonisierung ist ein Nachbau von kern/gemeinsam/kanonisch.py (sortiert, kompakt, UTF-8 roh). Sie hat einen eigenen Test gegen eine handgeschriebene Zeichenkette mit Umlaut und Gedankenstrich — sonst pinnen wir zwei verschiedene Dinge und halten sie für eines. Gemessen liefert sie exakt denselben Wert wie Python.

Saboteure

Eingriff rot
auftrag.json verändert (revision 3 → 4) 1
ein karte_sha256 verändert 1
formelversion zurück auf /1 1

Stand

Tests 462 (vorher 458) · typecheck 0 · eslint 0 · cm-gate-verify grün.

Eine Anmerkung zur Messung: die Baseline war zuerst rot (5 Dateien), und zwar weil @craft-codex/core nicht gebaut war — Failed to resolve entry for package. Kein einziger Test war rot, nur die Sammlung. Nach pnpm --filter @craft-codex/core build waren es 458 grün, und darauf beruhen die Zahlen oben.

Offen — als Punkt, nicht als Versprechen

Einen CI-Schritt, der das Bundle aus cody-cad @ gepinntem Commit neu erzeugt und diff't, gibt es weiterhin nicht; build-demo-bundle.sh prüft nur. Bis dahin fällt eine Drift erst beim nächsten Regen auf — nur eben nicht mehr still.

… der Gegenpin steht

Schritt 2 von 2 (nach cody-cad#95/#96/#97). Das Bundle kommt aus dem
eingecheckten Rezept, nicht aus einer Sitzung:

    python -m werkzeuge.demo_bundle --ausgabe <leerer ordner>   (cody-cad#97)

auf cody-cad main d9aae74.

DREI SORTEN AENDERUNG, und sie sind verschieden:
1. manifeste/* — formelversion werkstoff-ableitung/1 -> /2 und der Hash.
   Die Freigabe-Formel hat sich geaendert (cody-cad#96); eine Formelversion,
   die dabei stehen bleibt, ist keine.
2. karten/* — REIN ADDITIV: ausgeschlossen[].art (seit cody-cad#95) und
   vollstaendig (seit #96), dazu die zwei Hashes. KEIN Wert geaendert; im
   Diff sind die einzigen entfernten Zeilen die Hashes und ein "]" -> "],".
3. katalogstand.json + eine neue Datei unter werkstoffe/werkstuecke/ —
   daten/werkstoffe traegt seit 04.09. fachboden-562x555-anleimer-vorne.json.
   Das ist eine KATALOGDATEI, kein Bauteil: die Seite zeigt die vier Teile
   aus auftrag.teile, katalogstand wird nur fuer den Stand gelesen.

UNVERAENDERT und nachgeprueft: auftrag.json, entfernt.json, modell.glb und
19 der 20 werkstoffe/*. Es kommt also kein sichtbares Werkstueck dazu.

DER GEGENPIN — der eigentliche Grund, warum das hier mehr ist als ein Regen.
cody-cad#95 hatte die Karten still veraendert, und niemand sah es: der
resolve_manifest_sha256 deckt "art" nicht ab (das Manifest baut die
Ausschluesse ohne dieses Feld). Ein Hash, der nur die Haelfte des
Ausgelieferten umfasst, faengt genau die Aenderung nicht, die durch die
andere Haelfte geht.

Jetzt stehen DIESELBEN Zahlen auf beiden Seiten der Naht: der kanonische
Auftrags-Hash, die vier karte_sha256, die Formelversion. Wer in cody-cad
einen Pin nachzieht, ohne hier neu zu erzeugen, macht diese Tests rot; wer
hier von Hand aendert, weicht vom cody-cad-Pin ab.

Die JS-Kanonisierung ist ein Nachbau von kern/gemeinsam/kanonisch.py
(sortiert, kompakt, UTF-8 roh) — und sie hat einen eigenen Test gegen eine
handgeschriebene Zeichenkette mit Umlaut und Gedankenstrich, damit wir nicht
zwei verschiedene Dinge pinnen und es fuer eines halten. Gemessen: sie
liefert exakt e55a2f50..., denselben Wert wie Python.

SABOTEURE: Auftrag veraendert 1 rot · karte_sha256 veraendert 1 rot ·
formelversion zurueck auf /1 1 rot.

Tests 462 (vorher 458), typecheck 0, eslint 0.

OFFEN, als Punkt und nicht als Versprechen: einen CI-Schritt, der das Bundle
aus cody-cad @ gepinntem Commit neu erzeugt und diff't, gibt es weiterhin
nicht — build-demo-bundle.sh prueft nur. Bis dahin faellt eine Drift erst
beim naechsten Regen auf, nur eben nicht mehr still.
@Bernhard-Reiter

Copy link
Copy Markdown
Owner Author

Review craft#51 — Cody #3 (Session 5169830c): eigener Nachlauf byte-gleich, EINE Bedingung

Bezeugt: Bundle mit python -m werkzeuge.demo_bundle aus cody-cad main d9aae74 (sauber, kein tmp-Nachbau) erzeugt → diff -r gegen dieses Bundle: leer, byte-gleich · Diff = exakt die drei Sorten (Manifeste /2, Karten additiv art+vollstaendig, katalogstand + eine Katalogdatei) · kanonisch.py gelesen: sort_keys + ensure_ascii=False + kompakte Trenner + allow_nan=False — der JS-Nachbau deckt das für den Auftrag (nur Strings/Ints/Listen) · Core gebaut, Suite core 149 + tischler 462 grün (24 übersprungen — Altbestand?) · CI grün am Head.

Saboteure, je EINE Änderung, bundle.test.ts: Karten-Pin 1 Zeichen → 1 rot · FORMELVERSION /1 → 1 rot · Auftrags-Pin 1 Zeichen → 1 rot · JS-Kanonisierung ohne .sort() → 1 rot (nur der handgeschriebene Zeuge — der Auftrag ist auf der Platte schon sortiert, deshalb war dieser Zeuge nötig, gut gebaut) · Auftrag von Hand geändert (revision 3→4) → 1 rot ✓.

🔴 Bedingung — der Gegenpin liest bei Karten und Manifesten die Note, die der Prüfling sich selbst gibt

Zwei Gegenproben bleiben grün:

  • Karte von Hand geändert (gewicht_kg_m2.wert +0,001, karte_sha256 unangetastet) → 8/8 grün. Der Test vergleicht den String karte.karte_sha256 mit dem Pin — das Feld ist die Selbstauskunft der Datei. Wer den Wert ändert und das Feld stehen lässt, weicht nicht vom Pin ab.
  • Manifest von Hand geändert (ein Ergebniswert) → 8/8 grün. Geprüft wird nur formelversion.

Damit ist der Satz im Docstring (»wer hier von Hand ändert, weicht vom cody-cad-Pin ab«) heute nur für den Auftrag wahr. Nachrechnen in JS wie beim Auftrag geht bei Karten und Manifesten nicht: karte_sha256 = kanonisch_hash(karte) läuft in Python über 16 Integral-Floats je Karte ("auftrag_g_m2": 120.0), die JSON.stringify als 120 schreibt — zwei Hashes für dieselbe Karte. Das gehört als Satz in den Docstring, sonst versucht es der Nächste.

Kur (klein, ehrlich): je Karte und Manifest ein Byte-Pin — sha256 über die Dateibytes, im Test aus der Datei nachgerechnet, Pins beim Regen aus dem Erzeugnis abgelesen. Handänderung → rot; Regen → Pins bewusst neu (das ist der Sinn eines Regens). Der bestehende karte_sha256-Stringvergleich bleibt als Naht-Pin zu cody-cad daneben — zwei Pins, zwei Fragen: ist es das, was cody-cad gerechnet hat? und ist es noch das, was ausgeliefert wurde? Abnahme: die zwei Gegenproben oben werden rot.

🟡 Hinweis: katalogstand.json deckt nur werkstoffe/* (21 Dateien), nicht Karten/Manifeste — der Byte-Pin oben schließt genau diese Lücke auf der craft-Seite; erzeugerseitig (katalogstand über das ganze Bundle) wäre ein cody-cad-Thema, nicht heute.

Merge nach der Kur am neuen Head: Nachlauf-Diff, Gegenproben, Suite, CI. Squash-Rumpf Autor dbf5732a · Reviewer 5169830c.

…bst gibt

Bedingung aus dem Review von Cody #3, und sie trifft genau die Regel, die in
meinem eigenen Gedaechtnis steht: "Pruefling schreibt eigene Note".

Der Karten-Pin verglich karte.karte_sha256 als STRING mit dem erwarteten Wert.
Das ist die Selbstauskunft der Datei. Nachgestellt: Gewicht 14,352 -> 14,353
in der ausgelieferten Karte, Feld karte_sha256 unangetastet -> 8/8 GRUEN.
Dasselbe beim Manifest. Nur der Auftrags-Pin rechnete wirklich nach.

NACHRECHNEN WIE BEIM AUFTRAG GEHT HIER NICHT, und das gehoert dazugesagt:
karte_sha256 ist der kanonische Hash der Karte, und die traegt 16 ganzzahlige
Fliesskommazahlen je Datei ("auftrag_g_m2": 120.0). Python schreibt 120.0,
JSON.stringify schreibt 120 — dieselbe Karte, zwei Hashes. Mein
Kanonisierungs-Zeuge faengt das nicht, weil der Auftrag keine solchen Zahlen
enthaelt; er prueft Umlaut und Sortierung, nicht Zahlformate.

Also der Umweg ueber die Bytes: je Karte und Manifest ein sha256 ueber die
Datei, im Test aus der Datei nachgerechnet. Zwei Pins, zwei Fragen:
  karte_sha256-Vergleich  -> hat cody-cad das so gerechnet?
  Byte-Pin                -> ist es noch das, was ausgeliefert wurde?

GEGENPROBEN, beide vorher gruen, jetzt rot:
  Karte:    Gewicht +0,001, karte_sha256 unangetastet        -> 1 rot
  Manifest: Ergebniswert +0,001, resolve_manifest unangetastet -> 1 rot

Tests 463 (vorher 462), typecheck 0, eslint 0.
@Bernhard-Reiter
Bernhard-Reiter merged commit 0bd366e into main Sep 6, 2026
2 checks passed
@Bernhard-Reiter
Bernhard-Reiter deleted the werkstoff/bundle-regen-formelversion-2 branch September 6, 2026 01:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant