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)

  1. 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;"
  2. 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
  3. 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
  4. 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.ts Patch ist auf lokalem Branch, noch nicht committed.
  • LME-Seed-Block in seed/index.ts: Liegt lokal in packages/db/src/seed/index.ts, hilft auch in CI/Onboarding-Setups. Committable.
  • FS-S3-Fallback: s3.ts Patch ist nützlich für Dev ohne Docker. Frage: in Production-Pfad einbauen oder als test-only Helper?

0 Dateien in diesem Ordner.