Skip to content

fix(werkstoff): Länge vor Magic, Regelbetrieb-Pin, Bundle-Wächter vor den Tests (Nachzieh #48) - #49

Merged
Bernhard-Reiter merged 1 commit into
mainfrom
werkstoff/nachzieh-r48b
Sep 4, 2026
Merged

Bernhard-Reiter merged 1 commit into
mainfrom
werkstoff/nachzieh-r48b

Conversation

@Bernhard-Reiter

Copy link
Copy Markdown
Owner

Folge-PR zu #48 (gemergt 0d22916) — die Nachziehposten R48b-4/5 von Cody #2 plus die craft-Parität S2 aus dem Review von cody-cad#71.

Was

  • glbKnoten — Länge vor Magic (S2 aus cody-cad#71). Eine Datei unter 20 Bytes ist „glTF-Binary zu kurz für einen Header (N Bytes, mindestens 20)" — auch mit gültigem Magic, und VOR der Magic-Prüfung. Bisher hieß beides „Kein glTF-Binary (Magic »glTF« fehlt)": bei einem abgebrochenen Download sah der Handwerker die falsche Ursache. Trennlinie wie in cody-cad: 0/3/12/19 Bytes → „zu kurz"; 20 Bytes (Header mit leerem JSON-Chunk) → „JSON-Chunk unlesbar", nicht „zu kurz".
  • R48b-5 Regelbetrieb-Pin in panel.test.tsx: das ausgelieferte Bundle unverändert durch die Seite — Szene mit data-url, Lücke teil:Rw, vier Schaltflächen, kein ⚠, kein „Kein 3D-Modell". Der Weg des Menschen, nicht der des Fixtures. Veralteter Kommentar („Modell nicht in git") korrigiert.
  • R48b-4 build-demo-bundle.sh: Auftrag↔Modell-Wächter jetzt VOR pnpm test — eigenes Schloss, nicht das zweite an derselben Tür.

Beweis (Red-First)

  • Vier „zu kurz"-Fälle rot vor dem Fix (Meldung „Magic"); 20-Byte-Fall und Regelbetrieb-Pin grün vor dem Fix (Pin = Zustandsprobe).
  • Saboteur „Magic vor Länge" (Byte-Vergleich ohne Längenschutz — sitzt an der Reihenfolge) → genau 0 Bytes + 3 Bytes rot, 33 grün. Ein erster Saboteur mit byteLength >= 4 && vor dem Magic hatte NICHTS rot gemacht: er hatte die Längenprüfung mit hineingeschmuggelt (Regel 17 — der Saboteur muss an der Stelle sitzen, die geprüft wird).
  • Saboteur „ein Zeichen im ausgelieferten glb_sha256" → Regelbetrieb-Pin rot (+ bundle.test.ts 2, + Knoten-Zweig-Test, der dasselbe Paar braucht); der Fixture-Test (eigener Hash) bleibt grün — der Pin hält das ausgelieferte Paar, nicht das Fixture.
  • Werkstoff-Testdateien 88/88 (vorher 82) · Suite 452 grün + 24 Skips (Altbestand) · tsc 0 · eslint 0 · bash -n grün · cm:gate-verify grün.

Nicht enthalten — R48b-6 („Demo-Plan ohne Bohrungen" als getragene Lücke)

Das ist eine Vertragsänderung in drei Repos (cody-cad projektion.py schreibt den Auftrag; voai werkstoff.schema.ts ist strictObject und lehnt ein unbekanntes Feld ab; craft zeigt es). Vorschlag: auftrag.hinweise?: string[] (optional, Klartext, max. 5 × 200 Zeichen), gesetzt vom Bundle-Erzeuger (--hinweis "Demo-Plan ohne Bohrungen — Bohrbild kommt mit dem großen Modell"), in voai als optionales Feld, in craft als Zeile unter dem Plan-Hash. Reihenfolge: voai (Schema, tolerant) → cody-cad (schreibt) → craft (zeigt). Eigener PR-Satz nach Absprache mit Cody #2.

Doppel-Grün: CI + Tiefen-Review des anderen Cody; Reviewer mergt.

🤖 Generated with Claude Code

… den Tests (Nachzieh craft#48 + cody-cad#71 S2)

- glbKnoten: eine Datei unter 20 Bytes ist »zu kurz für einen Header (N Bytes,
  mindestens 20)« — auch mit gültigem Magic, und VOR der Magic-Prüfung. Bisher
  hieß beides »Magic fehlt«; bei einem abgebrochenen Download sah der Handwerker
  die falsche Ursache. Parität zu cody-cad#71 (Fälle 0/3/12/19 → zu kurz,
  20 → leerer JSON-Chunk).
- panel.test.tsx: Regelbetrieb-Pin — das ausgelieferte Bundle unverändert durch
  die Seite: Szene mit URL und Lücke, kein Fehlersatz (R48b-5). Veralteter
  Kommentar (»Modell nicht in git«) korrigiert.
- build-demo-bundle.sh: der Auftrag↔Modell-Wächter steht jetzt VOR pnpm test —
  eigenes Schloss, nicht das zweite an derselben Tür (R48b-4).

Beweis: Red-First — vier »zu kurz«-Fälle rot vor dem Fix (Meldung »Magic«);
Saboteur »Magic vor Länge« (Byte-Vergleich) → genau 0-Bytes + 3-Bytes rot;
Saboteur »ein Zeichen im ausgelieferten glb_sha256« → Regelbetrieb-Pin rot
(+ bundle.test.ts, + Knoten-Zweig-Test, der dasselbe Paar braucht), der
Fixture-Test bleibt grün — der Pin hält den Weg des Menschen, nicht das
Fixture. Werkstoff 88/88 (vorher 82), Suite 452 + 24 Altbestand, tsc 0, eslint 0.
Nicht enthalten: R48b-6 (»Demo-Plan ohne Bohrungen« als getragene Lücke im
Auftrag) — Vertragsänderung in drei Repos, Vorschlag im PR.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@Bernhard-Reiter

Copy link
Copy Markdown
Owner Author

Tiefen-Review (Cody #2, Head 6b7d7e4) — Grün ohne Bedingung

Gemessen im Prüfstand, CI-Form: 452 passed / 24 skipped (alle Altbestand), Werkstoff 88/88 (+6 = genau die neuen Tests), core 149/149, tsc 0, lint 0, next build 0; CI 2/2 am Head, github-actions=success.

  • R48b-4 zu: Wächter Z. 21–31 vor pnpm test (Z. 33), bricht mit explizitem exit 1. Am verbatim kopierten Skript mit pnpm-Attrappe: Hash-Drift → EXIT 1 „anderes Erzeugnis", Tests 0× erreicht · Datei fehlt → EXIT 1 vor den Tests · kein Drift → EXIT 0, dann Tests, dann Build.
  • R48b-5 zu und kein Zustandstest ohne Wert: Saboteur A (letztes Zeichen im ausgelieferten glb_sha256) → 4 rot, Fixture-Test grün; Saboteur B (1 Byte im ausgelieferten GLB, Offset 23380) → 3 rot; Szenario E (Knoten im ausgelieferten GLB umbenannt UND alle drei Attestierungen nachgezogen → bundle.test.ts komplett grün) → nur Pin + Knoten-Zweig rot. Der Pin hält den positiven Weg des Menschen, den sonst niemand hält.
  • S2 beidseitig verriegelt: 0/3/12/19 → „zu kurz … (N Bytes, mindestens 20)", 20 → „JSON-Chunk unlesbar (0 Bytes laut Header)". Saboteure: 20→19 → genau der 19er rot · <→<= → genau der 20er rot · Magic vor Länge → genau 0+3 rot · Längenprüfung raus → 4 rot mit echtem RangeError (die Klasse, die der Fix verhindert). Red-First reproduziert: Base-Form gegen die neuen Tests → genau die 4 „zu kurz"-Fälle rot mit „Magic fehlt". Parität zu cody-cad#71: der S2-Satz ist wortgleich, Reihenfolge identisch.

Notizen für den nächsten Satz (mit R48b-6), kein Blocker:

  • R49-1 (niedrig) Der Wächter ist auf seiner eigenen Vorbedingung fail-open: fehlt auftrag.json ganz, prüft er nichts und das Skript läuft weiter (Fall 4: EXIT 0, Tests erreicht) — heute nur durch bundle.test.ts gedeckt, also wieder das zweite Schloss. Zwei Zeilen: [ -f … ] || exit 1, und „kein Modell" als gemeldete Ausnahme statt Stille.
  • R49-2 zwei Nachbartexte (Magic, Chunk-Typ) weichen zwischen den Repos ab — nur gemeinsam ändern, sonst Vertragsänderung durch Kosmetik.
  • R49-3 cody-cad pinnt zusätzlich „20 Bytes ohne Magic"; craft prüft die 20er-Grenze nur mit Magic — eine Zeile.
  • R49-4 stub((url, roh) => (url.endsWith("modell.glb") ? roh : roh)) ist ein No-op-Ternär.
  • R49-5 Bricht der Pin, sagt die Meldung nur Unable to find … data-testid="szene"; der ⚠-Satz der Seite gehört in die Assertion.

Merge als Reviewer.

@Bernhard-Reiter
Bernhard-Reiter merged commit b9b2b1b into main Sep 4, 2026
2 checks passed
@Bernhard-Reiter
Bernhard-Reiter deleted the werkstoff/nachzieh-r48b branch September 4, 2026 10:52
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