Releases
Überblick
Diese Auslieferung trägt die Version 0.6.30.
Das System, jedes Plugin und der Plugin-Vertrag (SPI) haben getrennte Versions-Achsen — eine Änderung an einem Plugin hebt nicht die System-Version, und ein Vertrags-Bruch hebt keine von beiden. Jede Achse führt ihr eigenes Änderungsprotokoll und zählt nach SemVer: MAJOR für einen Bruch, MINOR für eine neue abwärtskompatible Fähigkeit, PATCH für eine Behebung.
Warum drei Achsen und nicht eine: Ein System aus mehreren Dutzend Modulen trüge sonst eine Zahl, die nichts aussagt. Sie änderte sich, weil in einem Modul ein Tippfehler behoben wurde — und niemand könnte ihr ansehen, ob ein Update lohnt. Getrennt beantwortet jede Zahl genau eine Frage: was hat sich im Kern geändert, was in diesem Modul, und trägt der Plugin-Vertrag noch.
Für Fremd-Plugins zählt die SPI-Version: Solange ihre MAJOR-Stelle steht, läuft jedes Plugin weiter, das dagegen gebaut wurde. Ein MAJOR-Bump benennt in seinem eigenen Eintrag, was ein Plugin tun muss.
Die letzten Auslieferungen
Aus dem Änderungsprotokoll des Kerns, ungekürzt übernommen.
0.6.30 — 2026-09-14
Fixed
- **Die Pruefstrecke lief erstmals seit Juni wieder — und fand zwei Dinge, die nur dort sichtbar
0.6.29 — 2026-09-14
Added
- Loeschpause im Sicherungsfenster (Umsetzungsverifikation
MU-01):deploy/backup.shlegt vor dem - Frühestmöglicher SEPA-Einzugstag im Lesepfad (Befund
SESS-R48-SEPA-FRUEHESTER-TAG-OHNE-MASKE-01): StockUnitRelocationInterface(SPI 3.27, BefundSESS-R48-UMLAGERUNG-OHNE-EINHEITEN-01):- Der Nachtlauf meldet, wenn die blockierende Pruefstrecke nicht laeuft
Fixed
- Die Belegart gehoert in den Vorlagen-Aufloeser (Befund
SESS-R48-VORLAGENAUFLOESER-OHNE-BELEGART-01): - Der Transaktions-Laeufer setzt den EntityManager bei JEDER Ausnahme zurueck
- Ein entfallener Prompt-Abschnitt laesst keine Leerzeilen stehen
0.6.28 — 2026-09-14
Changed
- Das Zeitbudget der Zeichenflaeche misst die Zeichenflaeche statt der Maschine
0.6.27 — 2026-09-13
Changed
- Eine Bedingung in unbekannter Form SPERRT jetzt, statt als erfuellt zu gelten
Added
- Die Kunden-Zusammenfuehrung ist vollstaendig entschieden (
SESS-R48-KUNDENMERGE-32-STELLEN-01,
0.6.26 — 2026-09-12
Added
- Gespeicherte Ansichten lassen sich mit ganzen Teams teilen (
R48-166): Der Empfaengerkreis kannte nur einzelne Nutzer — ein Team von zwoelf Leuten musste zwoelfmal einzeln benannt werden, und jeder Neuzugang blieb aussen vor. Die neue Team-Achse wirkt als ODER neben der Nutzer-Liste und ist im Teilen-Dialog waehlbar, nicht nur ueber API und KI-Schnittstelle. - Konsignationsbestand laesst sich als abgerechnet melden (
R48-045): Der Verbrauch fremder Ware wurde erfasst, aber es gab keinen Weg, ihn nach der Lieferanten-Rechnung abzuhaken — auch nicht als Automatisierungs-Schritt. - Die vier Abnahme-Zusagen aus Programm 47 §6.3 werden als KETTE geprueft, nicht mehr nur in Einzelteilen: Newsletter mit Slots UND Split-Test an einem Lauf (einschliesslich des Wartezustands, den bisher kein Test gegen einen echten Lauf beobachtet hat), dieselbe Kampagne einmal ueber den Reaktions- und einmal ueber den Zeitablauf-Pfad, ein wartender Lauf erreicht die nach seinem Anhalten angehaengte Nachricht, und ein Beitrag an drei Social-Ziele — dass ein fehlgeschlagenes Ziel die anderen nicht mitreisst, steht jetzt in der blockierenden Pruefstrecke statt nur im Durchklick.
- Das Zusammenlegen zweier Ansprechpartner ist abfangbar und sichtbar (
R48-054Nachlauf,SESS-R48-KONTAKTMERGE-VETO-01): Neue EreignisseContactMerging(Einspruch vor der Zusammenfuehrung) undContactMerged(Meldung danach), Plugin-Vertrag 3.25. Fuer Kunden gab es beides seit Monaten, fuer Kontakte nichts — derselbe Vorgang mit denselben nicht umziehbaren Verweisen, nur ohne Einspruchsmoeglichkeit. - Drei Katalog-Zustaende kommen in den Beispieldaten vor (
SESS-R48-DEMO-ZUSTAENDE-01): Projektrollen Pruefer und Beobachter, ein abgeloestes Angebot samt Neufassung. Fuer die Incoterms bleibt es bewusst beim Katalog — eine aussen festgelegte Code-Liste ist kein Zustand eines Geschaeftsobjekts, und elf Demo-Lieferanten waeren Erfindung statt Beispiel.
Changed
- Der Projekt-Zeitstrahl merkt sich zugeklappte Gruppen (
R48-165): Jedes Neuladen klappte alles wieder auf. Gruppen lassen sich jetzt einzeln und ueber einen tastaturbedienbaren Knopf gesammelt zuklappen, und der Zustand ueberlebt das Neuladen. - Die Kalenderansicht steht an der Stelle, die das Dokument nennt (
R48-129), und der Kalender-Vertrag deckt die dokumentierte Verfuegbarkeits-Abfrage ab (R48-133) — zwei Dokumente fuehrten sie mit Signatur, im Vertrag gab es sie nicht. - Der Backend-Baustein-Katalog kennt die Marken-Bildmarke (
SESS-R48-BRANDASSET-UNKATALOGISIERT-01): drei Verbraucher nutzten sie bereits, der Katalog fuehrte sie nicht — und was der Katalog nicht nennt, wird nachgebaut.
Fixed
- Das Stornieren eines Versand-Etiketts ist erreichbar (
R48-037): in neun Dienstleister-Anbindungen gebaut, teils mit echtem Aufruf beim Anbieter — und von nirgends im Programm aufrufbar. Ein Etikett liess sich erzeugen, aber nicht zurueckziehen. - Das maximale Paketgewicht je Dienstleister wird gelesen (
R48-042): sechs Anbindungen pflegten den Wert, gelesen hat ihn nur ein Test. Ein zu schweres Paket fiel erst beim Anbieter durch, nach der Buchung. - Keine freien Status- und Prioritaets-Literale mehr in den Anlege-Pfaden der Vorgangsseite (
R48-068): drei Stellen setzten „offen“ und „normal“ als Text, obwohl der Katalog in derselben Datei bereitstand. Wer die Katalogwerte umbenennt, bekam stumm ungueltige Vorgaenge. - Die Abschalt-Automatik nach mehreren Fehllaeufen hat eine Rueckfallsperre (
R48-080) und der Bestaetigungstext nennt nachweislich Feldname und neuen Wert (R48-081): beide Zusagen standen in der Dokumentation mit einem Test-Namen daneben, der sie nicht abdeckte. - Ein live ausgeloestes Einspruchs-Ereignis fehlt nicht mehr in der Schnittstellen-Registrierung (
R48-083): geprueft wurde bis dahin nur Registrierung gegen Dokumentation und umgekehrt — die Richtung „gibt es im Code ein Ereignis, das nirgends gelistet ist“ fehlte ganz. - Ein optionaler Abschnitt einer KI-Anweisung geht bei leerem Wert nicht mehr als Rahmensatz ohne Inhalt hinaus (
SESS-R48-ABSCHNITT-LEERWERT-01): „Orientiere dich an frueheren Entscheidungen:“ mit nichts dahinter ist eine Anweisung ins Leere. Zwei Sitzungen derselben Runde hatten hier aneinander vorbei gebaut. - Eine Knopf-Attrappe loeste jeden Klick zweimal aus (
SESS-R48-ATTRAPPE-DOPPELKLICK-01) und liess einen einwandfreien Baustein fehlerhaft aussehen — der Test mass seine eigene Attrappe. - Ein Kommentar behauptete eine serverseitige Preispruefung, die es bewusst nicht gibt (
SESS-R48-PREISHOHEIT-01): ein Beleg ist verhandelbar, und wer ihn schreiben darf, darf auch den Preis setzen. Die falsche Zusicherung ist raus. - Vier Plugin-Vertraege dieser Runde standen in keiner Vertrags-Tabelle (
SESS-R48-SPI-DREI-VERTRAEGE-UNGELISTET-01) und das ausgelieferte Entwickler-Paket stand zwei Vertragsversionen hinter dem Kern (SESS-R48-SDK-PAKET-DRIFT-01): ein Fremd-Plugin kann nur erfuellen, was es sieht — und baut sonst nach, was es schon gibt. - Der Test ueber die Operationszahlen hat seit je nichts gelesen (
SESS-R48-OPSZAHL-SCAN-LEER-01): der Ausschluss der erzeugten Verzeichnisse lief gegen den absoluten Pfad und warf im Container jede Datei weg — 0 gelesene Dateien, wo 29 Nennungen stehen. Aufgedeckt hat es der eigene Selbsttest des Tests, genau wofuer es ihn gibt. - 30 behobene Befunde standen in keinem Changelog (
SESS-R48-CHANGELOG-SPUR-30-01) und waren damit rueckbaubar, ohne dass etwas rot wird. - Das erwartete Abschlussdatum eines Interessenten ist ein Berliner Kalendertag (
SESS-R48-LEAD-ABSCHLUSSTAG-01): mit Zeitversatz gesendet landete der 1. September als 31. August — und wanderte so auch in den daraus erzeugten Deal. - Die Projekt-Zeilen der Planer-Zeitachse sind sprachrichtig sortiert (
SESS-R48-PLANER-SORTIERUNG-01): ein Projektname mit Umlaut stand hinter jedem anderen. - Tages-Anker kommen aus dem Geschaeftstag statt aus der Serveruhr (
SESS-R48-TAGESANKER-SERVERUHR-01): das Fenster des DATEV-Belegpakets holte Jahr und Belegdatum aus verschiedenen Quellen und waere in der Neujahrsnacht zwei Stunden lang auseinandergefallen. - Die Brutto-Erkennung des Belegsummen-Tests trifft nur noch Belegsummen (
SESS-R48-BRUTTOMUSTER-ZU-BREIT-01): ein prozentualer Zuschlag auf eine MENGE (Bedarfsprognose des Einkaufs) galt ihr als zweite Belegsummen-Wahrheit und haette die Bestandsliste mit Fremdkoerpern gefuellt. - Der Zeitplan-Test las einen Satz aus einem Kommentar als Zeitplan (
SESS-R48-ZEITPLAN-WAECHTER-LAS-PROSA-01): er meldete vier fehlende Verbraucher fuer einen nie gebauten Plan und pruefte deshalb den einzigen echten gar nicht. - Der Baustein-Anbieter der Passwort-Tuer laeuft durch die Wurzelklassen-Pruefung (
SESS-R48-ARCH-BAUSTEIN-ANBIETER-UNGEPRUEFT-01): seine Bausteine waren von der Zusage still ausgenommen. - 18 schreibbare Felder dieser Runde standen in keiner Handbuch-Seite (
SESS-R48-HANDBUCH-18-FELDER-VERSCHWIEGEN-01); Felder ohne eigene Maske stehen jetzt in einer eigenen Tabelle „Nur ueber Schnittstelle und Automation“. Mitbehoben: die Zeit-Berichte-Seite behauptete weiter „geteilt heisst lesbar, nicht aenderbar“ — seit der Rechtestufe zum Aendern falsch. - Die Klartext-Anzeige einer Bedingung beschoenigt nichts mehr (
SESS-R48-BEDINGUNGS-ANZEIGE-BESCHOENIGT-01): Sie verstand eine Form, die die Regel-Engine nie auswertet, und setzte daraus einen fehlerfreien Satz — genau deshalb sah eine wirkungslose Verzweigung zehn Tage lang plausibel aus. Jetzt bleibt sie leer, wo die Engine nichts liest. - Ein Bedingungsbaum in unbekannter Form wird beim Speichern abgewiesen (
SESS-R48-BEDINGUNG-UNBEKANNT-IST-WAHR-01): Die Regel-Engine behandelt Unbekanntes als „nicht blockieren“, also erfuellt — und die Schreib-Grenze prueft bis dahin nur „nicht leer“. Beides zusammen heisst: ein Baum, den niemand auswertet, wird gespeichert und macht die Bedingung dauerhaft wahr. Genau so ist eine Kampagnen-Verzweigung zehn Tage lang immer den Ja-Pfad gegangen. Die Grenze laesst jetzt genau durch, was die Engine liest — in allen drei Baeumen (Ausloeser, Verzweigung, Schritt). - Der Mitschreib-Dienst endet nicht mehr still, wenn ungesicherte Aenderungen offen sind (
SESS-COLLAB-ABGEBROCHEN-01): Die Fristen der Abschaltung liefen auf Zeitgebern, die den Prozess NICHT wach halten. Hing eine Sicherung und war sonst nichts mehr offen — der Normalfall, sobald der Dienst seine Verbindungen geschlossen hat —, beendete sich der Prozess wortlos mit Erfolgs-Code, ohne die zugesagte Verlustmeldung. Ungesicherte Dokument-Aenderungen gingen als sauberer Stop durch. Aufgefallen ist es nur, weil drei Tests abbrachen: der Testlauf meldete „0 fehlgeschlagen“ und endete trotzdem mit Fehler-Code. - 31 in Planungsdokumenten genannte Absicherungen hatten weder Datei noch Klasse (
SESS-R48-DOKU-NENNT-WAECHTER-OHNE-DATEI-01): 13 hiessen nur anders, 9 waren vom Dokument selbst schon als entfallen gekennzeichnet — und 9 Zusagen waren tatsaechlich voellig ungeprueft. Alle neun sind jetzt gebaut. Ein neuer Test haelt jede Nennung gegen den Testbestand; fuer Changelogs gab es diese Pruefung seit einem Jahr, nur griff sie bei Pfad-Angaben und nicht bei nackten Klassennamen. - Die Brutto-Erkennung sieht auch die Aufruf-Schreibweise derselben Formel (
SESS-R48-STEUERMUSTER-BLINDER-FLECK-01): Die Zeichenklasse kannte keine Klammern, eine Steuerrechnung mit Methodenaufruf blieb also ungesehen. Gemessen: die Schaerfung bringt keine neue Datei in die Bestandsliste. - Der Test ueber die Ausgangs-Naht misst den Quelltext statt den Rohtext (
SESS-R48-OUTBOUND-WAECHTER-LIEST-KOMMENTARE-01): Eine blosse Erwaehnung im Kommentar galt als Umgehung. Gemessen vor der Umstellung: von 41 Treffern sind drei Kommentare, und genau einer betraf eine Bestandszeile — am Code nachgewiesen, dass dort kein Draht mehr steht, Liste 30 auf 29. - Die Groessen-Ratsche hat einen erlaubten Weg, ihre Zahl zu senken (
SESS-R48-GROESSEN-BASELINE-OHNE-SCHREIBWEG-01): Die einzige zulaessige Bewegung — das Absenken nach einem Schnitt — war nur an der Schutzsperre vorbei moeglich, weil es dafuer kein Werkzeug gab. Eine Sperre ohne Ausgang erzieht zur Umgehung. Der Integritaets-Test ueber alle Ratschen kannte diese Bauform ausserdem gar nicht und hat jetzt eine eigene Kategorie fuer sie. - Berichts-PDF und Listen-Export folgen der Sprache des Empfaengers (
SESS-R48-PDF-SPRACHE-01): Die Sprache reist jetzt IM Ergebnis mit, statt aus der Umgebung geraten zu werden — im Zeitplan-Arbeiter gibt es keine Anfrage, aus der man sie ableiten koennte. Ein geplanter Bericht an einen englischsprachigen Empfaenger kam bis dahin deutsch an, durchgaengig bis in Spaltenkoepfe, Zeitraum und Datumsformat. Haben die Empfaenger verschiedene Sprachen, gilt bewusst der System-Standard — eine Datei kann nicht zwei Sprachen haben. - Der Listen-Export traegt den Briefkopf der Marke, auf die die Liste geschnitten ist (
SESS-R48-LISTENEXPORT-MARKE-01); ohne Marken-Filter bewusst keinen. - Vier Deal-Kennzahlen und die Team-Achse hatten in KEINER Sprache eine Beschriftung (
SESS-R48-KENNZAHL-LABEL-01) und erschienen dadurch auch auf Englisch deutsch. Die Messung war zu milde: es fehlte nicht nur die Sperre, es fehlten die Beschriftungen selbst. - Der Grabstein eines deinstallierten Plugins trifft auch Anbieter, die sich anders nennen als ihr Paket (
SESS-R48-PROVIDER-FAILOPEN-01): Bisher entschied die Selbstauskunft des Anbieters, jetzt das Eigentum am Code. Modul-Flags sperren im Zweifel — eine Selbstauskunft kann das nicht halten. - Vier in dieser Runde neu geschriebene Absicherungen waren nie ausgefuehrt worden (
SESS-R48-WAECHTER-NIE-AUSGEFUEHRT-01) und enthielten Fehler in ihrer eigenen Vorrichtung — eine fehlende Datensatz-Kennung, ein Pflichtfeld ohne Wert, ein Zugriff auf eine private Konstante, ein sich selbst widersprechendes Format-Literal. Keine von ihnen konnte je gruen gewesen sein. Das ist derselbe Riss wie der Kernbefund dieser Runde, nur eine Ebene tiefer: eine Zusicherung, die nie gelaufen ist, sichert nichts zu. - Eine Quelle ohne Laeger nimmt keine lagerbezogene Buchung mehr an (
SESS-R48-EINLAGERQUELLE-NIMMT-LAGERBUCHUNG-01): Der Vertrag sagt, die Ein-Lager-Quelle ignoriere die Lager-Felder — gemeint war der Normalfall ohne Mehrlager. Eine Buchung, die ein Lager AUSDRUECKLICH benennt, lief dadurch in den falschen Topf, ohne jede Meldung. Die beiden Buecher sind Alternativen, nie zwei Haelften derselben Wahrheit. - Ein Listen-Zugriff im Test ohne das richtige Antwortformat las still eine leere Menge (
SESS-R48-COLLECTION-LEER-GELESEN-01): Der Fehler faellt in die gefaehrliche Richtung — eine Zusicherung „diese Zeile ist nicht dabei“ wird von einer leeren Menge bestaetigt, und genau das sind Marken- und Sichtbarkeits-Schnitte. Ein neuer Test haelt jede Stelle gegen die drei zulaessigen Formen. - Englische Beschriftungen fuer drei Rechte ergaenzt (
purchasing.order.confirm, - Anbieter eines deinstallierten Moduls konnte dem Grabstein entkommen (
SESS-R48-PROVIDER-FAILOPEN-01): - Eine Browser-Probe verwendete ein ABGESCHALTETES Demo-Ziel wieder und pruefte danach nichts
Removed
- Vier tote Sprachschluessel (
R48-149), die einen KI-Anwendungsfall beschreiben, den es bewusst nicht gibt. - Drei Fehlermeldungen des Versandlauf-Schreibwegs (
SESS-R48-TOTE-FEHLERSCHLUESSEL-01): der Weg antwortet seit dieser Runde mit „nicht mehr verfuegbar“, die Meldungen waren unerreichbar.
0.6.25 — 2026-09-11
Security
- Papierkorb, Dubletten-Listen und Suche kennen die Sichtbarkeits-Regel (Befunde
R48-014,R48-015,R48-016): Der Papierkorb schnitt nur an Recht und Marke — jeder Vertriebsmitarbeiter sah und restaurierte fremde geloeschte Interessenten. Die Dubletten-Finder lasen die ganze Tabelle roh, ohne Nutzer, Marke oder Inhaber. Und fuer Kunde und Kontakt fehlte die dritte Schicht: Suche und KI-Kontext reichten Treffer durch, die Liste und Einzelabruf laengst verbergen. - Private Projekte schneiden ihre Aufgaben (
R48-017): Die Vorgangsliste zog vier Schnitte — Marke, Externe, Team, private Einzelaufgaben — aber keinen fuer Projekte. Eine Abfrage mit der Kennung eines privaten Projekts lieferte Titel, Zustaendige und Termine an jeden Marken-Kollegen. - Geheime Termintypen tragen ein Link-Geheimnis (
R48-064): „geheim" hiess bisher nur „nicht gelistet" — die Adresse war frei waehlbar und ohne Token abrufbar. - Ein Freifeld-Ziel fuer Nutzer (
R48-124) und das Recht zum manuellen Start einer Automatisierung haengt an der Projektleitung (R48-135) — vorher sah den Knopf nach dem Seed ausschliesslich die Geschaeftsfuehrung.
Added
- Drei Auswertungs-Achsen im Kennzahl-Kern (
R48-025,R48-093,R48-027): Akquise-Quelle, Vertriebsweg und Taetigkeit. Alle drei waren erfassbar und nirgends auswertbar. - Belegvorlagen kennen ihre Zielgruppe (
R48-012): neuer Kern-SeamDocumentAudiencemit getaggtem Anbieter — bisher uebergab kein einziger Beleg-Erzeuger Kundengruppe oder Vertriebsweg, eine Haendler-Vorlage konnte also nie gewinnen. - Zweiter Empfaengerkreis und Projekt-Termine im Wochenbericht (
R48-062), Checkliste zu Unteraufgabe als eine Operation (R48-063), echter Delta-Abgleich der Kalender (R48-065). - Aufbewahrungsfrist je Ankerart (
R48-105): Buchungsbelege tragen acht statt zehn Jahre (Viertes Buerokratieentlastungsgesetz, ab 1.1.2025). Kunden blieben bisher zwei Jahre laenger gesperrt statt geloescht.
Changed
- KI-Anweisungen loesen ihre Sprache auf (
R48-020,R48-079): Anfrage, dann Nutzer, dann Deutsch — statt fest deutsch. Die englische Haelfte der Bibliothek war bis dahin toter Bestand. Sicherheitsrahmen, Werkzeug-Beschreibungen und der Delegations-Prompt sind zweisprachig. - Meilenstein-Farbe wirkt auch am Bildschirm (
R48-130), Demo-Daten tragen Termine, eine private Aufgabe und eine Reaktion (R48-134) — eine Demo-Anlage erzeugte bisher null Faelligkeits-Meldungen.
Fixed
- Rueckfallsperren, die ihre eigene Zusage nicht abdeckten (
R48-021,R48-038,R48-050,R48-082,R48-087,R48-090,R48-091,R48-116,R48-117,R48-126,R48-158,R48-160): Das ist die zentrale Lehre der Runde. 21 Zeilen der Vorrunde trugen nicht, weil der Pruftest gegen den gebauten Ausschnitt geschrieben war statt gegen die formulierte Zusage — elf Tests zementierten dadurch genau die Luecke, die sie schliessen sollten. Neu unter anderem: das Loeschen von Modul-Daten wird erstmals wirklich ausgefuehrt (R48-022), kein blockierender CI-Schritt entkommt dem Gate mehr, und eine blosse Namensnennung gilt im Betriebs-Inventar nicht mehr als Beweis. - Der Rechnungsabgleich nimmt eine bestaetigte Bestellung an (
R48-044) und die Leermengen-Regel gilt auch im Rumpf von Schleife und Verzweigung (R48-053).
0.6.24 — 2026-09-11
Security
- Kontakt-Abgleich schneidet am Kontakt-Recht je Marke, nicht an der Marke der Verbindung (Befund
SESS-KONTAKTABGLEICH-MARKE-01): Mit Richtung „nur schreiben"/„beides" schob eine markenlose Verbindung bisher die Kontakte ALLER Marken in das persönliche Google-/Microsoft-Adressbuch des Besitzers; der Eingang änderte spiegelbildlich Kontakte fremder Marken.ContactSyncServicelöst jetzt den Besitzer auf (ohne ihn läuft nichts) und schneidet Aus- und Eingang überPermissionBrandScope::brandsWithAnyFor()ancontact.readbzw.contact.update/contact.create— eine Verbindung mit Marke verlangt das Recht genau dort.
Fixed
- Postfach-Texte sagen, was wirklich passiert (ENT-CRM-MAIL-01): Kachel und Untertitel „Mein Postfach" behaupten nicht mehr, eingehende Mails erschienen automatisch — zugeordnet wird sofort nur bei eindeutigem Treffer, sonst wartet die Mail in den Mail-Zuordnungen (de/en, Handbuch-Seite
crm/mailboxmitgezogen).errors.crm.mailAssignmentTargetInvalidfolgt wieder dem Hausstil (Sie-Form, Umlaute). - Wächter sieht camelCase-Setting-Schlüssel (Befund
SESS-SETTING-UNGESEEDET-01):SettingKeyCatalogCoverageTestprüfte nur durchgehend kleingeschriebene Schlüssel; vier Schlüssel (finance.billing.handoffTarget,finance.billing.previewReminderDays,marketing.bounce.softThreshold,marketing.doi.ttlDays) fielen damit aus dem Katalog-Abgleich — sie sind geseedet, belegt war es nicht. - Nächtliche Prüfung holt das Doku-Submodul mit dem Doku-Schlüssel (Befund
SESS-CI-DOKU-SUBMODUL-01, 06 R39 Nachtrag Nr. 108):ci.ymlundnightly.ymlnutzen die gemeinsame Aktion.github/actions/doku-submodulstattsubmodules: true— der Standard-Token darf das private Doku-Repo nicht lesen.
0.6.23 — 2026-09-11
Added
- Mehrfachauswahl im Einstellungs-Baustein (06 R39 Nachtrag Nr. 104):
ConfigCrudPagekennt den Feldtypmultiselect— Auswahlliste mit Suche, Wert = Liste der gewählten Werte; erster Nutzer: die Länder der Versandregeln. - Update-Protokoll zeigt die Warnungen ALLER Schritte (06 R39 Nachtrag Nr. 95):
SystemUpdateJobStorehält die Ausgabe je Warn-/Fehl-Schritt (steps[].outputanGET /v1/system/update/jobs/{jobId}), die Update-Seite listet sie gesammelt unter „Hinweise der Schritte" — auch nach Erfolg. Ein späterer warnender Schritt (mcp-export,stop-workers) verdeckt den Einrichtungs-Hinweis ausnoticesnicht mehr;outputTailbleibt der jüngste (Rückwärtsvertrag). - Positions-Editor: Slots je Artikelzeile (
LineItemsEditor#line-badges,#line-details, 06 R39 Nachtrag Nr. 81) — beleg-eigene Kennzeichen und Felder, z. B. der Artikelzustand am Auftrag. - Einmaliger, gezielter Rechte-Entzug beim Update (06 R39 Nachtrag Nr. 67, Befund
SESS-RECHTE-EINMALENTZUG-01):PermissionCatalog::ONE_TIME_REVOCATIONS+app:auth:sync-permissionsentziehen je Eintrag GENAU EINMAL (Merker in eigener Tabelleauth_permission_revocation, bewusst nicht in den Einstellungen — dort ließe er sich leeren, und der Entzug liefe erneut); erster Eintrag:sales.order.write_protectan der Rolle Vertrieb. Vergibt der Admin das Recht später wieder, bleibt es. - Ein Weg zum Löschen einer DMS-Datei (06 R39 Nachtrag Nr. 88):
App\Platform\File\Service\FileDeletion::delete()— VetoFileDeleting, Soft-Delete,FileDeleted, Bytes freigeben; die Datei-Operation und Fach-Folgelöschungen nutzen denselben Baustein. - Einrichtungs-Hinweise im Update-Protokoll (06 R39 Nachtrag Nr. 68): neuer optionaler Update-Schritt
notices(app:update:notices) sammelt über den neuen SPI-VertragUpdateNoticeProviderInterface(SPI 3.23, experimentell, Tagapp.update.notice_provider) die Hinweise aktiver Plugins; ein Hinweis macht den Schritt zur Warnung mit Text im Protokoll, das Update läuft weiter. - Vorabprüfung des Altersnachweises (06 R39 Nachtrag Nr. 70/72): neuer SPI-Vertrag
AgeVerificationPrecheckInterface(SPI 3.23, experimentell, optionale Fähigkeit des Carrier-Adapters) — der Versandprozess fragt VOR der Buchung, ob die gewählte Versandart das Alter in der nötigen Stufe prüfen kann. - Zahlungsreferenz als eigenes Feld der Bankanbindung (06 R39 Nachtrag Nr. 77):
BankTransactionRecord::$paymentReference(SPI 3.23, rein additiv) — ein Bank-Anschluss liefert die QR-Referenz/SCOR eigens statt nur im Verwendungszweck. - Plugin-Schnittstelle SPI 3.23 (additiv): Artikelzustand am Bestand (
StockOperation::$condition, - Wiedervorlage am Beleg und am Kunden (Befund
R47-165, Teil a): Vorgänge tragen eine - EIN Beleg-Textbaustein-Katalog im Commerce-Kernel (Befund
R47-164): - MRN-Prüfung an einer Stelle (Befund
R47-165, Teil c):App\Platform\Commerce\Customs\ExportMrn - Altersgrenze im Artikel-Vertrag (Befund
R47-165, Teil e):ProductReference::$minimumAge - Gemeinsame Lauf-Uebersicht statt toter Kopplung (Befund
R47-123, ENT-AIW-11):GET /v1/runs - Waechter
WiderlegteDokuAussageTest— die 18 Doku-Befunde der Runde R47 (R47-008,-013, DocsReferenceIntegrityTestliest aufsteigende Verweise (../../src/…) und fuehrt vier- Fehlertexte fuer Medienbibliothek, Webschriften und Formular-Anhaenge (Befunde
R47-196, - Neue Waechter zu denselben Befunden:
BuilderStilDetailsTest(Radius je Ecke, - Ausgangsbuch am Beleg, Empfaengerregeln am Kunden, Zielgruppe an der Belegvorlage — drei
- „+ Neu" und ⌘K sind eine Beitrags-Flaeche (Befund
R47-087): neue Manifest-Flaeche - Nightly-Job
builder-vitals(BefundR47-088): Werkzeug, Schwellen und Ratsche der - Persoenliches Postfach kann senden (Befund
R47-022):PersonalMailboxProviderInterfacetraegt - Microsoft-Postfach gebaut statt angeboten (Befund
R47-022):MicrosoftPersonalMailboxProvider - Neuer Kanal
personal_mailbox(Doc 26 1.3): kundengerichtete Mail geht ueber das verbundene - Kontakt-Abgleich mit Google und Microsoft (Befund
R47-187): neuer Kern - Eigene Felder im Import (Befund
R47-019):CustomFieldImportSupportliefert die Freifelder - Projekt-Dateien: alles an einem Ort (Befund
R47-033): der Dateien-Reiter am Projekt lud - Beobachter an Kunde und Ansprechpartner (Befund
R47-189):watcherIdsals USER-Ids am - Sichtbarkeits-Regeln fuer Kunde und Ansprechpartner (Befund
R47-191): neue Zielecustomer - Freifelder je Vertriebsweg und Feld-Leserechte (Befund
R47-194): - Dubletten-Erkennung fuer Ansprechpartner (Befund
R47-026):ContactDuplicateFinder+ - Deal-MRR/-ARR als Kennzahlen (Befund
R47-027):deal_open_mrr,deal_open_arr, - Verweis-Freifelder zeigen den Namen ihres Ziels (Befund
R47-025):/v1/custom-field-values UserIdBrandFilter— wiederverwendbarer Riegel fuer eingehende USER-Id-Listen (Zuweisungen,- Portal-Profil: Sitzungsverwaltung und bestätigter Mailwechsel (Befund
R47-076): - Lokationsnummer und wechselseitige Partnernummern am Geschäftspartner (Befund
R47-163, - Die Tätigkeit am Vorgang (Befund
R47-167):work_item.activity_idals EIGENES Feld neben der - Empfängerkreis und Rechtestufe gespeicherter Ansichten (Befund
R47-171): „geteilt" hiess - Manueller Automations-Auslöser am Vorgang (Befund
R47-046, AP 27:355): das Backend konnte - Privat-Bereich in „Meine Arbeit" (Befund
R47-044, AP 27:352): private Aufgaben liefen create_taskkennt Ziel-Aufgabenliste und Anhänge (BefundR47-173):listId(bei awork der- Projekt-Abschluss im Projekt-Vertrag (
ProjectRef::$closedAt, additiv): die Zeiterfassung - Der Artikel-Vertrag traegt die Verkaufs-Seite (
ProductReference::$ean/$description/$mediaUrls, - Der interne Kostensatz einer Zeitbuchung folgt dem ARBEITSTAG (Befund
R47-070, SPI 3.21): - Ziel-Element in der Automatisierung (Befund
R47-174): neuer Schritttyp - Datums-Anker am Kontakt (Befund
R47-180):ContactDateAnchorProvider - Durchfluss-Begrenzung im Warte-Schritt (Befund
R47-180):config.throttlePerHourdosiert, - Schlagwoerter im Kontakt-Import (Befund
R47-185): Spaltetags(Komma/Semikolon), vergeben - Vorschau je Ausspiel-Ziel (Befund
R47-134): neuer FOUNDATION-BausteinChannelPreviewCard - Schritt einfuegen, ohne umzunummerieren (Befund
R47-136):AutomationStepInsertService AutomationRun::setActiveGoals()— die Positions-Umnummerierung ist der einzige Fall, in dem die- Der Umsatz kommt aus den Rechnungen, die Zeit-Sicht steht daneben (Befunde
R47-064,R47-065): - Kennzahlen des Handels (Befund
R47-155): Lager, Artikel, Auftraege, Einkauf, Kanaele und - Auswertungen lassen sich segmentieren (Befund
R47-186): neue Achsen Inhaber (owner, - Listen-Export als Ausgabeformat der Sammel-Operationen (Befund
R47-086, Programm 21 D3): - Listen-Export an der gespeicherten Ansicht (Befund
R47-169): fuer Aufgaben, Projekte, Nutzer - Demo-Daten zeigen den Marken-Schnitt an allen neun Stammdaten-Wurzeln (Befund
R47-110): - Planaufwand als Kette mit Ebenen — Budget → Liste → Aufgabe → Unteraufgabe (Befund
R47-166): - Fehlertexte der Kontoauszugs-Pruefung und der DATEV-Ausgabewege (Befunde
R47-216, - Belegversand je Kunde und Belegart steuerbar (Befund
R47-160): neue Empfaengerregeln - Belegvorlagen nach Kundengruppe und Vertriebsweg (Befund
R47-153):DocumentTemplate - Das Portal sagt, wenn der Kunde am Zug ist (Befund
R47-083): das Projektdetail des - Durchklick-Spec des Baukasten-Repeaters (Befund
R47-103): - Zwei Kern-Flaechen bekommen ihren Marketing-Beitrag (Befunde
R47-137,R47-181): im - Schweizer QR-Rechnung (Befund
R47-161): BlockqrBillin der Belegvorlagen-Engine setzt Empfangsschein und Zahlteil nach Swiss Payment Standards (Swiss QR Code mit Schweizer Kreuz als Vektor-SVG, QR-IBAN mit QR-Referenz oder IBAN mit SCOR/ohne Referenz, CHF/EUR, Konto in CH/LI) auf eine eigene A4-Seite; neuer BausteinSwissQrBillService(src/Platform/Commerce/Document/SwissQr). Marke fuehrtqrIban+qrBillEnabled(MigrationVersion20260913300000) und ihre Anschrift jetzt ueber die API (addressStreet/-Zip/-City/-Country); aktiver Zahlteil ohne Schweizer Konto oder Anschrift wird mit 422 abgewiesen. Neue Abhaengigkeitbacon/bacon-qr-code3.1 (BSD-2-Clause, ENT-ABH-QR-01). - Geburtsdatum und Anzeige-Zustimmung am Mitarbeiter (Befund
R47-079):birthDate(Pflege mit - Verfahrensdokumentation (GoBD) als Handbuchseite (Befund
R47-229):admin.procedural-documentation - Artikelzustand in der Inventory-SPI (Befund
R47-154):StockOperationtraegt optionalcondition(new|refurbished|used|damaged, ohne Angabe Neuware) — bestehende Aufrufer unveraendert; die Ein-Lager-Quelle ignoriert den Zustand wie Lager/Platz. - Team als Achse im Reporting-Kern und Objekt-Fassung des Team-Schnitts (Befund
R47-168):MetricQuery::DIM_TEAM(Stamm-Team des Mitarbeiters, auch als Drill-down-Eltern),PermissionTeamScope::withinTeamIds()— die Listen-Semantik vonapplyTeamIds()fuer bereits geladene Objekte;HrMetricProviderliefert die verfuegbare Zeit je Team. - Differenzbesteuerung: Aufteilung und Einstand der Einheit (Befund
R47-157):MarginSchemeCalculator::bookingSplit()teilt den Verkaufspreis in Einstand-Anteil und Marge (Summe exakt, Storno spiegelbildlich);StockUnitTrackingRegistry::purchaseAmountFor()fragt den Einstand der konkreten Einheiten über den neuen EXPERIMENTAL-VertragStockUnitCostInterfaceab. RückfallsperreDifferenzbesteuerungAufteilungTest. - QR-Rechnung: Kundennummer der Bank vor der QR-Referenz (Nachtrag R39 Nr. 1): Marke
qrBankCustomerNumber(nur Ziffern, höchstens 12);SwissQrReference::qrReference()setzt sie vor den Belegbezug, Prüfziffer über die ganze Referenz;SwissQrBillService::paymentReferences()liefert dieselbe Bildung für den Zahlungsabgleich. MigrationVersion20260914200000. - Werkbank-Prüfschritt
make pdfa-pruefung(Nachtrag R39 Nr. 6, BefundR47-227): veraPDF 1.30.2 als Werkbank-Werkzeug nach der k6-Regel (scripts/verapdf-holen.sh, gepinnt, Summe aus signaturgeprüftem Bezug), Probe über den echten Belegpfad (scripts/zugferd-probe.php); ohne Java übersprungen statt gescheitert, nicht im Gate.R47-227bleibt offen, bis ein Lauf PDF/A-3b bestätigt. - Werkbank-Prüfschritt
make xrechnung-pruefung(Nachtrag R39 Nr. 5): KoSIT-Validator 1.6.3 + XRechnung-Konfiguration 2026-08-31 (Apache-2.0,scripts/kosit-holen.sh), prüft eine Rechnung und eine Gutschrift ohne Bankverbindung; das Verhalten bei Gutschriften bleibt bis zum ersten Lauf unverändert. - Konfig-Panel als gemeinsamer Beleg-Baustein (Owner-Nachtrag R39 Nr. 9, Befund
R47-152):LineConfigurationPanel(@/sdk, katalogisiert) unter dem Positions-Editor von Angebot und Auftrag, lesend an der Rechnung; Fehlertexteerrors.pos.configurableProductNotSellableunderrors.product.categoryStreamUnknown(de+en). - Einzelpreis einer Konfiguration vom Server (Owner-Nachtrag R39 Nr. 8): das Panel fragt die Vorschau mit Kunde, Marke und Menge und übernimmt den vorgerechneten Einzelpreis (Grundpreis aus der Preis-Engine + Aufpreise).
- Bestand je Artikelzustand im Commerce-Kern (06 R39 Nr. 36–38, Befund
R47-154): additiver VertragStockConditionAvailabilityInterface,InventorySourceRegistry::getAvailability($productId, ?$condition)(ohne Zustand Neuware, Quelle ohne Vertrag fail-closed 0), BewegungsartStockOperation::TYPE_CONDITION_CHANGE; SPI-Registrierung ergaenzt, VERSION-Hebung durch den Owner offen. - Kern-Bausteine der Differenzbesteuerung für Belegrabatt und Gutschrift (Befund
R47-157, Owner-Entscheidung R39 Nr. 27):LineCalculator::documentDiscountShares()(Anteil je Zeile am Belegrabatt, dieselbe Verteilung wiesummarizeWithDocumentDiscount()) undMarginSchemeCalculator::creditPurchaseShare()(Einstand einer Gutschrift: Marge sinkt zuerst). RückfallsperrenDifferenzbesteuerungTest::testEineKorrekturGutschriftMindertZuerstDieMarge,DifferenzbesteuerungBuchungsstapelTest::testDerBelegrabattTrifftAuchDieDifferenzzeilen. - Carrier-Vertrag: Stufe des Altersnachweises (R39 Nr. 23, rein additiv).
ShipmentLabelRequestträgt das optionale FeldminimumAge(16/18, gehoben überShipmentValueAddedService::ageLevel()),ShipmentValueAddedService::AGE_LEVELSnennt die Stufen,ShipmentLabelRequest::ageVerificationLevel()liefert die Stufe für den Dienstleister (ohne Angabe die strengere, 18). Bestehende Adapter laufen unverändert; die Schnittstellen-Version hebt der Owner. - Mehrere Ausfuhr-Referenznummern an einer Stelle (R39 Nr. 20).
ExportMrn::normalizeList()prüft jede Nummer einer kommagetrennten Liste einzeln,ExportMrn::join()führt die der Lieferscheine zusammen; zu lang ist ein 422errors.commerce.exportMrnListTooLongstatt stillem Abschneiden. - Java-Laufzeit als Werkbank-Werkzeug (Nachtrag R39 Nr. 48):
scripts/jre-holen.shholt Eclipse Temurin JRE 25.0.4.1+1 (GPL-2.0 with Classpath Exception) gepinnt und mit Hersteller-Prüfsumme nachvar/tools/jre/<plattform>(mac-aarch64, linux-aarch64, linux-x64);make pdfa-pruefung/make xrechnung-pruefungnutzen sie statt einer Rechner-Java. Nichts im Repo, nichts ausgeliefert — geführt inWerkbankWerkzeugLizenzTest, RückfallsperreWerkbankPruefschrittTest::testPruefschrittNutztDieWerkbankJre. - PDF/A- und XRechnung-Prüfung im Nachtlauf (Nachtrag R39 Nr. 51): Jobs
pdfa-pruefung(veraPDF) undxrechnung-pruefung(KoSIT) innightly.yml, Java überscripts/jre-holen.sh,OCTI_PRUEFUNG_PFLICHT=1macht „übersprungen“ dort rot; die KoSIT-Auswertung liest jetzt das echte Berichtsformat (<rep:accept>,code=) — vorher galt jede Probe als REJECT ohne Regel. RückfallsperrenNightlyLaneTest,WerkbankPruefschrittTest::testXRechnungAuswertungLiestDasKositBerichtsformat. - Schweizer QR-Zahlteil druckt die eingefrorene Referenz (Nachtrag R39 Nr. 50):
SwissQrBillService::render(…, $frozenReferences)— die zum Konto passende gespeicherte QR-Referenz/SCOR gewinnt gegen die neu gebildete (optional, abwärtskompatibel). RückfallsperreSwissQrBillTest::testEingefroreneReferenzGewinntGegenDieNeuBerechnete. - Kernel-Seam: Nachweispflicht vieler Artikel in einem Zug (Owner-Entscheidung R39 Nr. 64): optionale Fähigkeit
StockUnitRequirementsInterfacedes Einheiten-Anbieters undStockUnitTrackingRegistry::requirementsFor()(ohne Fähigkeit je Artikel gefragt). SPI-Bump, SPI-Snapshot und SDK-Export stehen aus. localizedServerMessage()nimmt benannte Parameter (Owner-Entscheidung R39 Nr. 66): Antworten der Form{code, params}(Warnungen der DATEV-Vorschau) werden mit ihren Werten übersetzt.- Differenzbesteuerung nach § 25a UStG als Steuerkategorie (
TaxCategory::MARGIN+ - Die Marke fuehrt eine Steuernummer (
brand.tax_number, BT-32, BefundR47-208). Bisher gab - Die USt-IdNr. des Leistungsempfaengers steht auf dem Beleg (Befund
R47-210). Sie lag vor und - Die strukturierte Belegfassung reist mit (
DocumentOutputContext::$structuredAttachments, - Die Anschrift hat einen Adresszusatz (
Address::$line2, BefundR47-144). Eine Anschrift - Zustellort und Zusatzleistungen im Carrier-Vertrag (
DeliveryLocation, - Das Ausgangsbuch der Belegausgabe (
commerce_document_output,DocumentOutputJournal, - Kontenfindung als Kernel-Vertrag (
App\Platform\Commerce\Contract\AccountDeterminationInterface - Debitorenkonto am Kundenstamm (
customer.debtor_account): DATEV-Personenkonto je Kunde, leer = - „Lieferung oder Leistung" als geteilter Beleg-Baustein (§ 14 Abs. 4 Nr. 6 UStG). Neu im
- Mehrere Begleittexte je Belegart, im Versand-Dialog waehlbar (Owner-Auftrag 2026-09-09). Ein
- Recht
platform.mail_template.use— die gepflegten Begleittexte beim Belegversand auswaehlen, - Weiteren Begleittext anlegen in den Mailvorlagen-Einstellungen: eine Kopie im selben
- Konfiguration der Positionen in Fremdwährung (06 R39 Nr. 52):
LineConfigurationPanelfragt die Vorschau mit dem am Beleg eingefrorenen Kurs (fxRate) und zeigt Aufpreise als Katalogpreise in Buchwährung. - Eigenes Geburtsdatum im Profil (Owner-Entscheidung Nr. 16, 06 R39): jeder trägt sein Geburtsdatum selbst ein und ändert es (
birthDatean/v1/me/profile, sofort gespeichert); leer löscht, ein Datum in der Zukunft → 400 wie im HR-Weg. RückfallsperreEmployeeGeburtsdatumTest. - Das eigene Profil ist eine API-Ressource (Owner-Entscheidung Nr. 17):
GET/PATCH /v1/me/profilealsMyProfileResourcestatt Plain-Controller — in OpenAPI/MCP sichtbar, damit KI und Automation Profil, Geburtsdatum und Zustimmungen im Namen des Nutzers setzen können; jeder nur sich selbst, PATCH nimmtapplication/json(SPA unverändert) und merge-patch. RückfallsperreEmployeeSignatureAndUserLocaleApiTest::testDasEigeneProfilErreichtDasOpenApiDokument.
Changed
- Etikett-Anschrift nur noch in einem Vokabular (Befund
SESS-CARRIER-ANSCHRIFT-01, Owner 2026-09-10 - Die Karte im Board folgt der Spaltenkonfiguration (Befund
R47-193):ResourceListreicht die - Notizen am Vorgang entstehen im EINEN Verlauf (Befund
R47-045, Doc 27 E8): Ticket-Notiz, DispatchRequestkenntmailTemplateUlid— eine ausdruecklich gewaehlte Vorlage desselben- Sprachvarianten-Kaskade als eine Quelle (
MailTemplate::resolveVariantForLocale()): Versand - Das Nav-Endgate misst gegen den Waechter, nicht gegen eine Zahl im Fliesstext (Befund
- Briefbogen spart den QR-Zahlteil aus (Nachtrag R39 Nr. 3): der Zahlteil steht immer auf der letzten Seite (
DocumentPdfRenderererkennt ihn an den MarkenSwissQrBillHtml::FRAGMENT_START/END), dort deckt das Briefbogen-Overlay die unteren 105 mm weiß ab. - Demo-Marken-Waechter fuehrt die zehnte Stammdaten-Wurzel (06 R39 Nr. 41, Doc 42 §1):
DemoMarkenAnDenStammdatenWurzelnTestprueft zusaetzlich die Lieferanten-Rahmenvereinbarung (Einkaufs-Demo setzt die Marke). - Update-Protokoll: gescheiterter Schritt
secretswird deutlich gemeldet (R39 Nr. 45). Der Schritt bleibt optional, trägt aber einen Hinweis (failureHint), den derUpdateRunnervor die Ausgabe setzt und als Fehler protokolliert: Zugangsdaten NICHT verschlüsselt übernommen, Speichern und Lesen einer Integration übernehmen den Bestand ebenfalls, Nachholen mitbin/console app:secrets:migrate. - Eine Bedingungs-Auswertung, nicht drei (Befunde
R47-125, ENT-KON-03). Die automatische - „Automatisch" heisst jetzt, was es tut (Befund
R47-124, ENT-AIW-05). Die Zusage einer - Der Geltungsbereich von „alle Anbindungen ueber OctiConnect" (Befund
R47-118) steht jetzt im
Fixed
- „Alle Sitzungen beenden" liess Token derselben Sekunde weiterlaufen (Befund
- Bestaetigungs-Route des Portal-Mailwechsels erklaerte sich nicht als anmeldefrei (Befund
- Aufwand doppelt gezaehlt bei Aufgaben mit Unteraufgaben (Befund
- Beispieldaten zeigen jeden Zustand, nicht nur den geglueckten Fall (Befund
- Doku-Regel „kein Plugin-MCP-SPI/DI-Tag“ präzisiert (Befund
R47-107): der externe MCP-Prozess bleibt - Vier zugesagte Durchklick-Specs nachgetragen (Befund
R47-133, Programm 47 §6.2 Ebene (b)): - GrapesJS restlos aus der Beschreibung entfernt (Befund
R47-138): der Baustein-Editor hat - Doku-Welle des Audits R47 (Befunde `R47-008/-013/-049/-085/-090/-091/-092/-093/-099/-100/
- Import-Ziele erklaeren ihre Benutzerfeld-Gattung (
const CF_TYP, BefundR47-019): der - Ein Anschrift-Vokabular am Label-Vertrag (Befund
SESS-CARRIER-ANSCHRIFT-01):ShipmentLabelRequesthebtpostalCode/additionalaufzip/line2; vorher fehlte GLS und DHL beim belegfreien Etikett die Postleitzahl. - Mitarbeiter-Achse der Kennzahl „Verfügbare Zeit" beachtet den Marken-Filter (Owner-Entscheidung Nr. 56):
HrMetricProviderzählte je Mitarbeiter auch Personen außerhalb der gefilterten Marke — Gesamt- und Team-Achse taten es nicht; die Team-Summe je Marke stimmt erst damit. RückfallsperreTeamSummenTest::testKennzahlGesamtUndJeMarkeBildenNurDasEigeneTeam.
Security
- Das breiteste KI-Werkzeug gilt am Freigabe-Gate als schreibfaehig (Befund
R47-126). Ein Agent - Der Carrier-Draht traegt die drei Pflichten des Gateways (Befund
R47-119). - Der Waechter der Ausgangs-Naht sieht jetzt ALLE Plugins (Befund
R47-119). Geprueft wurde - Rueckfallsperre fuer den EINEN Send-Pfad (Befund
R47-127). Das Endgate war erfuellt, aber von - Umgehungs-Sperre fuer die drei „nur ueber"-Rechenkerne (Befund
R47-113): CLAUDE.md und - Endgate 5 des UX-Programms hat seine beiden fehlenden Waechter (Befund
R47-089): - Plugin-Geheimnisse mit Anbieter-Praefix erfassen auch den Klartext-Bestand (Befund
SESS-CARRIER-GEHEIMNIS-01):IntegrationConfigSecretskennt je Anbieter den nackten Alias (<anbieter>_<feld>⇒<feld>) beim Speichern und Maskieren;IntegrationSecretMigratoruebernimmt Klartext ausIntegration.configund nackte Alt-Schluessel der Ablage (Audit ohne Werte) — beim Speichern, beim naechsten Lesen einer Carrier-Konfiguration und im neuen Update-Schrittsecrets(app:secrets:migrate, auchdeploy:secrets). - Schwärz-Muster des Änderungsprotokolls erkennt Schreibweisen und gemeldete Geheimnisse (
SESS-AUDIT-SCHWAERZMUSTER-01):AuditSubscribervergleicht Feldname und Muster normalisiert (klein, ohne Trennzeichen) —api_key,API-Key,x-api-key,webhookUrllanden nicht mehr im Klartext imaudit_log; neuprivatekey/accesskey; zusätzliche Muster-Quelle sind die überIntegrationSecretKeyProviderInterfacegemeldeten Schlüssel (Carrier, Slack, awork). Bestand bleibt unverändert (Bereinigung ist Owner-Frage). RückfallsperreAuditSchwaerzmusterSchreibweisenTest. - Team-Schnitt für Personen (
SESS-TEAM-ACHSENSCHNITT-01, Kern-Hälfte):PermissionTeamScope::employeesWithinTeamIds()(Stamm-Team),usersWithinTeamIds()(Teams des Nutzers) undwithinAnyTeamIds()— dieselbe Regel wiewithinTeamIds(), für personenbezogene Achsen und Listen. RückfallsperreTeamPersonenAchsenSchnittTest. - Alte Zugangsdaten im Aenderungsprotokoll bereinigen (06 R39 Nr. 46, Folge von Befund
0.6.22 — 2026-09-08
Added
- Fuenf Meldungen fuer die Gutschein-Art (Systemaudit
R46-12, Owner-Entscheidung vom - Mengen-Eingabe in Uhrzeit-Schreibweise, wenn die Einheit Stunden meint (Owner 2026-09-08).
Changed
- Die Sperre gegen eine zweite Schritt-Engine hat keinen Bestand mehr (Befund
R46-31). - Der Router-Ausnahmeeintrag in
tests/Architecture/ThreadNutzerpfadNahtTestist vom - Beleg-Menge verbreitert:
qtydecimal(12,2) → decimal(14,4) (Owner-Freigabe 2026-09-08, - Der Doku-Bereich
mcpist deklariert (DocsNamespaceRegistry::DEVELOPER_NAMESPACES). Mit den - Das Einheiten-Feld der Positionsliste schnitt den Text ab (
LineItemsEditor). Die Spalte war
0.6.21 — 2026-09-08
Security
- E-Mail-Adressen erreichen die Log-Handler nur noch maskiert. 14 Log-Stellen (Postmark-Marketing,
- Der Marken-Riegel der Portal-Einladung liess sich durch Weglassen der Marke umgehen (
R46-04). - AI-Workspace: die Ziel-Marke war fail-open und wurde gegen die blosse Mitgliedschaft geprüft
Added
- Sperre gegen eine zweite Schritt-Engine neben der Automation (Befund
R46-31). LabelCollator— das Backend-Pendant zucompareLabels()(SystemauditR46-30). Sortiert- Vier Fehlerschlüssel der Kasse (Systemaudit
R46-07,R46-08,R46-16) in - Neue Fehlermeldung
errors.platform.assistantBrandRequired(de/en): ein geteilter - Der Geschaeftstag hat jetzt auch eine Instant-Form:
BusinessDay::startOfDay().of() - Die Betriebs-Logbuecher haben eine Aufbewahrungsfrist (Systemaudit
R46-62, Betriebs-Haelfte
Changed
- Die Ausnahmeliste des Aggregator-Wächters schrumpft um drei Zeilen (Befund
R46-43). - Der Altbestand eigener Steuerformeln ist um eine Stelle kleiner (Systemaudit
R46-16). - Die ERP-Modul-Specs sind wieder abschreibbar (
R46-38/R46-40). Die §7-Rollentabellen von
Fixed
- Was gebucht ist, bleibt belegt — auch wenn danach noch etwas schiefgeht. Die Freigabe des
- EIN Verlauf je Deal/Lead/Aufgabe haelt jetzt auch bei zwei gleichzeitigen Schreibern. Der
- **Ein Nachtrag in die SPI-Registerlisten lief bisher ohne Versions-Bump durch — zwei Instanzen
- Die zwei Dokumente, mit denen jede Sitzung beginnt, nannten falsche Kennzahlen (
R46-41). - Der Baustein-Katalog verspricht nur noch, was
EmailRedactorkann.docs/backend-foundation.md - Der Zeitzonen-Wächter sieht jetzt auch die auf zwei Anweisungen verteilte Form (Befund
- **
fieldSources: []ist keine Freikarte mehr — die Selbstauskunft steht jetzt namentlich und - Eine erfundene Feldzeile passiert kein Gate mehr (
R46-25). Geprüft war bisher nur, dass kein - Die Menge in einer Fehlermeldung spricht jetzt die Sprache des Lesers (Systemaudit
R46-26). - Die Etiketten-Schnittstelle bekommt ein Übersetzungs-Overlay (Systemaudit
R46-27). Die drei - **Die Zusage „Lücken erscheinen deutsch" gilt wieder für die Erweiterungen, nicht nur für den
- Listen sortieren nach der Sprache der Oberfläche, nicht nach der des Browsers
- Vier Nachschlag-Spalten hinter den
*_active-Uniques haben endlich einen eigenen Index. Eine - **Ein kuratiertes KI-Kommando ist abgeschaltet, wenn SEIN Plugin abgeschaltet ist — nicht, wenn
- Der Demo-Seeder ruft keine Beiträge deinstallierter Plugins mehr (Befund
R46-45). - Die Einladung an einen Kollegen kommt vom eigenen Haus, nicht vom Hersteller (
R46-35). Der - Ein Rollen-Grant auf ein Recht, das es nicht gibt, fällt jetzt sofort auf (
R46-38). app:auth:sync-permissionszählt nur noch, was es wirklich schreibt (R46-39). Der Bericht- Das KI-Tagesbudget wechselt um Mitternacht, nicht um zwei Uhr morgens. Der
LlmBudgetGate ext-intlist jetzt eine zugesagte Abhaengigkeit, keine stille Annahme (R46-59). Der- Die Quellen des Webbaukastens bekommen ein Uebersetzungs-Overlay (Systemaudit
R46-57). - Die Bauform-Sperre gegen bytewise sortierte Anzeige-Texte sieht jetzt auch den indirekten Fall
- Die Vorgangsnummer im eingehenden Betreff hat endlich einen eigenen Zugriffspfad. Nachzug zu
- Die Verlaufsspur des Ursprungsobjekts entstand erst nach dem Versand (Systemaudit
R46-60). - Die Zahl der Schnittstellen-Operationen stimmt wieder mit ihrer Quelle ueberein
0.6.20 — 2026-09-07
Changed
- Die lokale Entwicklungsumgebung faehrt den Laufzeitboden: ddev auf MariaDB 10.11 (statt der
0.6.19 — 2026-09-07
Fixed
- Eine idempotente Buchung kann nach dem Erfolg nicht mehr ein zweites Mal laufen. Der
- Die Datensicherung beweist ihre Vollstaendigkeit, statt sie zu behaupten. Ein Upload zwischen
- **Co-Editing-Rechte laufen als harte Lease, und ein fehlgeschlagenes Speichern wiederholt der
- **Kundengruppen-Automatik: Regel entfernen wirkt, Zeitraeume stimmen, fehlende Quelle sperrt,
- Die Integrations-Migration
Version20260904190000laeuft nach einem Abbruch weiter. Vier
Changed
- Zugelassener Laufzeitboden: MariaDB 10.11 LTS statt der ausgelaufenen 10.6 (freigegeben
- Der Deploy haelt um Migrationen und Umschaltung eine Schreibpause.
deploy:maintenance_on
Added
- Die Browser-Zusage hat einen benannten Nachweis.
docs/browser-support.mdfuehrt eine - Die Groessenratsche kennt eine zweite Regel: jede Datei ausserhalb der Namensliste bleibt unter
- Das Backup-Skript ist kein UNGEPRUEFT-Artefakt mehr:
BetriebsAnnahmenInventarTestfuehrt - Die Anmeldung braucht das Sprachpaket der Erweiterungen nicht mehr. Jede Route, auch
- Die Effizienz-Zeitreihe der Nightly-Lane schreibt sich ueber die Naechte fort. Der Job
- Die Register-Historie ist wieder nachvollziehbar (
R45-15). 61 committete Registerzeilen