aYOUne

Changelog

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

Weitere Änderungen 5
Neu ayauto

`job list` + `job trigger` — Faelligkeits-Jobs von Hand starten

Ein Eintrag der worker-automatic-checks-Registrierung war bis hierher NUR
startbar, indem man den Auftrag direkt in die BullMQ-Warteschlange schrieb —
genau der manuelle Eingriff, den die Tooling-first-Regel ausschliessen soll.
Die Route POST /jobs/:name/actions/trigger existierte, war aber von keinem
Werkzeug erreichbar: `ay` weist operator-only-Module ab, MCP sperrt jede
Nicht-GET-Methode in Produktion, `ayauto su` kann nur get/set auf EINEN
Datensatz. Form uebernommen von `su`/`queue`: benannter Eintrag, kein
Platzhalter, confirm-gated.

🔴 DER TRAGENDE BEFUND: die ausgelieferte Registrierung verschweigt
`defaultData`. Gemessen am laufenden Dienst enthaelt GET /jobs die Zeichenkette
null-mal, waehrend optionsSchema und queueName da sind (Positiv-Kontrolle) —
`serializeRegistry` gibt das Feld schlicht nicht aus. Zugleich reicht die
Ausloese-Route den Rumpf WOERTLICH als Auftragsdaten durch. Ein Hand-Start ohne
Nutzlast stellt also {}; ein Verbraucher, der auf `op` besteht, weist ihn ab —
und der Aufruf sieht trotzdem wie ein Erfolg aus (200 mit Auftrags-Kennung).
Genau das beschreibt der Eintrag HR_BENEFIT_RECEIPTS_MONTHLY woertlich.

Deshalb liest `job trigger` `defaultData` ZUSAETZLICH aus dem Arbeitsbaum und
zeigt es im Trockenlauf — ausdruecklich als Hinweis aus der QUELLE, nicht aus
der ausgelieferten Registrierung. Gesendet wird es nur mit --use-local-default.
Erfunden wird NIE etwas: ohne Angabe geht {} hinaus, und der Trockenlauf sagt,
was das bedeutet.

Der Extrakt hat zwei Riegel, beide mit eigener Probe: Zeilen-Kommentare werden
entfernt (der Quelltext WARNT an mehreren Stellen mit dem Wortlaut
`defaultData: { dryRun: false }` davor, es nachzutragen) und Zeichenketten
werden laengentreu maskiert (die Beschreibungen SPRECHEN ueber defaultData und
op). Echt-Abgleich gegen die Registrierung: 22 Vorkommen in der Quelle, 22 vom
Extrakt gefunden.

Optionen werden gegen das optionsSchema des Eintrags geprueft — ein vertippter
Schluessel wird abgewiesen samt Nennung der gueltigen, statt still zu
verpuffen. Ein erfundener Job-Name und ein `enabled: false`-Eintrag werden
abgewiesen, ohne etwas einzureihen.

23 Proben mit Umkehr- und Positiv-Kontrollen, gruen; Bau gruen.
Abnahme am laufenden Dienst: Trockenlauf zeigt den vollen Auftrag inkl. op ·
erfundene Option/erfundener Name je Exit 2 ohne Einreihung · echter Start von
check-all-health lief DURCH (recent-runs: manual:true, active→completed,
4621 ms), die Nachbarzeile desselben Takts traegt manual:false.

OFFEN: der saubere Rueckweg ist eine Zeile in serializeRegistry
(`defaultData: d.defaultData`) — sie liegt in domains/monitoring/
worker-automatic-checks, ausserhalb der beanspruchten Pfade, und ist als
eigener Vorgang erfasst.
Fix ayauto

Zeilenenden von src/index.ts zurueck auf LF

Der vorige Commit hat die Datei per Python-Schreibvorgang im Textmodus von LF auf
CRLF gedreht — aus 49 hinzugefuegten Zeilen wurde ein Diff ueber 10281. Der Blob
trug vorher 0 CR-Bytes, danach 5165 (genau eins je Zeile). Inhalt unveraendert;
gegen den Vor-Stand bleiben die 49 additiven Zeilen der su-Gruppe.

Die Falle steht in der Wurzel-CLAUDE.md: ein Python dreht unter
Windows die ganze Datei.
Neu ayauto

`ayauto su` — Betreiber-Kanal fuer operator-only-Module

Es gab zwei Betreiber-Kanaele und fuer `su` ihre Schnittmenge NICHT: `cli_call`
(ueber `ay`) kann mutieren, erreicht `su` aber nicht (CEO-Entscheid 2026-06-20,
Modul-Riegel VOR jeder Aufloesung); `api_call` (MCP) erreicht `su`, sperrt aber
jede Nicht-GET-Methode in Produktion. Serverseitig ist der Zugriff offen — die
Sperre lag ausschliesslich im Werkzeugkasten.

🔴 Die Regel von 2026-06-20 wird NICHT aufgeweicht: `tooling/cli` ist unangetastet
und erreicht `su` weiterhin nicht (gemessen, siehe Gegenprobe). Der Zugriff wandert
aus der ausgelieferten CLI in die interne, die per CEO-Regel 2026-08-10 nie
ausgeliefert wird.

Form uebernommen von `ayauto queue`: benannter Datensatz, kein Platzhalter,
confirm-gated. Ohne --confirm ein Trockenlauf, der NICHTS schreibt.

- `ayauto su get <entitaet> <id>` / `set <entitaet> <id> --field --value [--confirm]`
- Rueckroll-Abbild VOR jedem Schreibvorgang, das festhaelt, ob das Feld vorher
ueberhaupt existierte — der Rueckweg fuer ein ABWESENDES Feld ist ein $unset,
nicht ein `false`; sonst bliebe ein Wert stehen, den der Bestand nie kannte.
- Token aus --token / AYAUTO_API_TOKEN / angemeldeter ay-CLI ueber den GETEILTEN
Lader (keine zweite Umsetzung); wandert nie in den Baum.
- Schreibweg ist `PUT /<plural>` mit der Kennung im RUMPF (der erzeugte CRUD hat
kein `PUT /<plural>/<id>`); verifiziert wird am DATENSATZ, nicht an der Antwort.

Verify gegen Produktion (alle fuenf Tore des Briefes):
- ohne --confirm: `updatedAt` am Datensatz UNVERAENDERT (in der DB gemessen)
- mit --confirm: `updatedAt` 13:45:47 -> 14:25:22, Wert wertneutral true->true
- ohne Token: Exit 2 mit `NOT-READY:kein-betreiber-token — <grund>`
- Gegenprobe: `ay` sagt weiterhin "Module su is operator-only and is not reachable
from the customer-facing ay CLI"
- Rueckroll-Abbild geschrieben, 0 Token-Vorkommen, unterscheidet abwesend von false

Proben 14 gruen; Flip-Probe (abwesend wie vorhanden behandeln) faerbt 2 rot.
Neu ayauto

migrate features-namen-tranche2-nachziehen

Die Namens-Tranche 2 korrigiert 27 Zustands-Namen in der PLATTFORM. Der
erste Abgleich-Durchgang (2026-08-21) hatte die WEBSITE-Namen genau
dieser Schluessel mit den damals SCHLECHTEN Plattform-Namen ueberschrieben
(Tools, Prompts, SLAs, Middlewares). Beide Seiten laufen dadurch wieder
auseinander -- diesmal mit der Plattform als der besseren Seite.

🔴 OHNE diesen Nachzug SENKT die Tranche die Deckung, statt sie zu heben:
gemessen unmittelbar nach der Ausbringung 453/554 deckungsgleich gegen
471/554 davor. Nach dem Lauf: 477/554.

🔴 Das AUSBRINGUNGS-TOR ist der Kern: geschrieben wird nur, wo der
Plattform-Zustand den neuen Namen BEREITS fuehrt. Ein Dienst mit roter
oder laufender Kette faellt heraus statt eine Behauptung zu erzeugen, die
die Plattform nicht deckt -- gemessen fielen die drei cms-Schluessel
genau so heraus (Kette vorbestehend rot). Ein erneuter Lauf holt sie nach.

🔴 BEWUSST kein blindes "Website uebernimmt die Plattform" -- genau das
war der Fehler des ersten Durchgangs, der 96 kuratierte Namen zerstoert
hat. Hier steht eine ausdrueckliche Liste von 27 Schluesseln, deren
Zielnamen aus dem deutschen `summary` des jeweiligen Zustands abgeleitet
sind.

Waechter: Ausbringungs-Tor (Plattform-Seite), Alt-Wert-Waechter
(Website-Seite, kein Ueberschreiben + Idempotenz), Positiv-Kontrolle auf
alle 27 Schluessel, Umkehr-Kontrolle mit erfundenem Schluessel,
Rueckroll-Abbild VOR dem Schreiben.

Gefahren 2026-08-22: DRY 24/27 -> APPLY geschrieben=24, Rest auf
Alt-Wert=3 (die drei wartenden), an der Datenbank nachgemessen.

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

migrate ayounestates-waisen-namen — Namen der sechs Waisen

Fuer sechs Bildschirm-Zustaende greift der Code-Weg STRUKTURELL nicht:
`ayounestates` wird bei jedem Pod-Start von `registerModuleStates` neu
gesaet, diese sechs haben aber keinen lebenden Saeer unter ihrem Titel.
Sie brauchen eine direkte Daten-Korrektur; Zielnamen aus der W7-Kuration
(features-namen-snapshot-2026-08-22.tsv), nicht neu erfunden.

🔴 ZWEI PRAEMISSEN DES AUFTRAGS SIND GEGEN PRODUKTION WIDERLEGT:

(1) "alle sechs tragen _appName: null" -- falsch fuer zwei.
monitoring.computingentities und -logs tragen
ayoune-computing-entities-develop. Der Lauf meldet die Saeer-Kante
je Zeile, statt sie zu verschweigen: ein Pod-Start KANN sie
ueberschreiben.

(2) "bei den Zwillingen pruefen, ob Korrektur oder Stilllegung richtig
ist" -- die Messung entscheidet fuer KORREKTUR, gegen die naive
Erwartung. Der Feature-Katalog der Website kennt ausschliesslich die
monitoring.*-Schluessel; fuer computing-entities.* gibt es dort KEINE
Zeile. Eine Stilllegung liesse also zwei Website-Features OHNE
Plattform-Gegenstueck zurueck und machte die Lage schlechter.
Dasselbe bei sale.orders (die Website fuehrt sale.orders UND
ecommerce.orders). Die zugrundeliegende Dublette bleibt und ist eine
PRODUKT-Entscheidung (welcher Schluessel ist kanonisch?) -- sie wird
benannt, nicht still geloest.

Waechter: Alt-Wert im Filter (kein Ueberschreiben einer fremden
Korrektur + Idempotenz), Positiv-Kontrolle auf alle sechs Titel,
Umkehr-Kontrolle mit einem erfundenen Titel, Rueckroll-Abbild VOR dem
Schreiben. `name_en` bleibt unangetastet.

Gefahren 2026-08-22: DRY 6/6 -> APPLY geschrieben=6, Rest im Filter=0,
an der Datenbank unabhaengig nachgemessen; Re-DRY 0 von 6 bei weiterhin
6/6 Positiv-Kontrolle (keine falsche Null).

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