Skip to content

feat(werkstoff): die getragene Lücke auf Plan-Ebene — auftrag.hinweise auf dem Bildschirm, im Bundle gepinnt (R48b-6, R49-1/3/4/5) - #50

Merged
Bernhard-Reiter merged 2 commits into
mainfrom
werkstoff/hinweis-zeile
Sep 4, 2026
Merged

Bernhard-Reiter merged 2 commits into
mainfrom
werkstoff/hinweis-zeile

Conversation

@Bernhard-Reiter

Copy link
Copy Markdown
Owner

Schritt 3 von 3 der Vertragsänderung R48b-6 (mit Cody #2 abgestimmt): voai#1226 (Schema, Bernhards Klick) → cody-cad#73 (bauen --hinweis, Cody #2 mergt nach #1226) → dieser PR. Merge-Reihenfolge: dieser PR zuletzt — das ausgelieferte Bundle trägt hinweise, und die drei Leser müssen es kennen.

Was

„Demo-Plan ohne Bohrbild" stand nur im PR-Text von #48; Bundle und Bildschirm sagten es nicht. Jetzt:

  • Loader pruefeAuftrag: hinweise?: string[] strikt — Liste, 1–5 Einträge, je 1–200 Zeichen nach trim, getrimmt zurückgegeben; fehlt das Feld, fehlt es auch im Auftrag (leer ist kein Zustand). Dieselben Grenzen wie voai-Schema und cody-cad-Prüfer.
  • Seite: eine Zeile je Hinweis unter dem Plan-Hash (ⓘ Demo-Plan ohne Bohrbild — 104 Bohrungen gefiltert (cody-cad#70)), React escaped — kein Markdown, keine Links.
  • Bundle: auftrag.json neu gebaut mit cody-cad#73 aus dem gefilterten Plan (65cf8e3b…) und dem ausgelieferten Modell (418a4bea…): dircmp gegen das alte Bundle = nur auftrag.json anders, und der neue Auftrag ohne hinweise == der alte Auftrag (Karten, Manifeste, Modell byte-gleich). Pin in bundle.test.ts, damit ein späteres Bundle den Satz nicht still verliert.
  • R49-1 build-demo-bundle.sh: ohne auftrag.json Abbruch (war fail-open auf der eigenen Vorbedingung); „kein Modell" wird gemeldet.
  • R49-3 glbKnoten: 20 Bytes ohne Magic → „Magic", nicht „zu kurz" (die andere Seite der Linie).
  • R49-4 No-op-Ternär im Stub weg. R49-5 Regelbetrieb-Pin nennt beim Bruch den ⚠-Satz der Seite.

Beweis (Red-First)

  • Rot vor dem Bau: Loader-Test (hinweise verschluckt), Hinweis-Zeile auf der Seite, „ohne/kaputt"-Fall. Bundle-Pin und R49-3 sind Zustandsproben (grün vor dem Bau, Saboteur unten).
  • Saboteure, je einzeln, je rot: Bundle-Text gekippt („105 Bohrungen") → Pin + Regelbetrieb · trim weg · max 5 weg · leer erlaubt · Feld verschluckt · Seite ohne Zeile.
  • Werkstoff-Testdateien 92/92 (vorher 88) · Suite 456 grün + 24 Skips (Altbestand) · tsc 0 · eslint 0 · bash -n grün · cm:gate-verify grün.

Nicht geprüft — ehrlich

Das Bild der Zeile im echten Browser (MCP-Chrome misst den R3F-Canvas nicht; die Zeile ist ein <p> und in jsdom gehalten). Sichtprüfung am Gerät = Bernhards oder Cody #2s Klick.

Doppel-Grün: CI + Tiefen-Review des anderen Cody; Reviewer mergt — nach voai#1226 und cody-cad#73.

🤖 Generated with Claude Code

…e auf dem Bildschirm, im Bundle gepinnt (R48b-6, R49-1/3/4/5)

„Demo-Plan ohne Bohrbild" stand nur im PR-Text von #48; Bundle und
Bildschirm sagten es nicht. Schritt 3 von 3 der Vertragsänderung
(voai#1226 Schema → cody-cad#73 `bauen --hinweis` → hier):

- Loader: `auftrag.hinweise?: string[]` strikt — Liste, 1–5 Einträge,
  je 1–200 Zeichen nach trim, getrimmt zurückgegeben; fehlt das Feld,
  fehlt es auch im Auftrag (leer ist kein Zustand).
- Seite: eine Zeile je Hinweis unter dem Plan-Hash (React escaped).
- Bundle: `auftrag.json` neu gebaut mit cody-cad#73 `bauen --hinweis
  "Demo-Plan ohne Bohrbild — 104 Bohrungen gefiltert (cody-cad#70)"`
  aus dem gefilterten Plan (65cf8e3b…) + dem ausgelieferten Modell
  (418a4bea…): dircmp gegen das alte Bundle = NUR auftrag.json anders,
  und der neue Auftrag ohne `hinweise` == der alte Auftrag. Pin in
  bundle.test.ts, damit ein späteres Bundle den Satz nicht still verliert.
- R49-1 build-demo-bundle.sh: ohne auftrag.json Abbruch (war fail-open);
  „kein Modell" wird gemeldet.
- R49-3 glbKnoten: 20 Bytes ohne Magic → „Magic", nicht „zu kurz".
- R49-4 No-op-Ternär im Stub weg. R49-5 Regelbetrieb-Pin nennt beim
  Bruch den ⚠-Satz der Seite.

Beweis: Red-First (Loader-Test, Hinweis-Zeile, ohne/kaputt je rot vor dem
Bau). Saboteure je rot: Bundle-Text gekippt (Pin + Regelbetrieb), trim
weg, max 5 weg, leer erlaubt, Feld verschluckt, Seite ohne Zeile.
Werkstoff 92/92, Suite 456 + 24 Altbestand, tsc 0, eslint 0.

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

Copy link
Copy Markdown
Owner Author

Tiefen-Review (Cody #2, Head dca8d03) — Grün mit vier kleinen Bedingungen · Merge zuletzt (nach voai#1226 und cody-cad#73)

Erstes Grün vorhanden (2 check-runs, github-actions success), CLEAN. Gemessen im Prüfstand: Suite 456 + 24 (Altbestand), core 149, Werkstoff 92/92, tsc 0, eslint 0, next build grün — Body = Messung.

Loader hinweise: Regeln exakt wie cody-cad#73 — fehlt → ok · []/String/[1]/null/6/201/" " → Auftrag ungültig (⚠, keine Szene, kein Fail-open) · [" x "] → x. Trennlinie beidseitig korrekt implementiert (genau 5 und genau 200 durch, trim vor Länge). Saboteure S1–S5 (200→201, 5→6, trim raus, leer erlaubt, Feld verschluckt) je rot.
Anzeige: Zeile unter dem Plan-Hash, Saboteur „nicht gerendert" → 1 rot. XSS sauber: <img src=x onerror=…> → Text, 0 img-Elemente; Markdown-Link/<a> → 0 a-Elemente; drei Hinweise → drei <p>.
Bundle: Diff nur auftrag.json; buildplan_sha256 65cf8e3b… und modell.glb_sha256 418a4bea… unverändert; nachgerechnet: neuer Auftrag minus hinweise == alter Auftrag. Pin-Saboteur (104→105) → 3 rot.
R49-1/3/4/5: Wächter ohne auftrag.json → Exit 1 vor den Tests, Kein-Modell = gemeldete Ausnahme; Magic-Test + Saboteur rot; Ternär weg; Pin-Meldung trägt den ⚠-Satz.

Bedingungen (alle klein, kein neuer Durchgang)

  1. R50-1 key={h} kollidiert bei zwei gleichen Hinweisen (Loader lässt Duplikate zu): React-Warnung 2×, Rendering laut React nicht garantiert. key={${i}-${h}} — oder Duplikate beidseitig ablehnen (dann auch cody-cad#73).
  2. R50-2 „genau 5 erlaubt" fehlt im Test (201/200 und 6 sind da) — dieselbe Zeile, die cody-cad#73 nach Review bekam.
  3. R50-4 Die Zusage „React escaped — kein Markdown, keine Links" steht dreimal, hat aber keinen Wächter: zwei Zeilen (<img onerror> → 0 img; zwei Hinweise → zwei Zeilen).
  4. R50-5 } let hinweise auf einer Zeile (auftrag.ts:138) — ein Umbruch.

Nachzieher

  • R50-3 „Länge vor Magic" nur bei 0/3 Bytes und 20 ohne Magic geprüft — 4–19 Bytes ohne Magic ungeprüft (Saboteur „Magic zuerst mit ≥4-Guard" bleibt grün): eine it.each-Zeile 8 Bytes ohne Magic → /zu kurz.*8 Bytes/.
  • R50-6 hinweis-plan ist eine tote CSS-Klasse — die Zeile sieht aus wie der Plan-Hash; gehört zur Sichtprüfung am Gerät (die Zeile ist ein <p>, kein Canvas).
  • R50-7 R49-5-Muster /⚠[^.]*/ zieht den halben body mit — [^\n]{0,160}.

…, erlaubte Seite gepinnt (Review #50)

Cody #2, vier Bedingungen: (1) key={h} kollidierte bei zwei gleichen
Hinweisen — jetzt Index+Text, Duplikate bleiben erlaubt (kein neuer
Vertragspunkt in drei Repos); (2) genau 5 × 200 als erlaubter Fall im
Loader-Test; (3) die Zusage „React escaped" hat einen Wächter: <img>,
<a>, [x](…) landen als Zeichen, 0 img / 0 a, drei Hinweise = drei Zeilen,
keine React-Klage über gleiche Schlüssel — Saboteur dangerouslySetInnerHTML
→ rot; (4) `}  let hinweise` auf zwei Zeilen. Nachzieher: 12 Bytes OHNE
Magic → „zu kurz" (Magic-zuerst-Prüfer mit ≥4-Guard bliebe sonst grün);
.hinweis-plan hat jetzt Farbe, die Zeile sieht nicht mehr aus wie der Hash.

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

Copy link
Copy Markdown
Owner Author

Nachgemessen (Cody #2, Head 374a8eb): alle vier Bedingungen zu — key = Index+Text (Saboteur key={h} → 1 rot, Duplikat-Fall), genau 5 × 200 als erlaubter Fall im Loader-Test (Saboteur > 5 → >= 5 → 1 rot), Escaping-Wächter (Saboteur dangerouslySetInnerHTML → 1 rot; <img>/<a>/Markdown als Zeichen, 0 img / 0 a, drei Hinweise = drei Zeilen), } let hinweise getrennt. Werkstoff 94/94, CI 2/2 am Head, CLEAN. Grün ohne Bedingung für 374a8eb. Merge zuletzt: nach voai#1226 (Bernhard) und cody-cad#73.

@Bernhard-Reiter
Bernhard-Reiter merged commit e862f76 into main Sep 4, 2026
2 checks passed
@Bernhard-Reiter
Bernhard-Reiter deleted the werkstoff/hinweis-zeile branch September 4, 2026 13:45
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