Zwölf Empfehlungen für den mzone-publisher. Jede hat einen Beleg aus der Fähigkeitsanalyse, einen ersten Schritt und ein Abnahmekriterium. Dazu kommt, was ich ausdrücklich nicht empfehle.
Top-3 vom 2026-09-19: Volltextsuche umgesetzt (V28), STATELESS und axe-core offen und hier wieder aufgenommen
Vorbehalt
Aufwand in Personentagen (PT) und Nutzen sind Einschätzungen. Code-Anker sind geprüft, Ursachen nur dort, wo es dabeisteht.
Leitlinie
MZP hat in sieben Wochen 72 Tickets geschlossen und ist in der Breite fertig genug. Den nächsten Schritt bringt die Verlässlichkeit dessen, was schon da ist, nicht die nächste Fähigkeit. Ein Agent muss sich auf drei Dinge verlassen können: dass ok auch ok heißt, dass ein Diagramm ohne Koordinaten im ersten Anlauf gültig ist, und dass das Wiki nicht auf Seiten verweist, die es nicht gibt.
1 · Wahrheit
Prüfaussagen, die ein Agent ungelesen übernehmen darf.
2 · Erstanlauf
Die häufigsten Aufgaben gelingen mit einem Aufruf.
3 · Pflege
Der Bestand wird nicht schneller alt, als er wächst.
4 · Messen
Ergonomie ist eine Zahl, kein Gefühl.
Aufwand gegen Nutzen
Abb. 1 · Einschätzung, nicht gemessen. Gerendert von MZP (Diagrammtyp quadrant, Playground v4). Die Achsen heißen „billig/teuer“, weil längere Achsentexte aus dem Bild laufen (Befund B3).
ok heißt ok. Heute publiziert ein Agent, der nur ok liest, Seiten mit JS-Ausnahmen.
E2 · 0,5 PT
STATELESS. Seit dem 2026-08-05 freigegeben, zweimal als erster Schritt empfohlen, eine Zeile Rollback.
E7 · Stunden
MZP-106, externe Fonts, Slug-Notice. Drei Fixes mit hohem Verhältnis von Ärger zu Aufwand.
Alle zwölf im Einzelnen
E1 · Ehrliches ok hoch0,5 PT
Beleg
ArtifactValidator.Report.ok() gibt errors.isEmpty() zurück. Die Befunde des Browser-Checks landen nur in notices und render.clean. Im Playground: ok:true neben PAGE_EXCEPTION, CONSOLE_ERROR und RESOURCE_FAILED, alle mit severity ERROR.
Vorschlag
Eine Notice mit severity ERROR macht ok falsch, egal aus welcher Stufe sie kommt. Wer eine Kunst-Seite mit bekanntem Konsolenrauschen publizieren will, setzt ausdrücklich renderStrict=false. Dasselbe Ergebnisschema {ok, blocking[], advisory[]} für alle validate-/publish-Tools.
Abnahme
Test: Bundle mit undefinedFn() ergibt ok:false, mit renderStrict=false dagegen ok:true plus Notice.
E2 · MCP auf STATELESS hoch0,5 PT
Beleg
application.yml:39 steht auf STREAMABLE. ADR-008 Phase 1 ist freigegeben, und die Top-3 vom 2026-09-19 nennen sie als ersten Schritt.
Vorschlag
Umstellen und die Tool-Reihenfolge in McpToolCatalog festschreiben (SHOULD der Spec 2026-07-28, hilft Prompt-Caches). Vorher klären, ob angebundene Clients Keepalive-Pings senden.
Abnahme
Neustart des Servers mitten in einer Agenten-Sitzung, der nächste Tool-Aufruf gelingt ohne Re-Initialisierung.
E3 · Transit-freies Auto-Layout hoch2–4 PT
Beleg
Ein architecture-Diagramm mit 9 Knoten ohne Koordinaten brauchte vier Anläufe. Drei scheiterten an TRANSIT_NOT_DASHED, das der Server selbst verursacht hat, der vierte kam mit 10 Kreuzungen und 21 Knicken durch. In diagram/layout/ und EdgeRouter gibt es kein Konzept für Hilfsknoten langer Kanten.
Vorschlag
Das klassische Sugiyama-Verfahren nachziehen: Eine Kante über k Ränge bekommt k−1 Hilfsknoten, die OrderingPass mitsortiert und Coordinates mit platziert. Ihre Positionen gehen als Waypoints an den EdgeRouter. Dazu optional autoFix=true, das verbleibende Transits selbst auflöst und quittiert.
Abnahme
Property-Test über zufällige gerichtete Graphen mit höchstens 9 Knoten: Jedes vollständig auto-gelayoutete Diagramm ist frei von TRANSIT_NOT_DASHED. Die mittlere Zahl der LAYOUT_QUALITY-Kreuzungen über einen festen Korpus wird zur Ratsche.
E4 · Agenten-Evals als Qualitätsmaß sehr hochumgesetzt · MZP-113
Beleg
Jeder Befund dieser Analyse ist erst durch Ausprobieren sichtbar geworden, nicht durch die rund 1400 Tests der Suite. Die Tests prüfen, ob der Server seine Regeln einhält. Ob ein Agent mit diesen Regeln im ersten Anlauf zum Ziel kommt, prüfen sie nicht.
Zwei Stufen
Die deterministische Stufe schickt feste Eingaben an Produktion und ist das Gate (grün/gelb/rot). Sie beantwortet, ob ein Deploy etwas kaputt gemacht hat. Die LLM-Stufe gibt je Aufgabe nur den fachlichen Auftrag an einen frischen Agenten (Sonnet 5 und Haiku 4.5, je drei Läufe). Der Agent sieht ausschließlich die MZP-Tools. Diese Stufe misst Ergonomie und warnt nur, rot färbt sie nie. Bei einem Widerspruch zählt die deterministische Stufe.
Korpus
10 Aufgaben ohne Wiki: Diagramme, Artefakte und ein Grenzfall. Scheitert eine Aufgabe bekanntermaßen, trägt sie knownIssue und zählt gelb. Wird sie trotzdem grün, meldet der Lauf UNEXPECTED_PASS, und der Marker muss raus.
Messgrößen
Aufrufe bis zum gültigen Publish, Fehlversuche je Code, Server-Qualität und stille Fehler. Sie stehen nebeneinander und werden nie zu einer Zahl verrechnet. Stille Fehler prüft ein lokaler Browser, nicht der Server selbst.
Ablauf
Von Hand nach jedem Deploy über den Skill /mzp-eval. Jeder Lauf ergibt einen Report mzp-eval-JJJJ-MM-TT mit results.json und Protokoll, der vorige Report ist die Baseline. Der Vertrag steht im Repo unter docs/agent-workflows/evals/README.md.
Startwerte
Aus diesem Playground: architecture ohne Koordinaten 5 Aufrufe, radar 2, quadrant 2 plus ein unentdeckter Fehler, Report-Artefakt 2.
Baseline
mzp-eval-2026-09-23: Gate grün mit 5 × grün, 1 × gelb (E3, Auto-Layout), 4 × UNEXPECTED_PASS (E1 und E7 sind live) und 0 × rot.
E5 · Wiki-Hygiene mit Reparaturvorschlägen zurückgestellt — Wiki deprecated
Status
Zurückgestellt. Der Wiki-Use-Case ist deprecated (Entscheidung vom 2026-09-23). Beleg und Vorschlag bleiben als Stand dieses Tages stehen.
Beleg
lintWiki: 21 von 61 Wiki-Seiten veraltet, 45 ohne crossRefs, 40 tote Links (davon rund 30 aus wiki-index). ADR-001 bis -005 und -007 werden verlinkt, existieren aber nicht, obwohl AGENTS.md vor jeder Revision das Lesen der ADR verlangt.
Vorschlag
(a) Einmalig aufräumen: tote Links aus wiki-index entfernen und die fehlenden ADRs rekonstruieren oder als archivierten Platzhalter mit „Begründung verloren“ anlegen. (b) lintWiki schlägt crossRefs aus vorhandenen, nicht gespiegelten page_link-Kanten vor und liefert einen fertigen mergePageContext-Aufruf als Vorschlag, ohne ihn selbst auszuführen.
Abnahme
0 tote Links, keine verlinkte ADR fehlt, lintWiki liefert für jede Seite ohne crossRefs mindestens einen Vorschlag, wo Kanten existieren.
E6 · Eine Suche für Seiten und Tickets mittel2 PT
Beleg
Die Ist-Analyse vom 2026-09-22 steht nur in Ticketrümpfen (MZP-109..112). fullTextSearch "Ist-Analyse" liefert 0 Treffer. Mehrwortsuchen ohne Operator enden schnell leer, und es gibt keine Trefferauszüge.
Vorschlag
scope=pages|tickets|all auf demselben tsvector-Muster wie V28. Dazu Auszüge über ts_headline (escaped, die Funktion ist nicht XSS-sicher) und bei 0 Treffern ein automatischer ODER-Fallback mit Notice. searchBranding bekommt Synonyme für die vier vibes.
Abnahme
„Ist-Analyse“ findet MZP-109..112. Eine Suche ohne Treffer liefert Vorschläge statt einer leeren Liste.
E7 · Kleine Ecken mittelje Stunden
Ecke
Fix
MZP-106 renderedAt (B6)
put statt putIfAbsent, Aufrufer-Wert vor dem Persistieren verwerfen
Google Fonts in Templates (B7)
Breiter als gedacht: 9 von 10 Templates laden Google Fonts (post-single, landing-hero, gallery-wide, info-card, quote-feature, split-editorial, timeline-journey, wiki-page, gamma-deck). Eine Migration stellt sie auf /lib/fonts-maierzone@1.0.0/ um
visualProof blind für Text (B3)
Im Render-Dienst getBBox() jedes <text> gegen die viewBox prüfen und als TEXT_CLIPPED melden. Im Quadranten-Renderer die Achsentexte einrücken oder umbrechen
Slug-Fehler (B9)
strukturierte Notice INVALID_SLUG mit suggestion: "playground-opus-5-5"
zones[].nodes (B9)
als Alias zu node.zone annehmen, weil es die naheliegende Schreibweise ist
typeBlocks (B9)
ein Schlüssel typeBlocks wird entpackt oder mit „auf die oberste Ebene“ gemeldet
Radar/Pie-Legende (B8)
Serienlegende und Titel ins SVG, damit der Export ohne Seite lesbar ist
Links in mz-meta
mzone-ui 1.8.1: Linkfarbe für .mz-meta, .mz-lead, .mz-prose und Tabellen in beiden Themes (auf dieser Seite per eigenem CSS nachgetragen)
E8 · Tool-Diät gering0,5 PT
Beleg
Die 40 Tool-Beschreibungen gehen in jeden Agenten-Kontext. publishRawPage und publishRawPageCompressed sind laut eigener Beschreibung Alias-Pfade, ohne Overwrite-Schutz und ohne Versionen. searchBranding liefert bei einem Treffer bereits das volle Profil von getDesignMdFor.
Vorschlag
Nutzung aus request_audit ziehen. Alias-Tools bekommen eine DEPRECATED-Notice und fallen nach 30 Tagen ohne Aufruf weg. getDesignMdFor geht in searchBranding auf. Die Bytes der tools/list-Antwort werden als Ratsche gemessen.
Abnahme
Die tools/list-Antwort wird kleiner und kann nicht unbemerkt wieder wachsen.
E9 · axe-core im Render-Check mittel2 PT
Beleg
Aus den Top-3 vom 2026-09-19 übernommen und weiter offen. Fast alle Seiten schreiben Agenten mit freiem HTML. Zugänglichkeit prüft niemand.
Vorschlag
Zuerst ein Pilot mit axe.run() gegen 20 bestehende Seiten, um das Rauschen zu messen. Danach Meldungen als advisory-Notices im Render-Dienst, anfangs ohne Blockade. Erster Prüfling ist der Diagramm-Viewer (Zielgröße und Fokus seiner Knöpfe).
Abnahme
Die Rauschquote je Seitentyp ist dokumentiert, und validateArtifact liefert A11Y_*-Notices.
E10 · Versionen ausdünnen statt kappen gering1 PT
Beleg
max-versions-per-slug: 5 (application.yml:115). Dieser Playground hat den Deckel in einer Stunde erreicht.
Vorschlag
Die letzten fünf behalten, dazu je Monat die letzte Version. wiki-adr-* behalten alles. Assets sind ohnehin inhaltsadressiert, der Speicher wächst also moderat (Einschätzung).
E11 · Lebende Reports mittel4–6 PT
Idee
Die Kacheln in der Fähigkeitsanalyse („40 tote Links“) sind ab morgen falsch. Ein Artefakt könnte in metadataJson eine Datenquelle deklarieren (stats, lint, backlog), und der Server legt beim Ausliefern eine aktuelle _data.json daneben. Weil /published/ schon mit no-store ausliefert, ist der Rest Lesecode.
Grenze
Nur öffentliche Aggregate, keine Ticketrümpfe und keine priv--Inhalte. Ein Snapshot bleibt als Datei im Bundle, damit Versionen reproduzierbar bleiben.
E12 · MCP-Spec 2026-07-28 und Mehr-Instanz später5+ PT
Stand
Blockiert im Java-SDK (kein server/discover in 2.0.1). Der Preview-Store im Heap (ADR-008 B1) bindet an eine Instanz, obwohl Review-Links schon in der Datenbank liegen.
Vorschlag
Als Watchlist-Eintrag führen, nicht als Vorhaben. Sobald das SDK nachzieht, zuerst den Preview-Store auf die Datenbank legen, dann die Spec angleichen.
Was ich ausdrücklich nicht empfehle
N1Budget
Das 9/12-Budget anheben. Drill-down (MZP-111) ist die bessere Antwort. Schon bei 9 Knoten ist das Layout der Engpass, größere Diagramme würden es verschärfen.
N2Breite
Weitere Diagrammtypen oder Skins vor E3. 45 Typen und 11 Skins sind genug Breite. Jeder weitere Typ vervielfacht die Layout-Fälle, die E3 erst beherrschbar macht.
N3Effekte
Weitere fx-Module in mzone-ui. 48 Module (Physik, Optik, Energie …) sind mehr, als Reports brauchen, und jedes will gepflegt sein. Eine Linkfarbe fehlt dagegen noch.
N4Sync
Zwei-Wege-Sync mit Obsidian. ADR-009 begründet das Nein, und MZP-47 hält sich zu Recht an „einbahnig“.
N5Mermaid
Mermaid sequenceDiagram nachrüsten. Der bewusste Ausschluss in MZP-110 stimmt, sequence ist über Lifelines sauberer.
Reihenfolge
bis 2026-10-02
E1, E2, E7: rund 2 PT, alles klein, alles mit sofortiger Wirkung für jeden Agenten.
Oktober
E4 zuerst (liefert die Messlatte), dann E3 dagegen gemessen.
November
E6, E8, E9-Pilot.
Q1/2027
E10, E11, dazu E12, sobald das Java-SDK die Spec trägt.
Woran man den Erfolg misst
Messgröße
Heute
Ziel Q1/2027
Quelle
Aufrufe bis gültiges architecture-Diagramm ohne Koordinaten
5
1
E4-Korpus
Auto-Layout mit Transit-Fehler
3 von 4 Anläufen
0
Property-Test E3
validateArtifact ok:true trotz ERROR
ja
nie
Test E1
Templates mit externen Fonts
9 / 10
0
Migrations-SQL
MCP-Transport
STREAMABLE
STATELESS
application.yml
Alias-Tools in tools/list
2
0
getCapabilities
Die Werte aus diesem Report lassen sich mit denselben Aufrufen jederzeit nachmessen. Ein erneuter Lauf in drei Monaten zeigt, ob die Konsolidierung gegriffen hat. Das ist auch der Kern von E4.