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, commitf8a5c9e). 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)
| Posten | Code rechnet | Alex Excel v17 erwartet |
|---|---|---|
| BarEK/Bezugspreis (TEP) | 950 €/t × 4.123 to = 3.917 € | nicht separat gezeigt — vermutlich in LME + Guete |
| LME | 2.600 €/t × 4.123 = 10.719 € | 7.266 € (= ~2.350 €/t × 3.092 to Lieferung) |
| Guete-Zuschlag | 0 € (nicht aus Stamm geladen) | 1.422 € |
| Maschinenstunden | 350 € (Querteilen 85 €/t) | 212 € (= 85 €/h × 2.5 h direkt, ohne Einsatzmengen-Hochrechnung) |
| Produktionsausschuss/Verschnitt | 3.659 € (25 % × (EK+LME+Spalten)) | 434 € (= 5 % von etwas) |
| Schrottverwertung | -2.267 € (-550 €/t × Einsatzmenge) | nicht separat |
| Fracht/Lager/Finanz | 503 € | 108 € (= 35 €/t × 3.092 to) |
| VW/VT Gemeinkosten | 115 € | nicht separat — wohl im Aufschlag/Marge |
| Aufwandsaufschlag (Step 07a) | 314 € (5 %) | 476 € (5 % × 9.519 € Selbstkosten) |
| Marge | 791 € (12 %) | 1.199 € (12 % × 9.995 €) |
| Summe | 18.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.
| # | War | Ergebnis |
|---|---|---|
| Selbstkosten inkl. LME | Alex-Frage | Nein — aus Beispiel ableitbar (9.517 = LME 7.266 + Rest), wird Marvin-Code-Anpassung |
| Verschnitt: 5 % vs Quote | Alex-Frage | Ja, bleibt — fundamentale Modellierungs-Frage |
| BarEK separat | Alex-Frage | Ja, bleibt — wir wissen nicht ob es einen dritten Posten gibt |
| Maschinen absolut | Alex-Frage | Nein — aus Beispiel ableitbar (85 × 2.5 = 212 absolut), wird Marvin-Code-Anpassung |
| Mindermenge worauf | Alex-Frage | Common-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:
- LME-Formel rechnet
Lieferdatum minus 2 Monaterueckwaerts auf den LME-Stichtag - 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) ODERkunden_standard_materialien(n:m mit Haeufigkeits-Counter) - Extract-Fallback-Logik: bei
legierung.konfidenz < 0.75→ Lookupkunden.standard_legierungueberkunde_id, bei Matchquelle='kunden-stamm', konfidenz=0.90setzen
Die 3 Code-Anpassungen (Marvin, Phase B)
Nach Klaerung der 2 Alex-Fragen mache ich diese drei Anpassungen selbst:
-
Selbstkosten-Basis um LME erweitern.
step07a-aufwandsaufschlag.ts:191undstep07-marge.ts:13lesen aktuellhkKurzfr + vwVt. WirdhkKurzfr + vwVt + lme. Aufschlag-Wert steigt damit um Faktor ~10. Code-Reference: LME-Position lebt invorgaenger[1].positions.find(p => p.art === 'lme'). -
Maschinen-Kosten als absoluten EUR-Posten.
step03-herstellkosten.tsrechnet 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 mitmenge=null, einzelpreisEur=212, summeEur=212, oder neuer Position-Subtype. -
Neuer Step
step02a-mindermenge.ts. Zwischen Bezugspreis und Herstellkosten. WennmengeKg < 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:
- Die Antwort als Decision-File unter
~/source/bas-twin/projekt/absprachen/entscheidungen/ablegen - Auf der Basis einen
ce:plan-Lauf fuer Phase B starten - 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.
Related
- _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)