Synthetischer BAS-Twin E2E-Lauf — 2026-05-14
Zweck
Demo-fertiger Pipeline-Showcase für GF-Termin Becker. Statt echter Test-Anfragen 14 synthetische Fixtures, durch alle 4 Stages (Intake → Extract → Feasibility → Calculate) gefahren, in HTML-Report verdichtet.
Artefakte
- report.html — Stripe-Design, horizontaler 4-Stationen-Zeitstrahl pro Fixture, „Wo liegt das Ergebnis”-Pointer pro Stage
- results.json — kompletter DB-Snapshot inkl.
positionen_full,extraction_meta,kalkulationen+kalkulations_positionen - fixtures — 14 EML-Dateien (DE/EN/ES/IT, Excel + PDF + Multi-Sheet)
Ergebnisse final
Pipeline-Health:
- 14/14 Intake · 14/14 Extract · 14/14 Feasibility · 12/14 Kalkulation
- LLM-Kosten: $4,73 für 14 Anfragen (190.876 Tokens ↑ / 276.951 ↓)
- LME-Anteil avg 2.173 €/t, Range 2.270–2.675 €/t
GF-Sprache statt Engineering-Enums (im Report):
calculated→ „Angebot kalkuliert” (12 Fixtures)extracted→ „Rückfrage offen (Konfidenz)” (1 Fixture — 02 Rahmenvertrag)blocked+ Bemerkung „Kategorie nicht im Stamm” → „Datenlücke im Stamm” (05 Quintet IT)blocked+ Bemerkung „Keine Anlage gefunden” → „Eskalation an Betriebsleiter” (09 PDF-only)
Bugs gefunden + gefixt
1. Stammdaten-Lookup matched nicht zwischen Extraktor und Material-Stamm
Symptom: LME-Basis blieb 0,00 €/t in allen 36 Kalkulationen, obwohl lme_preise korrekt geseedet.
Root cause: Extraktor liefert legierung: "EN-AW-5754", Material-Stamm hat materialien.guete = "5754". Der Lookup in apps/worker/src/calculation/stammdaten.ts verglich eq(materialien.guete, context.guete) — kein Match.
Fix: OR-Klausel auf bezeichnung:
or(eq(materialien.guete, context.guete), eq(materialien.bezeichnung, context.guete))Patch siehe ~/source/bas-twin/apps/worker/src/calculation/stammdaten.ts. Echter Pipeline-Bug, kein Demo-Workaround — committable.
2. LME-Seed-Range zu eng
Symptom: Auch nach Fix 1 hatten 4 Fixtures (03, 11, 12, 13) noch LME = 0.
Root cause: Demo-Seed deckte nur Feb–Mai 2026 ab. Fixtures mit Liefer-Datum Mai/Juni 2026 → mit LME-2-Formel (= Lieferdatum minus 2 Monate) wird März/April gesucht ✓. Aber Fixtures mit Datum Juli/August oder historischen Anfragen mit Liefer-Datum 2025-11 fallen aus der Range. Z.B. Fixture 11 suchte LME-Monat 2025-11.
Fix: Seed-Range auf Okt 2025 – Aug 2026 erweitert (88 LME-Preise, 8 Materialien × 11 Monate).
3. MinIO via Docker nicht verfügbar, Pipeline blockiert
Symptom: Docker Desktop crashed (libnetwork I/O error), MinIO weg → S3 PUT/GET hängt.
Fix: Filesystem-Fallback in apps/worker/src/storage/s3.ts:
S3_ENDPOINT=file:///tmp/bas-twin-s3-fs
Wenn das Env mit file:// startet, schreibt putObject/getObject direkt aufs Filesystem. Klein, sauber, Docker-unabhängig. Auch sinnvoll für CI ohne Container-Runtime.
Demo-Lauf-Workflow (wiederverwendbar)
- Postgres lokal hochziehen (Homebrew oder Docker):
psql -h 127.0.0.1 -p 5432 postgres -c "CREATE ROLE bastwin WITH LOGIN PASSWORD 'bastwin' CREATEDB SUPERUSER;" psql -h 127.0.0.1 -p 5432 postgres -c "CREATE DATABASE bastwin OWNER bastwin;" - Migrate + Seed:
cd ~/source/bas-twin DATABASE_URL=postgresql://bastwin:bastwin@127.0.0.1:5432/bastwin pnpm --filter @bas-twin/db migrate DATABASE_URL=postgresql://bastwin:bastwin@127.0.0.1:5432/bastwin pnpm --filter @bas-twin/db seed - Pipeline-Run mit FS-S3:
cd apps/worker DATABASE_URL=... S3_ENDPOINT=file:///tmp/bas-twin-s3-fs S3_FORCE_PATH_STYLE=true \ S3_BUCKET=bas-twin-data-dev S3_ACCESS_KEY_ID=x S3_SECRET_ACCESS_KEY=x \ AWS_PROFILE=av-becker AWS_REGION=eu-central-1 \ pnpm exec tsx scripts/synthetic-batch/run-pipeline.ts - Report bauen:
pnpm tsx apps/worker/scripts/synthetic-batch/build-report.ts
Offene Punkte
- Eskalations-Trigger live machen: Aktuell ist „Eskalation an Betriebsleiter” nur ein Status-Label im Report. Pipeline soll bei Fall „Keine Anlage gefunden” automatisch Email/Slack-Benachrichtigung an
betriebsleitung-Rolle senden. → Ticket für Sprint 2. - Stammdaten-Lookup-Fix in PR:
stammdaten.tsPatch ist auf lokalem Branch, noch nicht committed. - LME-Seed-Block in
seed/index.ts: Liegt lokal inpackages/db/src/seed/index.ts, hilft auch in CI/Onboarding-Setups. Committable. - FS-S3-Fallback:
s3.tsPatch ist nützlich für Dev ohne Docker. Frage: in Production-Pfad einbauen oder als test-only Helper?
Related
- _index — Projekt-State
- becker — Kunde
- gf-sprache-pipeline-status — Pattern (siehe unten)