Skip to content

feat(composer): das Plugin, das Layouts besitzt - #183

Merged
BechsteinDigital merged 1 commit into
mainfrom
feat/composer-plugin
Aug 7, 2026
Merged

feat(composer): das Plugin, das Layouts besitzt#183
BechsteinDigital merged 1 commit into
mainfrom
feat/composer-plugin

Conversation

@BechsteinDigital

Copy link
Copy Markdown
Owner

1. Why is this change necessary?

Der Kompositions-Renderer aus #172 fragt ISurfaceLayoutSource — bis jetzt hat niemand geantwortet.
Das ist das Plugin, das die Layouts besitzt.

Baustein 7 des Umsetzungsschnitts, erster Teil: Schema, Persistenz und die Zustandsübergänge.

2. What does this change do, exactly?

Der Core kennt genau einen Vertrag; das Plugin implementiert ihn und besitzt die Daten. Kein
Composer installiert, kein Layout
— und eine Fläche rendert aus .njk wie zuvor. Nichts über
Layouts, den Editor oder seine Domäne sickert in den Core.

Ein Plugin mit vollem Bürgerrecht, kein Sonderfall (ADR-014 §10.4): eigenes Schema unter
plugin_composer, eigene Migrationen, eigene Entitäten.

Die Übergänge sind der Kern, und sie kennen keine Datenbank. SurfaceLayoutTransitions sind
reine Funktionen über den Versionen — die Regeln sind der Teil, der zählt, und sie sollten dafür
kein Postgres brauchen. Der Store lädt, ruft hinein und speichert.

Übergang Und warum so
Veröffentlichen Entwurf wird live, Vorgänger archiviert, neuer Entwurf eröffnet. Ohne den letzten Schritt hätte die nächste Bearbeitung nichts, worin sie schreiben könnte.
Verwerfen Entwurf aus dem Veröffentlichten neu — der einzige Rückweg, der nichts verlieren kann, was jemand veröffentlicht hat.
Rückrollen Kopiert eine archivierte Version in den Entwurf, nie direkt live. Ein Rückrollen ist ein Vorschlag; direkt live wäre der eine Weg, auf dem niemand das Ergebnis ansieht, bevor ein Besucher es tut.
Autosave Erzeugt gar keine Version. Sonst wäre die Historie ein Protokoll von Tastenanschlägen, und Rückrollen hieße raten, welcher von vierhundert Einträgen gemeint war.

Nebenläufigkeit optimistisch über einen Änderungsstempel: Der zweite Schreibvorgang mit veraltetem
Stand bekommt einen Konflikt. Eine echte Sperre müsste von einem Editor freigegeben werden, der
vielleicht bloß seinen Tab geschlossen hat.

3. Describe each step to reproduce the issue or behaviour.

11 Tests für die Übergänge, ohne Datenbank. Drei mit Gegenprobe belegt:

Bruch Test wird rot
Rückrollen geht direkt live RollingBackGoesIntoTheDraftAndNotStraightToLive
Stempel wird nicht geprüft ASecondWriterWithAStaleStampIsRefused
Vorgänger wird nicht archiviert PublishingArchivesWhatWasLive

4. Please link to the relevant issues (if any).

Setzt §7.1–7.3 und §8 Baustein 7 (erster Teil) um. Erster Implementierer von
ISurfaceLayoutSource aus #172.

Migration von Hand

Das EF-Tooling kann einen Plugin-Kontext nicht bauen (Callora.Core liegt nicht im Output), also
gibt es nichts zu scaffolden — wie bei Communication und VideoConference.

Ein Unterschied zu auto-generierten Migrationen: Dort wiederholt jede Designer-Datei das ganze
Modell. Hier steht es einmal (ComposerModelDefinition), und Snapshot wie Designer rufen es.
Zweimal von Hand gepflegt hieße zweimal die Gelegenheit, es unterschiedlich zu tun.

Zahlen

16 Dateien. .NET 1961 + 29 Analyzer, zweimal wiederholt grün.

Noch nicht drin

  • Die Admin-API, über die der Editor den Entwurf holt und speichert — inklusive der
    Operator-Berechtigung, die GetDraftAsync an ihrer Aufrufstelle verlangt.
  • Der Canvas selbst, samt der beiden verbliebenen Bedingungen aus §7.6 (Theme-Tokens und
    Sektions-CSS in den Canvas scopen).
  • Der abgeleitete Nutzungsindex („welche Layouts benutzen Block X"), den §7.2 für die Warnung
    beim Deinstallieren eines Plugins vorsieht. Das Dokument liegt als jsonb, die Abfrage ist also
    möglich — der Index macht sie billig.

Der Core kennt genau einen Vertrag — ISurfaceLayoutSource —, das Composer-Plugin
implementiert ihn und besitzt die Daten. Kein Composer installiert, kein Layout, und eine
Fläche rendert aus .njk wie zuvor: Nichts über Layouts, den Editor oder seine Domäne sickert
in den Core.

Ein Plugin mit vollem Bürgerrecht, kein Sonderfall (ADR-014 §10.4): eigenes Schema unter
plugin_composer, eigene Migrationen, eigene Entitäten.

DIE ÜBERGÄNGE SIND DER KERN, UND SIE KENNEN KEINE DATENBANK
SurfaceLayoutTransitions sind reine Funktionen über den Versionen. Die Regeln sind der Teil,
der zählt, und sie sollten dafür kein Postgres brauchen — der Store lädt, ruft hinein und
speichert.

Vier Übergänge, und jeder ist eine Entscheidung:

Veröffentlichen macht den Entwurf live, archiviert die bisherige Veröffentlichung und
eröffnet einen neuen Entwurf. Ohne den letzten Schritt hätte die nächste Bearbeitung nichts,
worin sie schreiben könnte.

Verwerfen baut den Entwurf aus dem Veröffentlichten neu — der einzige Rückweg, der nichts
verlieren kann, was jemand veröffentlicht hat. Ohne Veröffentlichung bleibt ein leerer
Entwurf: Ein Layout ohne Entwurf wäre unbearbeitbar.

Rückrollen kopiert eine archivierte Version IN DEN ENTWURF, nie direkt live. Ein Rückrollen
ist ein Vorschlag wie jede Bearbeitung; direkt live zu gehen wäre der eine Weg, auf dem
niemand das Ergebnis ansieht, bevor ein Besucher es tut.

Autosave erzeugt gar keine Version. Sonst wäre die Historie ein Protokoll von
Tastenanschlägen, und Rückrollen hieße raten, welcher von vierhundert Einträgen gemeint war.

Nebenläufigkeit optimistisch über einen Änderungsstempel: Der zweite Schreibvorgang mit
veraltetem Stand bekommt einen Konflikt. Eine echte Sperre müsste von einem Editor
freigegeben werden, der vielleicht bloß seinen Tab geschlossen hat.

MIGRATION VON HAND
Das EF-Tooling kann einen Plugin-Kontext nicht bauen (Callora.Core liegt nicht im Output),
also gibt es nichts zu scaffolden. Anders als bei auto-generierten Migrationen steht das
Modell hier aber nur EINMAL: Snapshot und Designer rufen dieselbe Definition. Zweimal von
Hand gepflegt hieße zweimal die Gelegenheit, es unterschiedlich zu tun.

Elf Tests für die Übergänge, drei davon mit Gegenprobe belegt: Rückrollen direkt live,
Stempel ungeprüft, Vorgänger nicht archiviert — jeder Bruch wird rot.

Noch nicht drin: die Admin-API, über die der Editor den Entwurf holt und speichert, und der
Canvas selbst.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@BechsteinDigital
BechsteinDigital merged commit 4d4383a into main Aug 7, 2026
4 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant