Skip to content

Das ausgelieferte Bundle rechnete noch mit werkstoff-ableitung/2 — und verschwieg den Belagleim - #52

Merged
Bernhard-Reiter merged 1 commit into
mainfrom
fix/werkstoff-bundle-formelversion
Sep 11, 2026
Merged

Bernhard-Reiter merged 1 commit into
mainfrom
fix/werkstoff-bundle-formelversion

Conversation

@Bernhard-Reiter

Copy link
Copy Markdown
Owner

Nachzug zu cody-cad#164. Dort ist FORMELVERSION von werkstoff-ableitung/2 auf /3
gestiegen, weil die Ableitung bei gleichen Eingaben andere Ergebnisse liefert. Das Bundle unter
apps/tischler/public/werkstoff-bundle/ trug noch /2 — es ist das Erzeugnis, das der Tischler
auf der Baustelle offline liest.

Was sich bewegt hat — und was nicht

Die Zahl nicht, die Lücke schon. Je Karte und je Manifest kommen zwei Ausschlüsse dazu:

{ "art": "fehlt", "rolle": "leim/oben",
  "komponente": "ponal-flaechenleim-pvac", "revision": 1,
  "grund": "Trockenmasse des Belagleims nicht hinterlegt — nicht addiert" }

Das Gewicht steht weiterhin auf 14.352 kg/m2 und vollstaendig: false. Der Unterschied:
bisher war der Leim stillschweigend nicht addiert und tauchte nirgends auf. Jetzt steht er
als benannte Lücke da — genau das, wofür Ausschluss da ist.

Mitgezogen: 4× resolve_manifest_sha256, 4× karte_sha256.
Unverändert: auftrag.json, katalogstand.json, entfernt.json, modell.glb.

Warum die anderen beiden Teile von #164 hier nichts bewegen

Kein Versehen, sondern gemessen:

  • „Geschätzte Mengen ergeben keinen Festpreis" greift nicht, weil das Bundle überhaupt keinen Preis exportiert — 0 Treffer für preis in karten/, manifeste/, auftrag.json.
  • „Belag ohne Klebstoff" greift nicht, weil die Beläge ihren Klebstoff referenzieren. Genau deshalb nennt der neue Ausschluss ponal-flaechenleim-pvac beim Namen statt des Belags.

Der Gegenpin hat gebissen

bundle.test.ts pinnt Auftrags-Hash, 4× karte_sha256, 8× Byte-Pins und die Formelversion.
Alte Pins gegen das neue Bundle, gemessen:

Tests  3 failed | 6 passed (9)
FAIL  die Manifeste sind mit der Formelversion gerechnet, die dieses Bundle behauptet

Karten-Pins, Byte-Pins und FORMELVERSION sind nachgezogen. AUFTRAG_PIN ist unangetastet —
dass er unter den sechs Grünen blieb, ist der Beleg, dass der Auftrag sich wirklich nicht bewegt hat.

Gemessen

Lauf Ergebnis
pnpm test (Monorepo) core 149 passed, tischler 463 passed, 24 skipped, rc 0
bundle.test allein 9 passed
Rot-Probe (alte Pins, neues Bundle) 3 failed, 6 passed
pnpm typecheck · pnpm lint Done · ✔ No ESLint warnings or errors
Erzeuger cody-cad rc 0, projektion.json sha256 f652b163…
cody-cad-Gegenseite test_demo_bundle_rezept.py + test_vollstaendigkeit_ableitungen.py = 27 passed

Zweiter Prüfstand, den vitest nicht leisten kann: die vier karte_sha256 mit cody-cads
kanonisch_hash über die ausgelieferten Bytes nachgerechnet — 4/4. Vitest kommt an diese Frage
nur über die Bytes heran, weil Python 120.0 schreibt, wo JSON.stringify 120 schreibt.

Zwei Hinweise

  1. pnpm test braucht packages/core/dist. Ohne vorherigen Build scheitern 5 Testdateien schon beim Import („Failed to resolve entry for package @craft-codex/core"). Zustand des frischen Worktrees, nicht Folge dieser Änderung — aber relevant, falls die CI test ohne build fährt.
  2. Fund, nicht geändert: Der Kommentarblock über KARTEN_PINS behauptet, die vier karte_sha256 stünden so in cody-cads tests/test_vollstaendigkeit_ableitungen.py. Dort sind REFERENZ_KARTEN aber nach boden-562x555 usw. geschlüsselt, nicht nach den teil_beispiel*-IDs — cody-cad pinnt vom Demo-Bundle nur den Auftrags-Hash. Der Kommentar verspricht eine Kopplung, die es nicht gibt.

🤖 Generated with Claude Code

…verschwieg den Belagleim

cody-cad#164 hat FORMELVERSION auf "werkstoff-ableitung/3" gehoben, weil die Ableitung bei
gleichen Eingaben andere Ergebnisse liefert. Das Bundle unter public/werkstoff-bundle/ trug
noch /2 (gemessen: 4 Vorkommen, je eines in den vier Manifesten; jetzt 4x /3).

Neu erzeugt mit dem Rezept, nicht von Hand:
    cd cody-cad (origin/main 5974b3d)
    .venv/bin/python -m werkzeuge.demo_bundle --ausgabe <leerer ordner>
    -> rc 0, projektion.json sha256 f652b163a6ccdfc5c337fd220cae47a5663aa26099cef207eff5d2cd0f4d6ba5
Der Unterordner bundle/ ersetzt public/werkstoff-bundle/. Die Dateiliste ist identisch.

Was sich ausser der Versionsnummer bewegt hat (inhaltlich, nicht kosmetisch):

- Jede der vier Karten und jedes der vier Manifeste tragen zwei zusaetzliche FEHLT-Ausschluesse
  im Gewicht: leim/oben und leim/unten, Komponente ponal-flaechenleim-pvac, Grund
  "Trockenmasse des Belagleims nicht hinterlegt - nicht addiert". Vorher standen dort nur
  oberflaeche (FEHLT) und kante/vorne (ANDERSWO).
- Der Zahlenwert des Gewichts bewegt sich NICHT: 14.352 kg/m2 vorher wie nachher,
  vollstaendig war schon vorher false (wegen der Oberflaeche). Was sich bewegt, ist die
  Auskunft darueber, WAS fehlt: der Belagleim wurde bisher stillschweigend nicht addiert,
  jetzt steht er als benannte Luecke da.
- Abgeleitete Fingerabdruecke ziehen mit: resolve_manifest_sha256 (4x) und karte_sha256 (4x).
- auftrag.json, katalogstand.json, entfernt.json und modell.glb sind unveraendert.

Die anderen beiden Aenderungen aus #164 greifen auf diesen Daten NICHT, und das ist kein
Versehen: das Bundle exportiert ueberhaupt keinen Preis (Karte und Manifest fuehren kein
Preisfeld, gegrept: 0 Treffer fuer "preis"), also kann "geschaetzte Mengen als Annahme statt
belegt" hier nichts bewegen. Und "Belag ohne Klebstoff als FEHLT" trifft nicht, weil die
Belaege des Demo-Aufbaus ihren Klebstoff referenzieren - genau deshalb nennt der neue
Ausschluss ponal-flaechenleim-pvac beim Namen statt des Belags.

Gegenpin nachgezogen (lib/werkstoff/bundle.test.ts): die vier karte_sha256, die acht Byte-Pins
ueber karten/ und manifeste/ und die FORMELVERSION. Die Zahlen sind vom Erzeugnis abgelesen,
wie es der Kommentar ueber BYTE_PINS vorgibt. AUFTRAG_PIN bleibt unveraendert - der Auftrag
ist derselbe, und cody-cad pinnt in tests/test_demo_bundle_rezept.py denselben Wert.

Rot war (alte Pins gegen das neue Bundle, npx vitest run lib/werkstoff/bundle.test.ts):
    Tests  3 failed | 6 passed (9)
    AssertionError: teil_beispielbo0oben: expected 'werkstoff-ableitung/3' to be
      'werkstoff-ableitung/2'
    karten/teil_beispielbo0oben.json von Hand geaendert? Bundle mit
      `python -m werkzeuge.demo_bundle` neu erzeugen
    expected 'e9b200cda5b9...' to be 'f9c51cea0b09...'
Der Gegenpin beisst also. Dass AUFTRAG_PIN unter den 6 Gruenen blieb, ist der Beleg dafuer,
dass sich der Auftrag wirklich nicht bewegt hat.

Zweiter Pruefstand (andere Pruefstelle, Faelle die vitest nicht erzeugen kann): die vier
karte_sha256 mit cody-cads eigenem kanonisch_hash ueber die AUSGELIEFERTEN Dateien
nachgerechnet - 4/4 OK. Der TS-Test kann das nicht (Python schreibt 120.0, JSON.stringify
schreibt 120), er kommt nur ueber die Bytes an die Frage heran.

Gruen:
    pnpm test        50 passed | 3 skipped (53 Dateien), 463 passed | 24 skipped (487), rc 0
    pnpm typecheck   rc 0
    pnpm lint        rc 0 (No ESLint warnings or errors)
    cody-cad         tests/test_demo_bundle_rezept.py + tests/test_vollstaendigkeit_ableitungen.py
                     27 passed, rc 0

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@Bernhard-Reiter

Copy link
Copy Markdown
Owner Author

Gegenprüfung durch eine zweite Cody-Session: FREIGABE MIT ANMERKUNG

Der Autor dieses PRs hat ihn nicht selbst freigegeben. Eine unabhängige Session hat alle fünf
Behauptungen nachgemessen — und dabei eine Prüfung gemacht, die im PR fehlte.

Der schärfere Test, den der Prüfer ergänzt hat

Ich hatte gegen cody-cad 5974b3d gemessen. Inzwischen steht dessen main auf 9d7aabd —
drei Commits weiter, darunter kern/gemeinsam/wert.py, aus dem die Ableitung direkt importiert.
Genau der Pfad, auf dem ein eingefrorenes Erzeugnis still veraltet. Der Prüfer hat das
Bundle deshalb auf beiden Ständen neu erzeugt:

Erzeuger-Stand projektion.json diff -r gegen das Bundle im PR
5974b3d (Stand des Autors) f652b163a6cc… identisch, alle 34 Dateien
9d7aabd (heutiges main) f652b163a6cc… identisch, alle 34 Dateien

Und der Vergleich ist scharf: ein Saboteur (eine Zeile /3→/2) wird von demselben diff -r
gemeldet.

Hashes nachgerechnet, nicht mitgezogen

4/4 karte_sha256 · 4/4 resolve_manifest_sha256 · AUFTRAG_PIN · 8/8 BYTE_PINS —
alle mit cody-cads eigenem kanonisch_hash über die ausgelieferten Bytes.

AUFTRAG_PIN wurde zusätzlich saboteurgeprüft: ein Zeichen verstellt → 1 failed | 8 passed,
rot wird genau der Auftrags-Test. Der Pin ist kein toter Buchstabe.

Drei Anmerkungen, keine Blocker

A) Die Fundstellenangabe im Kommentarblock stimmt nur zur Hälfte. bundle.test.ts:51-54
behauptet, die vier karte_sha256 stünden so in cody-cads test_vollstaendigkeit_ableitungen.py.
Gemessen: jeder der vier Werte kommt dort in 0 Dateien vor — REFERENZ_KARTEN ist nach
boden-562x555 usw. geschlüsselt, und REFERENZ_MANIFESTE ist von den Bundle-Werten disjunkt
(andere Eingaben: Katalog-Werkstücke vs. demo-revision-3.json, also bauartbedingt kein Überlapp).
Der Mechanismus trägt trotzdem — beide Seiten laufen durch denselben Code, eine Änderung an der
Ableitung färbt beide rot. Falsch ist nur die Fundstellenangabe. Text ist vorbestehend, von diesem
PR unverändert.

B) Mein Hinweis 1 nannte ein CI-Risiko, das es nicht gibt. Gemessen in ci.yml:
pnpm --filter @craft-codex/core build steht in Zeile 58, der Test in Zeile 64 — die CI baut
vor dem Test
. Betroffen ist nur der frische lokale Worktree. Ich korrigiere das hiermit, damit
der Hinweis nicht als offenes Risiko weiterwandert.

C) Zählnuance: „4× resolve_manifest_sha256 mitgezogen" — es sind 4 verschiedene Werte,
aber 8 Schreibstellen (je einmal in Karte und Manifest). Inhaltlich richtig, in der Zahl
untertrieben.

D) Für cody-cad, nicht für diesen PR: Kein Klebstoff im Katalog trägt eine Trockenmasse. Das
neue FEHLT ist also eine echte allgemeine Lücke, kein Sonderfall dieses Erzeugnisses.

Prüfungen des Gegenprüfers

pnpm test rc 0 (core 149 passed, tischler 463 passed | 24 skipped) · typecheck rc 0 ·
lint rc 0 · cody-cad-Gegenseite 27 passed · CI am Head: 2 check-runs, beide success.

Empfehlung des Prüfers: mergen.

@Bernhard-Reiter
Bernhard-Reiter merged commit 1cc1cd8 into main Sep 11, 2026
2 checks passed
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