aYOUne

Changelog

What changed — grouped by release, filterable by component and repository.

Other changes 2
Fix pipeline-red-head-audit

„Kette aus" ist nicht „Kette rot" — Ursache statt Vermutung

Der Melder schrieb fuer JEDEN fehlenden Publish „die Kette meldet gruen, geliefert
wird nichts". Bei `ayoune-google-ads-client` meldete gar keine Kette etwas
(`pipelines_config` 404, 0 Laeufe). Der Satz beschrieb also einen anderen Zustand als
den vorliegenden — und schickte den Folge-Auftrag in die falsche Richtung: er suchte
den Fehler im `|| echo` des Publish-Schritts, waehrend der Schritt nie ausgefuehrt
worden war. ⚠ Diese Vermutung stammte aus MEINEM eigenen Brief; sie war nie gemessen.

Ueber zehn Bibliotheken gemessen: 5 mit eingeschalteter Kette, 4 OHNE Kette und
trotzdem veroeffentlicht (von Hand), 1 ohne Kette und ohne Paket. Die Haelfte hat gar
keine laufende Kette — und das ist offenbar in Ordnung.

Getrennt wird jetzt die URSACHE, nicht die Schwere: die Befund-Klasse bleibt
`paket-fehlt` (Ausstiegs-Vertrag unveraendert, beide Faelle faerben rot), dazu kommt je
Fund ein Feld `chain` und ein eigener Satz. Die Klassen-UEBERSCHRIFT ist jetzt
ursachen-NEUTRAL — der alte Satz steht nur noch dort, wo er zutrifft.

🔴 DREI BEFUNDE UEBER DAS EIGENE WERKZEUG, alle beim Verify aufgefallen:

1. `--registry` war fuer SCOPED Pakete WIRKUNGSLOS. Gemessen:
`npm view @tolinax/ayoune-http --registry https://registry.npmjs.org` liefert
`2026.1.0`, weil `npm config get @tolinax:registry` auf `registry.ayoune.app` zeigt
und eine scope-spezifische Registry ueber `--registry` GEWINNT. Gegenprobe im selben
Lauf: `npm view express --registry …` greift. Der Schalter war also fuer genau die
Pakete blind, fuer die dieser Waechter gebaut ist — und haette jeden Gegen-Lauf
gegen ein anderes Register still verfaelscht. Behoben ueber `npmViewArgs`, das den
Scope aus dem Paketnamen ableitet und `--@scope:registry=` mitgibt (3 Proben).

2. Die 404-ZWEIDEUTIGKEIT: Bitbucket antwortet auf `pipelines_config` mit 404, wenn die
Kette nie eingeschaltet wurde UND wenn es das Repositorium gar nicht gibt. Aus dem
404 allein folgt „nie eingeschaltet" NICHT. Geloest OHNE dritten Abruf: der
Publish-Durchgang laeuft per Bauart nur ueber lokal existierende Verzeichnisse, die
Existenz ist dort belegt und wird durchgereicht. ⚠ Ein erster Anlauf fragte sie per
API nach — und machte aus einem korrekten `kette-nie-gelaufen` ein `unbestimmt`,
sobald jene Abfrage aus einem anderen Grund als 404 fehlschlug. Eine Probe, die
scheitern KANN, darf eine belegte Tatsache nicht ueberschreiben.

3. Der Status-Regex stand als `/API (d{3}) /` statt `\d{3}` in der Datei (der Backslash
ging beim Einsetzen ueber ein Heredoc verloren). Er traf damit NIE, `configStatus`
blieb null, und JEDER Befund fiel auf `unbestimmt` — die ganze Nachschaerfung war
still ausgehebelt, ohne dass eine Probe rot wurde. Die vorhandenen Proben pruefen die
reine Klassifikation; der Regex lag im netzabhaengigen Abruf. Jetzt als reine
`statusFromError` herausgezogen und mit 3 Proben festgenagelt. LEHRE: eine
Zeichenketten-Auswertung gehoert in eine reine Funktion, sonst ist sie per Bauart
ungeprueft.

VERIFY, live gegen Bitbucket (nicht per Fixture):
- `ayoune-google-ads-client` -> `kette-nie-gelaufen` (404 + size=0, unabhaengig gemessen)
- `ayoune-email-blocks` -> `kette-laeuft` (enabled=true, size=9)
- chainCounts zaehlt beide getrennt: {nie-gelaufen 1, laeuft 1, unbestimmt 0}
- Negativ-Kontrolle mit ungueltigen Zugangsdaten: der Melder laeuft durch, meldet den
Registry-Befund und behauptet KEINE Ursache (`unbestimmt`), Ausstieg unveraendert.

Proben +21 (I Ursachen-Klassen · J Registry-Schalter · K 404-Zweideutigkeit ·
L Status-Regex), 84/84 in dieser Datei gruen. Volle Paket-Reihe 4797/8 — dieselben acht
Bestandsfehler wie vor der Aenderung (4776/8 in Iteration 2 gemessen), also +21 Tests,
+21 pass, fail unveraendert: keine Regression.

🟢 NEBENBEFUND: `ayoune-google-ads-client` ist inzwischen VEROEFFENTLICHT — der Brief,
den dieser Waechter am 2026-08-22 erzeugt hat, ist abgearbeitet worden. Der Live-Beleg
oben laeuft deshalb bewusst
New pipeline-red-head-audit

zweiter Durchgang für VERÖFFENTLICHUNGS-Ketten — „Kette grün, geliefert wird nichts"

Der Wächter beantwortete bisher eine Frage: „Ist der letzte Lauf rot?" Ein
Repositorium, das nicht ausbringt sondern VERÖFFENTLICHT, fällt durch dieses
Raster per Bauart — es hat nie ein Deployment. `ayoune-vscode-copilot` war
deshalb vier Tage lang nicht abrufbar, während jedes neue cloud-init es zog und
leer ausging, ohne dass irgendwo ein Fehler entstand.

🔴 WARUM EIN ZWEITER DURCHGANG UND KEINE WEITERE KLASSE IN classifyRedHead:
der bestehende Weg beginnt mit selectRedHead, und bei einem GRÜNEN Kopf ist dort
Schluss (reason: 'kopf-nicht-rot'). Die Klasse `nie-ausgebracht` entsteht also
erst NACH einem roten Kopf. Der teure Fall ist aber genau der andere.

Vier reine, prüfbare Funktionen (netzfrei testbar):
classifyPipelineKind ausbringung | veroeffentlichung | keine — KOMMENTAR-BEWUSST,
sonst macht eine Zeile, die "kein gke-deploy" DOKUMENTIERT,
aus einer Bibliothek einen Dienst (dieselbe Falle hat die
Helm-Zahl zuletzt am 2026-08-20 um acht überhöht).
derivePackageName Kette > Publish-Verzeichnis > Wurzel-Name MIT Scope.
derivePublishDir cd <dir> && npm publish
classifyPublishState paket-fehlt (BEFUND) · paket-unbestimmt · registry-unbestimmt
· paket-vorhanden · null (kein Veröffentlichungs-Repo).

🔴 DIE REIHENFOLGE IN derivePackageName IST DER KERN, und der Anlassfall belegt
sie: ayoune-vscode-copilot trägt in seiner Wurzel-package.json den Namen
`ayoune-copilot` OHNE Scope — veröffentlicht wird @tolinax/ayoune-vscode-copilot
aus npm-dist/. Wer blind den Wurzel-Namen nimmt, fragt nach einem nie
veröffentlichten Namen und meldet einen Defekt, den es nicht gibt. Ein Name ohne
Scope wird deshalb NICHT geraten, sondern als `paket-unbestimmt` benannt.

Ehrlichkeits-Regel wie bei classifyRedHead: registryHas unterscheidet 404 vom
Netzfehler AM AUSGABETEXT, nicht am Ausstiegs-Code (npm view endet bei JEDEM
Fehler != 0). Ein unerreichbares Register ist `registry-unbestimmt`, nie ein Befund.

Damit automatisiert der Wächter die Regel aus feedback_pipeline-silent-no-publish
("Tags pushed != Lib published — ALWAYS empirisch mit npm view verifizieren"), die
bisher Handarbeit war und genau deshalb ausblieb.

🟢 ERSTER SCHARFER FLOTTEN-LAUF FAND SOFORT EINEN UNBEKANNTEN FALL:
ayoune-google-ads-client (domains/ads/lib-google-ads) — Kette grün, Paket 404,
letzter Commit 2026-06-19. Ursache dort ist eine Fehler-Unterdrückung IN der Kette
(npm publish || echo "Version already published, skipping"), die jeden Fehlschlag
als Erfolg meldet. 0 Verbraucher, also heute latent; eigener Brief, nicht hier behoben.

🟢 Und die Zahl trägt den Ausstiegs-Code: 46 von 47 Veröffentlichungs-Repositorien
sind grün. Der Wächter steht NICHT ab Tag eins auf rot — die Lärm-Regel des
Kopf-Kommentars bleibt gewahrt. Ab jetzt färben ZWEI Klassen rot.

🔴 NEBENBEFUND, beim Bauen gefunden und mitbehoben: slugForDir erkannte eine
.git/config mit ANMELDE-TEIL nicht (https://x-...-token-auth:<token>@bitbucket.org/...).
Ein so geklontes Repositorium fiel aus JEDEM Lauf heraus — weder auf roten Kopf noch
auf sein Paket geprüft, still unter `skipped` verbucht. Gemessen: 379 Ketten, 363
erkannt; von den 16 übrigen haben 15 gar keine .git/config (dort ist `skipped`
richtig), genau EINES scheiterte an der Adress-Form — ayoune-search-lib, und das ist
eine Veröffentlichungs-Kette. Ausgelagert als reine slugFromGitConfig, sechs Proben.

Proben: +32 (F reine Klassifikation · G Ende-zu-Ende im echten Skript-Lauf · H Kennung),
63/63 in dieser Datei grün. Flip-Probe, Negativ- und Positiv-Kontrolle je vorhanden;
die bestehenden Proben A-E bleiben unberührt und netzfrei (Fixture ohne __publish
überspringt den Durchgang). Volle Paket-Reihe 4776 Tests, 8 Fehlschläge — dieselben
acht, namentlich identisch, auch OHNE diese Änderung gemessen (git-stash-Gegenprobe):
Bestandsfehler des Pakets, keine Regression.