feat(composer): das Plugin, das Layouts besitzt - #183
Merged
Conversation
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>
This was referenced Aug 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
.njkwie zuvor. Nichts überLayouts, 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.
SurfaceLayoutTransitionssindreine 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.
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:
RollingBackGoesIntoTheDraftAndNotStraightToLiveASecondWriterWithAStaleStampIsRefusedPublishingArchivesWhatWasLive4. Please link to the relevant issues (if any).
Setzt §7.1–7.3 und §8 Baustein 7 (erster Teil) um. Erster Implementierer von
ISurfaceLayoutSourceaus #172.Migration von Hand
Das EF-Tooling kann einen Plugin-Kontext nicht bauen (
Callora.Coreliegt nicht im Output), alsogibt 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
Operator-Berechtigung, die
GetDraftAsyncan ihrer Aufrufstelle verlangt.Sektions-CSS in den Canvas scopen).
beim Deinstallieren eines Plugins vorsieht. Das Dokument liegt als
jsonb, die Abfrage ist alsomöglich — der Index macht sie billig.