vier Achsen auf eine konsolidiert, Aufschluesselung statt drei leerer Dashboards
CEO-Entscheid 2026-08-22 (Kombination B+A). Die drei Achsen brand-mails /
campaign-mails / newsletter-types entfallen; ihre Unterscheidung wandert als
vier Aufschluesselungs-Tabellen IN den einen Trichter mailfunnel-mails.
Warum das ohne Verlust geht: KPIMails fuehrt brand/campaign/newsletter/
newsletterType bereits im Schluessel UND im Rumpf (am Schema geprueft). Die drei
abgeloesten Sammlungen fuehrten zusammen 22.487 Zeilen, von denen genau EINE je
einen Wert trug — ihre Nullen waren wahr, es gab seit 2024-09-12 nichts zu
zaehlen.
Drei Befunde aus dem Bau:
1. Die alte mails-Tabelle gruppierte nach `name`, und mailStats schreibt das Feld
NIE (7/7 missing gemessen). Ausgerechnet die ueberlebende Achse waere eine
einzige Sammelzeile gewesen. Alle vier Tabellen loesen ihre Bezugs-Kennung
jetzt per $lookup auf _id auf — die Bauform, die der Aggregations-Dienst
ausdruecklich zulaesst (Primaerschluessel-Join, pipelineValidator.ts:100-106).
2. Ein additiver Seeder entfernt nichts: eine gestrichene Achse verschwindet aus
dem Code, nicht aus dem Katalog. Beide Seeder haben deshalb eine Aufraeum-Stufe
(deleteMany, doppelt eingegrenzt auf seedSource UND Slug-Praefix).
Der Schnitt ist ein PRAEFIX-Vergleich, kein Teilstring — sonst loeschte er
mailfunnel-mails-table-newsletter-type gleich mit.
3. Die Geometrie trug nur EINE Tabelle: alle vier haetten dieselbe y bekommen und
sich ueberlappt. Jede Tabelle hat jetzt ihre eigene Zeile.
Riegel ergaenzt: Aufraeum-Schnitt mit Negativ-Kontrolle, _id-Join je Tabelle,
vier verschiedene Dimensionen, vier verschiedene y-Werte. deleteMany im Mock
(ohne ihn haette der never-throw-Seeder die Stufe still verschluckt).
37 Proben gruen; volle Reihe 492/493 (der eine ist ein pushdeliveries-Timeout
ohne Bezug zu dieser Aenderung).
campaign-mails / newsletter-types entfallen; ihre Unterscheidung wandert als
vier Aufschluesselungs-Tabellen IN den einen Trichter mailfunnel-mails.
Warum das ohne Verlust geht: KPIMails fuehrt brand/campaign/newsletter/
newsletterType bereits im Schluessel UND im Rumpf (am Schema geprueft). Die drei
abgeloesten Sammlungen fuehrten zusammen 22.487 Zeilen, von denen genau EINE je
einen Wert trug — ihre Nullen waren wahr, es gab seit 2024-09-12 nichts zu
zaehlen.
Drei Befunde aus dem Bau:
1. Die alte mails-Tabelle gruppierte nach `name`, und mailStats schreibt das Feld
NIE (7/7 missing gemessen). Ausgerechnet die ueberlebende Achse waere eine
einzige Sammelzeile gewesen. Alle vier Tabellen loesen ihre Bezugs-Kennung
jetzt per $lookup auf _id auf — die Bauform, die der Aggregations-Dienst
ausdruecklich zulaesst (Primaerschluessel-Join, pipelineValidator.ts:100-106).
2. Ein additiver Seeder entfernt nichts: eine gestrichene Achse verschwindet aus
dem Code, nicht aus dem Katalog. Beide Seeder haben deshalb eine Aufraeum-Stufe
(deleteMany, doppelt eingegrenzt auf seedSource UND Slug-Praefix).
Der Schnitt ist ein PRAEFIX-Vergleich, kein Teilstring — sonst loeschte er
mailfunnel-mails-table-newsletter-type gleich mit.
3. Die Geometrie trug nur EINE Tabelle: alle vier haetten dieselbe y bekommen und
sich ueberlappt. Jede Tabelle hat jetzt ihre eigene Zeile.
Riegel ergaenzt: Aufraeum-Schnitt mit Negativ-Kontrolle, _id-Join je Tabelle,
vier verschiedene Dimensionen, vier verschiedene y-Werte. deleteMany im Mock
(ohne ihn haette der never-throw-Seeder die Stufe still verschluckt).
37 Proben gruen; volle Reihe 492/493 (der eine ist ein pushdeliveries-Timeout
ohne Bezug zu dieser Aenderung).