aYOUne

Changelog

Was sich verändert hat — gruppiert nach Release, filterbar nach Komponente und Repository.

Ohne Meilenstein 6
Neu pm

Aufgaben-Aktion dispatch-code-agent in modelsAndRights deklarieren

Die Route POST /tasks/:id/actions/dispatch-code-agent existiert handgebaut seit
2026.28.0, war aber ohne Registry-Eintrag fuer Nutzer unerreichbar — actionsForEntity
baut ohne Deklaration keinen Knopf. Rein additiv: modelsAndRights bleibt bei 843
Eintraegen, null neue plural-Zeilen.

Bewusst OHNE emits (die custom-Route gewinnt per Mount-Reihenfolge, ein deklariertes
Ereignis haette keinen Erzeuger), ohne defaultOnScan (ein Barcode-Scan darf nie
ungefragt eine Code-Agent-Sitzung starten) und ohne right (die Ableitung
pm.tasks.actions.dispatch-code-agent traegt).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Neu pm

PmTaskType-Kanon fuer tasks.type (Stufe 2) + ITask.type verdrahtet

CEO-Entscheid 2026-08-21 (decisions.log 20:22:43Z, LOCKED, E10). Der Kanon ist aus dem
GEMESSENEN Bestand abgeleitet (42.521 Aufgaben, nach dem Dublettenlauf
`ayauto migrate task-status-type-kanon`): elf Werte, `ITask.type` traegt jetzt
`PmTaskTypeValue` statt `string`.

BEWUSST OFFEN gelassen (`| (string & {})`), wie `status`: das Schliess-Gate des Auftrags
ist NICHT erfuellt. Gemessen schreiben die realen Erzeuger ueber `any`/`string`-typisierte
Objektliterale (`tooling/cli` dispatcher.ts:365, `platform/middleware-worker`
handleBitBucket.ts:66) — eine geschlossene Union faengt davon NICHTS. Der tragende Riegel
ist der Normalisierungs-Haken in `platform/models`, nicht dieser Typ.

BEWUSST NICHT sprach-normalisiert: `type:'Bug'` traegt die plattformweite
Errors-as-Tasks-Konvention (24.468 Dokumente). Eine Umbenennung auf `bug` waere ein
Flotten-Eingriff mit Leser-Implikationen, kein Vertrags-Detail — Produkt-Entscheid, CEO.

`CodeAgent` und `CodeAgent-Todo` sind ZWEI Sachverhalte, keine Dublette (Sitzungs-Aufgabe
gegen Einzelpunkt innerhalb einer Sitzung) — beide im Kanon, kein Merge.

Flip-Probe beidseitig gefahren: offen -> erfundener Wert geht durch; testweise geschlossen
-> TS2322 auf `type` UND `status`, waehrend die Kanon-Positiv-Kontrolle still bleibt.
Der Vertrag haengt also wirklich am Feld.

Nicht-brechend: PmTaskTypeValue ist von jedem string zuweisbar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UVmnsay4L5Rw8MvnFMVqmj
Fix pm

lesbare Beschriftungen — primary war als Text auf dunklem Grund blind

Sicht-Kritik am LIVE ausgebrachten Stand (pwa.ayoune.app, dunkles Thema), nicht
am Entwurf: zwei Stellen faerbten Text in `--mat-sys-primary` und waren damit die
am schlechtesten lesbaren der ganzen Seite.

- Der AKTIVE Schritt der Schiene traf es am haertesten — ausgerechnet seine
Beschriftung war unlesbar, waehrend die Ziffer daneben (primary als FLAECHE
mit `on-primary` darauf) einwandfrei stand. Die Betonung traegt jetzt Rahmen
und Ziffer, der Text hat volle Textfarbe.
- „Alle"/„Keines" sind Neben-Griffe: Sekundaerfarbe plus Unterstreichung, beim
Ueberfahren volle Textfarbe.

Lehre: in einem dunklen M3-Thema ist `primary` als Flaeche gedacht, nicht als
Textfarbe auf dunklem Grund.

Verify: `npm run build:stage` Exit 0 inkl. Schrift-Check.
Fix pm

Assistent nennt die richtige Grenze und sagt, WAS er liest

Zwei Befunde aus dem Live-Durchlauf gegen echte Repositorien (pwa.ayoune.app,
Mandant tolinax) — beide gefunden, weil die Fläche wirklich gefahren wurde:

1. Der Abschneide-Hinweis schob JEDE Grenze auf die Tiefe und meldete am
Wurzel-Repositorium woertlich "0 Eintraege unterhalb von Ebene 3" — der
Leser war dort an der SEITEN-Grenze. Ein Hinweis, der die falsche Ursache
nennt, ist schlimmer als keiner: er schickt den Leser die Tiefe erhoehen,
wo die Seitenzahl das Problem ist. Jetzt getrennt benannt.
2. Filtert die Suche die gewaehlte Karte aus der Sicht, blieb "Struktur lesen"
scharf, ohne dass irgendwo stand, WAS gelesen wird. Die Fussleiste nennt
das gewaehlte Repositorium jetzt beim Namen.

Verify: 16 Proben gruen, `npm run build:stage` Exit 0 inkl. Schrift-Check.
Neu pm

Assistent "Bilde deine Software ab" — Oberflaeche (W5, Weg b)

Statischer PWA-Baustein unter `pm/onboarding`, CEO-Entscheid 2026-08-22 Weg (b).
Der Motor (scan-repository / apply-proposal, pm-api `a6b805b`) bleibt unangetastet.

Drei Schritte, und die Reihenfolge traegt eine Aussage: verbinden -> pruefen ->
uebernehmen. Erst der dritte schreibt.

- Der BELEG steht sichtbar an jeder Zeile (die Manifest-Datei, die den Vorschlag
traegt), nicht in einem Tooltip. Was nicht eindeutig war, steht als OFFEN
gleichberechtigt daneben statt in einer Fussnote — ein Vorschlag, der seine
Luecken verschweigt, sieht vollstaendig aus und ist es nicht.
- Zuordnungen sind korrigierbar; ein abgewaehltes Modul zieht seine Zuordnungen
mit, sonst zeigte die Oberflaeche eine Zuordnung, die der Server als OFFEN
behandelt. Eine Komponente ohne geltendes Modul reist OHNE `moduleKey`.
- Rechte prueft der Baustein SELBST (`pm.modules` / `pm.modules.edit`), weil kein
SDUI-Zustand die Sichtbarkeit uebernimmt — ueber den treuen Spiegel
`holdsRight`, also dieselbe Glob-Semantik wie `checkRights` im Kern.
- Benannte Fehler statt leerem Vorschlag: ein fehlender Vault-Zugang wird als
solcher gezeigt, nicht als leere Struktur.

Verify: `npm run build:stage` (das Gate, das master faehrt) Exit 0 inkl.
Schrift-Check BESTANDEN; 16 Proben gruen; Flip-Probe am Rechte-Riegel faellt
mit genau 2 roten Reihen und ist zurueckgebaut.
Neu pm

Abschnitt "Website" an den Modul- und Feature-Bildschirmen

Die Kaskade `modul-feature-vertrag-website-felder-kanon` hat den Freigabe-Schalter
geliefert — es gab aber keinen Ort, an dem ihn jemand umlegt. Diese Datei ist
feld-fuer-feld hand-kuriert; ein neues Vertragsfeld erscheint hier NICHT von
selbst. Der Schmerzpunkt der Quell-Kaskade ("ein Redakteur kann einen Eintrag
nicht zurueckhalten, ohne seinen Text zu loeschen") war damit nicht behoben,
sondern eine Schicht nach oben gewandert.

Der eigentliche Auftrag sind die HINWEISE, nicht die Felder: ein leeres Kaestchen
heisst hier NICHT "aus", sondern "keine Aussage — es gilt das Ersatz-Tor". Jeder
Hinweis nennt deshalb die Bedeutung bei LEER, und jeder ist am echten Tor belegt
(isPubliclyVisible, consumer-app), nicht am Vertragstext:
- showOnWebsite false=versteckt / true=sichtbar (gewinnt in BEIDE Richtungen)
- published:false haelt zurueck AUCH bei showOnWebsite:true
- leer MIT Beschreibung sichtbar, leer OHNE versteckt
- _websites leer = auf ALLEN Auftritten, nicht "auf keinem"
- slug leer = Rueckfall auf key (kein 404)

Der echte Bestandsfall traegt `slug:""` und `showOnWebsite:null` — also GESETZTE
leere Werte, nicht "absent". Am Tor geprueft: verhaelt sich identisch zu absent,
die Flaeche darf sie also schreiben.

Bewusst `multiSelect` statt des im Auftrag genannten `remoteSelect`+multiple: in
dieser Datei ist `multiSelect` die belegte Bauform (1x, `_components`),
`remoteSelect` kommt 0x mit `multiple` vor.

`sortOrder` nur beim Modul — das Feature fuehrt es bereits unter "Stammdaten";
ein zweites Feld auf denselben Pfad waeren zwei Bedienorte fuer einen Wert.

Vorab gemessen: das installierte models kennt alle fuenf Felder (2026.452.1) —
der lokale node_modules hing auf 451.0, wo KEINES existiert; der Lock war korrekt,
`npm ci` hat es geradegezogen. Ohne diese Pruefung haette `strict` jede Eingabe
still verworfen.

Proben 650/650 (38 Reihen), inkl. der feldweisen Spec-Struktur-Probe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PmMj9oQCU9nxusjcbD8Dp8