Octibiz
Demo

Durchsucht Website und Dokumentation gemeinsam. Enter zeigt alle Treffer, Esc schließt.

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.sh legt vor dem
  • Frühestmöglicher SEPA-Einzugstag im Lesepfad (Befund SESS-R48-SEPA-FRUEHESTER-TAG-OHNE-MASKE-01):
  • StockUnitRelocationInterface (SPI 3.27, Befund SESS-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-054 Nachlauf, SESS-R48-KONTAKTMERGE-VETO-01): Neue Ereignisse ContactMerging (Einspruch vor der Zusammenfuehrung) und ContactMerged (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-Seam DocumentAudience mit 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. ContactSyncService löst jetzt den Besitzer auf (ohne ihn läuft nichts) und schneidet Aus- und Eingang über PermissionBrandScope::brandsWithAnyFor() an contact.read bzw. 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/mailbox mitgezogen). errors.crm.mailAssignmentTargetInvalid folgt wieder dem Hausstil (Sie-Form, Umlaute).
  • Wächter sieht camelCase-Setting-Schlüssel (Befund SESS-SETTING-UNGESEEDET-01): SettingKeyCatalogCoverageTest prü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.yml und nightly.yml nutzen die gemeinsame Aktion .github/actions/doku-submodul statt submodules: 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): ConfigCrudPage kennt den Feldtyp multiselect — 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): SystemUpdateJobStore hält die Ausgabe je Warn-/Fehl-Schritt (steps[].output an GET /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 aus notices nicht mehr; outputTail bleibt 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-permissions entziehen je Eintrag GENAU EINMAL (Merker in eigener Tabelle auth_permission_revocation, bewusst nicht in den Einstellungen — dort ließe er sich leeren, und der Entzug liefe erneut); erster Eintrag: sales.order.write_protect an 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() — Veto FileDeleting, 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-Vertrag UpdateNoticeProviderInterface (SPI 3.23, experimentell, Tag app.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,
  • DocsReferenceIntegrityTest liest 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 (Befund R47-088): Werkzeug, Schwellen und Ratsche der
  • Persoenliches Postfach kann senden (Befund R47-022): PersonalMailboxProviderInterface traegt
  • 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): CustomFieldImportSupport liefert 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): watcherIds als USER-Ids am
  • Sichtbarkeits-Regeln fuer Kunde und Ansprechpartner (Befund R47-191): neue Ziele customer
  • 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_id als 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_task kennt Ziel-Aufgabenliste und Anhänge (Befund R47-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.throttlePerHour dosiert,
  • Schlagwoerter im Kontakt-Import (Befund R47-185): Spalte tags (Komma/Semikolon), vergeben
  • Vorschau je Ausspiel-Ziel (Befund R47-134): neuer FOUNDATION-Baustein ChannelPreviewCard
  • 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): Block qrBill in 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 Baustein SwissQrBillService (src/Platform/Commerce/Document/SwissQr). Marke fuehrt qrIban + qrBillEnabled (Migration Version20260913300000) und ihre Anschrift jetzt ueber die API (addressStreet/-Zip/-City/-Country); aktiver Zahlteil ohne Schweizer Konto oder Anschrift wird mit 422 abgewiesen. Neue Abhaengigkeit bacon/bacon-qr-code 3.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): StockOperation traegt optional condition (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 von applyTeamIds() fuer bereits geladene Objekte; HrMetricProvider liefert 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-Vertrag StockUnitCostInterface ab. Rückfallsperre DifferenzbesteuerungAufteilungTest.
  • 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. Migration Version20260914200000.
  • Werkbank-Prüfschritt make pdfa-pruefung (Nachtrag R39 Nr. 6, Befund R47-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-227 bleibt 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; Fehlertexte errors.pos.configurableProductNotSellable und errors.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 Vertrag StockConditionAvailabilityInterface, InventorySourceRegistry::getAvailability($productId, ?$condition) (ohne Zustand Neuware, Quelle ohne Vertrag fail-closed 0), Bewegungsart StockOperation::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 wie summarizeWithDocumentDiscount()) und MarginSchemeCalculator::creditPurchaseShare() (Einstand einer Gutschrift: Marge sinkt zuerst). Rückfallsperren DifferenzbesteuerungTest::testEineKorrekturGutschriftMindertZuerstDieMarge, DifferenzbesteuerungBuchungsstapelTest::testDerBelegrabattTrifftAuchDieDifferenzzeilen.
  • Carrier-Vertrag: Stufe des Altersnachweises (R39 Nr. 23, rein additiv). ShipmentLabelRequest trägt das optionale Feld minimumAge (16/18, gehoben über ShipmentValueAddedService::ageLevel()), ShipmentValueAddedService::AGE_LEVELS nennt 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 422 errors.commerce.exportMrnListTooLong statt stillem Abschneiden.
  • Java-Laufzeit als Werkbank-Werkzeug (Nachtrag R39 Nr. 48): scripts/jre-holen.sh holt Eclipse Temurin JRE 25.0.4.1+1 (GPL-2.0 with Classpath Exception) gepinnt und mit Hersteller-Prüfsumme nach var/tools/jre/<plattform> (mac-aarch64, linux-aarch64, linux-x64); make pdfa-pruefung/make xrechnung-pruefung nutzen sie statt einer Rechner-Java. Nichts im Repo, nichts ausgeliefert — geführt in WerkbankWerkzeugLizenzTest, Rückfallsperre WerkbankPruefschrittTest::testPruefschrittNutztDieWerkbankJre.
  • PDF/A- und XRechnung-Prüfung im Nachtlauf (Nachtrag R39 Nr. 51): Jobs pdfa-pruefung (veraPDF) und xrechnung-pruefung (KoSIT) in nightly.yml, Java über scripts/jre-holen.sh, OCTI_PRUEFUNG_PFLICHT=1 macht „übersprungen“ dort rot; die KoSIT-Auswertung liest jetzt das echte Berichtsformat (<rep:accept>, code=) — vorher galt jede Probe als REJECT ohne Regel. Rückfallsperren NightlyLaneTest, 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ückfallsperre SwissQrBillTest::testEingefroreneReferenzGewinntGegenDieNeuBerechnete.
  • Kernel-Seam: Nachweispflicht vieler Artikel in einem Zug (Owner-Entscheidung R39 Nr. 64): optionale Fähigkeit StockUnitRequirementsInterface des Einheiten-Anbieters und StockUnitTrackingRegistry::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, Befund R47-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, Befund R47-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): LineConfigurationPanel fragt 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 (birthDate an /v1/me/profile, sofort gespeichert); leer löscht, ein Datum in der Zukunft → 400 wie im HR-Weg. Rückfallsperre EmployeeGeburtsdatumTest.
  • Das eigene Profil ist eine API-Ressource (Owner-Entscheidung Nr. 17): GET/PATCH /v1/me/profile als MyProfileResource statt 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 nimmt application/json (SPA unverändert) und merge-patch. Rückfallsperre EmployeeSignatureAndUserLocaleApiTest::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): ResourceList reicht die
  • Notizen am Vorgang entstehen im EINEN Verlauf (Befund R47-045, Doc 27 E8): Ticket-Notiz,
  • DispatchRequest kennt mailTemplateUlid — 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 (DocumentPdfRenderer erkennt ihn an den Marken SwissQrBillHtml::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): DemoMarkenAnDenStammdatenWurzelnTest prueft zusaetzlich die Lieferanten-Rahmenvereinbarung (Einkaufs-Demo setzt die Marke).
  • Update-Protokoll: gescheiterter Schritt secrets wird deutlich gemeldet (R39 Nr. 45). Der Schritt bleibt optional, trägt aber einen Hinweis (failureHint), den der UpdateRunner vor die Ausgabe setzt und als Fehler protokolliert: Zugangsdaten NICHT verschlüsselt übernommen, Speichern und Lesen einer Integration übernehmen den Bestand ebenfalls, Nachholen mit bin/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, Befund R47-019): der
  • Ein Anschrift-Vokabular am Label-Vertrag (Befund SESS-CARRIER-ANSCHRIFT-01): ShipmentLabelRequest hebt postalCode/additional auf zip/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): HrMetricProvider zä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ückfallsperre TeamSummenTest::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): IntegrationConfigSecrets kennt je Anbieter den nackten Alias (<anbieter>_<feld><feld>) beim Speichern und Maskieren; IntegrationSecretMigrator uebernimmt Klartext aus Integration.config und nackte Alt-Schluessel der Ablage (Audit ohne Werte) — beim Speichern, beim naechsten Lesen einer Carrier-Konfiguration und im neuen Update-Schritt secrets (app:secrets:migrate, auch deploy:secrets).
  • Schwärz-Muster des Änderungsprotokolls erkennt Schreibweisen und gemeldete Geheimnisse (SESS-AUDIT-SCHWAERZMUSTER-01): AuditSubscriber vergleicht Feldname und Muster normalisiert (klein, ohne Trennzeichen) — api_key, API-Key, x-api-key, webhookUrl landen nicht mehr im Klartext im audit_log; neu privatekey/accesskey; zusätzliche Muster-Quelle sind die über IntegrationSecretKeyProviderInterface gemeldeten Schlüssel (Carrier, Slack, awork). Bestand bleibt unverändert (Bereinigung ist Owner-Frage). Rückfallsperre AuditSchwaerzmusterSchreibweisenTest.
  • Team-Schnitt für Personen (SESS-TEAM-ACHSENSCHNITT-01, Kern-Hälfte): PermissionTeamScope::employeesWithinTeamIds() (Stamm-Team), usersWithinTeamIds() (Teams des Nutzers) und withinAnyTeamIds() — dieselbe Regel wie withinTeamIds(), für personenbezogene Achsen und Listen. Rückfallsperre TeamPersonenAchsenSchnittTest.
  • 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/ThreadNutzerpfadNahtTest ist vom
  • Beleg-Menge verbreitert: qty decimal(12,2) → decimal(14,4) (Owner-Freigabe 2026-09-08,
  • Der Doku-Bereich mcp ist 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 zu compareLabels() (Systemaudit R46-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 EmailRedactor kann. 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-permissions zä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-intl ist 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 Version20260904190000 laeuft 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.md fuehrt eine
  • Die Groessenratsche kennt eine zweite Regel: jede Datei ausserhalb der Namensliste bleibt unter
  • Das Backup-Skript ist kein UNGEPRUEFT-Artefakt mehr: BetriebsAnnahmenInventarTest fuehrt
  • 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

referenz.releases · Gilt ab Version 0.5.4