aYOUne

Changelog

What changed — grouped by release, filterable by component and repository.

Other changes 1
New crm

Codegen-Nachzug — Suchfelder, 4xx-Klassifikation, Mengen-Rechte; 15 Charakterisierungs-Proben umgekehrt

Voller Modul-Lauf `codegen routes --module crm`. Der Lauf zieht DREI angesammelte
Vorlagen-Fixe nach, die crm im Feldzug `codegen-suchfelder-vorlage-ohne-konsumenten-nachzug`
(11 Module / 472 Handler) ausgelassen hat:

1. Freitext-Suche liest `searchableFields` statt hartkodiert name/title/subject.
Fuer Consumers heisst das first_name|last_name|email|phone|company — KEIN
Consumer-Dokument traegt ein `name`-Feld, `GET /consumers?q=` fand also niemanden.
2. Lese-Vorlagen klassifizieren Aufrufer-Fehler als 4xx statt pauschal 500 und
protokollieren sie als `warn` statt `error`.
3. 19 Router: `PUT /many` prueft `edit` ODER `massEdit` statt `.new` (Korrektur —
eine Mengen-AENDERUNG verlangte bis hierher das ANLEGE-Recht), `DELETE /many`
prueft `delete` ODER `massDelete` (rein additiv).

15 Charakterisierungs-Proben umgekehrt, je mit Begruendung im Quelltext, WAS sich
geaendert hat und WARUM die alte Erwartung die defekte war. Sechs Negativ-Kontrollen
ergaenzt, damit der 4xx-Zweig nicht mit einem pauschalen 4xx trivial erfuellbar ist.

BEFUND, der ueber den Nachzug hinausgeht — routerConsumersCollectionActions.ts:
Die Datei war hand-geschrieben OHNE Haertungs-Marker und wurde vom Lauf ueberschrieben.
Uebernommen sind zwei echte Behebungen, eine dritte Aenderung ist zurueckgenommen:

- UEBERNOMMEN: die zehn `collection`-Aktionen verlangten `crm.consumers.<name>` ohne
das Segment `.actions.`. `registerModuleRights` seedet ausschliesslich
`crm.consumers.actions.<name>` — die alte Zeichenkette wurde NIE vergeben. Dieselbe
Fehlerklasse wie die 19 Routen aus §3 des Feldzug-Handoffs.
- UEBERNOMMEN: der Sammel-Router war im Eltern-Router GAR NICHT eingehaengt
(routerConsumers.ts kannte nur `/:id/actions`) — die zehn Wege waren toter Code
hinter einem toten Recht. Jetzt unter `/actions` eingehaengt, VOR den CRUD-Wegen.
- ZURUECKGENOMMEN + gehaertet: der Lauf haengte zusaetzlich die SECHS
`availability: 'both'`-Aktionen dort ein (archive, ignore-in-merge, blacklist,
add-to-list, assign-segment, export). Alle sechs Ruempfe lesen `req.params.id` und
schreiben mit `{_id: entityId, _customerID}`. An der Sammel-Adresse ist entityId
`undefined`, und Mongoose ENTFERNT einen undefined-Wert aus dem Filter (an mongoose
8.24.4 gemessen: `{_id: undefined, _customerID: X}` castet zu `{_customerID: X}`) —
der Schreibvorgang traefe einen BELIEBIGEN Datensatz des Mandanten, ohne Fehler.
Haertungs-Marker gesetzt, der Waechter meldet die Datei ab jetzt statt sie zu
ueberschreiben (3 -> 4 gehaertete Dateien im Modul).

Verify: 1864/1864 Proben in 106/106 Reihen (Vorher-Wert 1858/1858, +6 Negativ-Kontrollen),
tsc Exit 0, zweiter und dritter Erzeuger-Lauf idempotent (0 Abweichungen, mit
Positiv-Kontrolle), die zehn hand-verdrahteten Aktions-Routen in
routerConsumersActions.ts unveraendert vorhanden.

Brief: crm-api-codegen-nachzug-und-charakterisierungs-proben