Phase B Pipeline-Kalibrierung — Analyse + TODO-Brief

Status 2026-05-15: Alex-Items + Marvin-Code-TODOs als Kanban-Eintraege im bas-twin-Repo (projekt/steuerung/kanban.md, commit f8a5c9e). Dieses Doc bleibt als Hintergrund — warum nur 2 echte Alex-Fragen uebrig sind und wie die Pipeline-Breakdown gegen Alex’s Excel aussieht.

Kontext

Phase A (PR #27, gemerged 2026-05-15) hat die Architektur drin: neuer Step 07a-aufwandsaufschlag.ts, 4 neue Stamm-Tabellen, Marge-Default 12 %. Architektur funktioniert — alle Architektur-Tests gruen.

Aber: der Golden-Path-E2E gegen Alex’s Beispielzeile (3092 kg ALU QT 6082 6Mo → erwartet 11.194 EUR) rechnet die Pipeline aktuell 18.101 EUR. Differenz 62 %.

Die Diskrepanz steckt nicht in Step 07a (der rechnet 5 % korrekt). Sie steckt in Schritten 1-4 der bestehenden Pipeline, die auf Excel V3-Konstanten basieren — Alex v17 hat andere Werte/Logik.

Phase B = die 4 Code-Stellen kalibrieren. Aber dazu brauchen wir genaue Klaerung von Alex.

Aktueller Pipeline-Breakdown (3.092 to Lieferung, 4.123 to Einsatz wegen 25 % Schrottquote)

PostenCode rechnetAlex Excel v17 erwartet
BarEK/Bezugspreis (TEP)950 €/t × 4.123 to = 3.917 €nicht separat gezeigt — vermutlich in LME + Guete
LME2.600 €/t × 4.123 = 10.719 €7.266 € (= ~2.350 €/t × 3.092 to Lieferung)
Guete-Zuschlag0 € (nicht aus Stamm geladen)1.422 €
Maschinenstunden350 € (Querteilen 85 €/t)212 € (= 85 €/h × 2.5 h direkt, ohne Einsatzmengen-Hochrechnung)
Produktionsausschuss/Verschnitt3.659 € (25 % × (EK+LME+Spalten))434 € (= 5 % von etwas)
Schrottverwertung-2.267 € (-550 €/t × Einsatzmenge)nicht separat
Fracht/Lager/Finanz503 €108 € (= 35 €/t × 3.092 to)
VW/VT Gemeinkosten115 €nicht separat — wohl im Aufschlag/Marge
Aufwandsaufschlag (Step 07a)314 € (5 %)476 € (5 % × 9.519 € Selbstkosten)
Marge791 € (12 %)1.199 € (12 % × 9.995 €)
Summe18.101 €11.194 €

Reality-Check: nicht 5 Fragen, sondern 2

Erst dachte ich es waeren 5 Hauptfragen. Nach genauerem Schauen in Alex’s Beispielzeile sind 3 davon eigentlich Code-Entscheidungen (Antwort steckt schon im Beispiel) und 1 ist Common-Sense — bleiben 2 echte Alex-Fragen.

#WarErgebnis
Selbstkosten inkl. LMEAlex-FrageNein — aus Beispiel ableitbar (9.517 = LME 7.266 + Rest), wird Marvin-Code-Anpassung
Verschnitt: 5 % vs QuoteAlex-FrageJa, bleibt — fundamentale Modellierungs-Frage
BarEK separatAlex-FrageJa, bleibt — wir wissen nicht ob es einen dritten Posten gibt
Maschinen absolutAlex-FrageNein — aus Beispiel ableitbar (85 × 2.5 = 212 absolut), wird Marvin-Code-Anpassung
Mindermenge woraufAlex-FrageCommon-Sense (Aufschlag auf Maschinen-Kosten = Ruestzeit-Penalty), wird Marvin-Code-Anpassung

Die 2 echten Alex-Fragen (im Kanban)

Frage 1 — Verschnitt: Werker-Realitaet oder Vertriebs-Vereinfachung?

Code aktuell (step04-verschnitt.ts): 25 % Schrottquote × (Bezugspreis + LME + Spalten) ≈ 887 €/t plus -550 €/t Schrott-Erloes. Netto ~337 €/t.

Alex v17 Beispiel: Verschnitt 434 € flach bei 3.092 to → ~140 €/t. Kein separater Schrott-Erloes.

Frage: Ist die 25 %-Schrottquote die echte Werker-Logik (Material muss mehr eingekauft werden + Schrott wird verwertet) und v17 ist nur eine Vertriebs-Vereinfachung daruber? Oder hat Becker tatsaechlich auf das v17-Modell umgestellt? Davon haengt ab, ob step04 komplett umgeschrieben wird oder beide Sichten nebeneinander existieren.

Frage 2 — BarEK/TEP: dritter Posten oder = LME + Guete?

Code aktuell (step01-bareinkaufspreis.ts): Bareinkaufspreis 950 €/t hardcoded fallback als separater Posten vor LME + Guete.

Alex v17 Beispiel: Zeigt nur LME (7.266 €) + Guete-Zuschlag (1.422 €). Kein “BarEK” als dritte Position.

Frage: Gibt’s einen Walzwerks-Einkaufspreis bei Becker, der ueber LME + Guete-Zuschlag hinausgeht (z. B. Huetten-Aufschlag, Versiegelungs-Aufpreis, Walzwerks-Marge)? Oder ist “Einkaufspreis Lieferant” in v17 schon die Summe LME + Guete und es gibt keinen dritten Posten?

Frage 3 — Liefertermin fehlt in Anfrage: ASAP-Default? (NEU 2026-05-21)

Kontext: Aktuell ist wunsch_liefertermin eins von 7 Pflichtfeldern fuers Konfidenz-Gate. Fehlt der Wert oder ist die Konfidenz < 0.75 → Rueckfrage an Kunden. In der Praxis nennen viele Kunden gar keinen Wunschtermin („so schnell wie moeglich” implizit).

Konsequenz fuer die Kalkulation: Liefertermin steckt in zwei Stellen:

  1. LME-Formel rechnet Lieferdatum minus 2 Monate rueckwaerts auf den LME-Stichtag
  2. Maschinen-Slot-Verfuegbarkeit (vermutlich Sprint 2+)

Frage: Ist ASAP der Default wenn der Kunde keinen Termin nennt? Falls ja: welcher konkrete Termin wird intern fuer die LME-Formel angesetzt? Heutiger Monat? Naechster freier Maschinen-Slot? Oder fester Default-Offset (z.B. heute + 4 Wochen)?

Frage 4 — Standard-Legierung pro Kunde? (NEU 2026-05-21)

Kontext: Aktuell wirft die Pipeline eine Rueckfrage wenn die Legierung in der Anfrage fehlt (Konfidenz < 0.75). Marvin-Vermutung: viele Kunden haben eine typische Standard-Legierung oder 2-3 die immer wiederkommen.

Schema-Stand heute: kunden-Tabelle in stamm.ts:18 hat aktuell kloeckner_kundennr, firmenname, verkaufsgebiet, email_domains, rahmenvertrag_aktiv. Kein Standard-Legierung-Feld.

Frage: Gibt es bei Becker pro Kunde eine Standard-Legierung (oder 2-3 typische)? Falls ja: schon im Kloeckner-Stamm gepflegt, oder eher Bauchwissen vom Vertrieb? Wenn gepflegt: ich ziehe das als Fallback im Extract-Stage statt Rueckfrage.

Geplante Code-Aenderung wenn Antwort = ja:

  • Schema-Migration: kunden.standard_legierung text (1-Wert) ODER kunden_standard_materialien (n:m mit Haeufigkeits-Counter)
  • Extract-Fallback-Logik: bei legierung.konfidenz < 0.75 → Lookup kunden.standard_legierung ueber kunde_id, bei Match quelle='kunden-stamm', konfidenz=0.90 setzen

Die 3 Code-Anpassungen (Marvin, Phase B)

Nach Klaerung der 2 Alex-Fragen mache ich diese drei Anpassungen selbst:

  1. Selbstkosten-Basis um LME erweitern. step07a-aufwandsaufschlag.ts:191 und step07-marge.ts:13 lesen aktuell hkKurzfr + vwVt. Wird hkKurzfr + vwVt + lme. Aufschlag-Wert steigt damit um Faktor ~10. Code-Reference: LME-Position lebt in vorgaenger[1].positions.find(p => p.art === 'lme').

  2. Maschinen-Kosten als absoluten EUR-Posten. step03-herstellkosten.ts rechnet aktuell €/t × Einsatzmenge. Alex’s Beispiel zeigt: 85 €/h × 2.5 h = 212 EUR absolut, unabhaengig von Menge. Step-Contract muss aufgeweicht werden — entweder Position mit menge=null, einzelpreisEur=212, summeEur=212, oder neuer Position-Subtype.

  3. Neuer Step step02a-mindermenge.ts. Zwischen Bezugspreis und Herstellkosten. Wenn mengeKg < 1000: 20 %-Aufschlag auf Maschinen-Kosten. Pipeline-Order entsprechend anpassen, Vorgaenger-Indizes in step07a/07-marge/08-summe nachziehen.

Plus: Golden-Path-E2E wieder gruen ziehen (calculate-aufwand-golden.e2e.test.ts). Zielwert 11.194 EUR ±1 %.

Was Alex NICHT klaeren muss

  • Aufwandsschluessel-Faktoren selbst (39 Werte, 9 Kategorien) — die hat er in der Excel, wir haben 35 davon im Demo-Seed
  • Stufen-Konfiguration (5/15/30 %) — gesetzt
  • VPC-Codes (4 Stueck mit Kapazitaet + Material-EUR) — geseededt
  • Geschaeftsart, externer Bearbeiter, Beoelungs-XOR, Verpackungs-Default — alle entweder durch Defaults gedeckt fuer Demo (Phase A) oder via Email-Extract-Anreicherung (Phase B+) loesbar

Wie weiter

Die 2 Alex-Fragen liegen als Kanban-Items in ~/source/bas-twin/projekt/steuerung/kanban.md (commit f8a5c9e). Sobald Alex antwortet:

  1. Die Antwort als Decision-File unter ~/source/bas-twin/projekt/absprachen/entscheidungen/ ablegen
  2. Auf der Basis einen ce:plan-Lauf fuer Phase B starten
  3. Die 3 Marvin-Code-Anpassungen (oben) + ggf. weitere step04-Aenderung als Implementation-Units

Termin mit Alex braucht’s nicht — die Fragen sind klein genug fuer eine Slack-Antwort oder direkten Kanban-Reply.

  • _index — Projekt-Hub
  • _index — wo die LME-Bugs auffielen
  • Plan-Doc Phase A: ~/source/bas-twin/docs/plans/2026-05-15-001-feat-aufwandsschluessel-phase-a-plan.md
  • Spec v17: ~/source/bas-twin/projekt/daten/stammdaten/aufwandsmatrix.md
  • Golden-Path-Test mit voller Pipeline-Breakdown: ~/source/bas-twin/apps/worker/src/__tests__/calculate-aufwand-golden.e2e.test.ts (skipped, mit Phase-B-Kommentar)