# Cloud-Abnahme: Import, Ergebnis und Gegenproben

**Status dieses Dokuments:** reproduzierbare Anleitung; keine Behauptung bereits durchgeführter Cloudtests. Der lokale n8n-Nachweis steht in `test-report.json`. Für Make sind Import und Lauf offen.

## Voraussetzungen und Ergebnisablage

Ein autorisiertes n8n-Cloud- bzw. Make-Konto mit nutzbarem Testkontingent. Neue Verträge oder kostenpflichtige Upgrades werden vom Kontoinhaber entschieden. Partnerannahme und Automatisierungszugang sind getrennte Dinge. Ausschließlich ein neues Testprojekt bzw. neues Szenario verwenden, synthetische Daten belassen, keinen Zeitplan aktivieren und keine externen Module ergänzen.

Vor dem Lauf Datum, Paket-SHA aus `manifest.json`, angezeigte Anbieter-/Runtimeversion (falls verfügbar) und verwendeten Kontoplan ohne Kontokennung erfassen. Nicht angezeigte Plattformversion als **unbekannt** notieren. Nach jedem Lauf die heruntergeladene Ergebnisdatei sichern; Screenshots ergänzen den Datenbeleg, ersetzen ihn aber nicht. Kontodetails und Zugangsdaten nicht in einen öffentlichen Beleg kopieren.

## n8n Cloud

1. **Ort:** neuer Workflow im n8n-Editor. **Aktion:** Menü rechts oben → `Import from File` → `n8n-workflow.json`. **Sichtbarer Erfolg:** vier verbundene Knoten und eine Hinweiskarte; keine Credentials-Aufforderung. [Offizielle Import-/Export-Anleitung](https://docs.n8n.io/workflows/export-import/).
2. **Ort:** Knoten `Synthetische Anfragen`. **Aktion:** Eingaben gegen `fixtures.json` prüfen. **Erfolg:** sieben Anfragen mit IDs A-001 bis A-006; A-001 steht zweimal darin.
3. **Aktion:** `Execute Workflow` manuell auslösen. **Erfolg:** letzter Knoten `Aufgaben und Fehlerprotokoll` liefert genau ein JSON-Objekt mit sieben `records`; `counts` ist 7/3/1/3. Das vollständige Objekt mit `expected-results.json` vergleichen, nicht nur die grüne Knotenfarbe.
4. **Aktion:** Ergebnis aus dem letzten Knoten als JSON herunterladen. Falls die UI einen Wrapper liefert, nur das enthaltene `json`-Objekt für den Vergleich entnehmen, keine fachlichen Werte umschreiben. Datum, tatsächliche Version und Ergebnis-SHA intern protokollieren.
5. **Aktion:** Noch einmal manuell ausführen. **Erfolg:** dieselben sieben Ergebnisse; die Demo behauptet ausdrücklich keine Wiederholungssperre zwischen Läufen.
6. **Gegenprobe in Kopie:** Im Eingabeknoten die erste E-Mail leeren. **Erwartung:** Zeile 1 wird `missing_email`; Zeile 3 wird zur ersten gültigen A-001-Aufgabe. Gesamt: 3 Aufgaben, 0 Dubletten, 4 Fehler. Wiederherstellen und den ursprünglichen Lauf erneut grün sehen.
7. **Leerer Stapel in Kopie:** `requests: []`. **Erwartung:** sichtbarer Abbruch `invalid_batch`, keine Erfolgsausgabe. Danach Original wiederherstellen.
8. **Abschluss:** Testworkflow gespeichert, weiterhin manuell; keine öffentliche Freigabe/Veröffentlichung auslösen. Kopien der Gegenprobe löschen oder klar als Test kennzeichnen.

## Make

1. **Ort:** `Scenarios` → neues Szenario. **Aktion:** im Editor rechts oben `… → Import blueprint`, `make-blueprint.json` wählen, speichern. **Erfolg:** neun Module mit den im README genannten Namen und durchgehender Verbindung. Ein Importfehler bleibt ein offener Befund; keine Importfähigkeit bestätigen, bevor die Plattform die Datei angenommen hat. [Offizielle Blueprint-Anleitung](https://help.make.com/blueprints).
2. **Ort:** Modul 2 `Synthetische Anfragen`. **Aktion:** Falls keine Struktur angeboten wird, `Data structure` hinzufügen, mit `Generator` aus dem Inhalt von `fixtures.json` erzeugen. Das Rootfeld `requests` ist ein Array aus Collections; `request_id`, `subject`, `email`, `detail` sind Text. Keine JSON-Struktur-ID aus einem anderen Konto übernehmen. Alternativ dieses Modul einmal allein laufen lassen; Make kann daraus die Struktur erkennen. [JSON-Dokumentation](https://apps.make.com/json).
3. **Ort:** Modul 3 (Iterator). **Aktion:** Array-Feld auf `2.requests[]` kontrollieren. Modul 9 (Aggregator): Source module = Iterator/3; Ergebnisfelder `source_index`, `request_id`, `outcome`, `code`, `task_id`, `title`, `email`, `detail`. **Erfolg:** alle Referenzen sind aufgelöst; kein rotes unbekanntes Mapping. Importabweichungen im Blueprint korrigieren, danach neu exportieren und erneut prüfen; sie nicht nur mündlich übergehen.
4. **Ort:** Module 1 und 8. **Aktion:** Variablenname jeweils `seen_ids`, Scope `roundtrip`; Modul 1 setzt `emptyarray`, Modul 8 ergänzt nur beim Ergebnis `task`. Modul 4 liest die aktuelle Variable nach jedem Iterator-Bundle. **Erfolg:** kein Zurücksetzen pro Zeile und kein langlebiger Datenspeicher.
5. **Aktion:** `Run once`. **Erfolg:** Modul 9 liefert ein Bundle mit `array` aus exakt sieben Records. Die Record-Reihenfolge und jedes Feld mit `expected-results.json.records` vergleichen. Der Make-Wrapper (`array` statt `records`) ist die einzige beabsichtigte Formatabweichung. Die erwarteten Kategorien sind 3×`task`, 1×`duplicate`, 3×`error`. Kein stilles Umschreiben von Strings/Zahlen für einen grünen Vergleich.
6. **Aktion:** Output-Bubble des Aggregators öffnen → `Download output bundles`; Datei und minimierten Screenshot sichern. Die verwendeten Credits und Zeit aus dem tatsächlichen Lauf notieren. Ein geschätzter Verbrauch ist kein Messwert.
7. **Gegenprobe in Szenariokopie:** Im JSON-Modul die erste E-Mail leeren. **Erwartung:** 3 Aufgaben, 0 Dubletten, 4 Fehler; Zeile 3 wird zur Aufgabe. Erscheint A-001 weiter als Dublette, wurde eine fehlerhafte ID zu früh gespeichert. Import/Variablenscope reparieren und neu prüfen.
8. **Wiederholung:** Originaldaten wiederherstellen und noch einmal `Run once`. **Erfolg:** ursprüngliche sieben Records. Mehrzeiliger `detail` aus Zeile 7 bleibt exakt Text.
9. **Leerer Stapel:** In Kopie `requests: []` setzen. Make kann am Iterator ohne Ergebnis enden. Das ist **keine erfolgreiche Verarbeitung**: das erwartete Aggregator-Ergebnis fehlt. Im Abnahmeprotokoll als „kein Ergebnis / leerer Stapel“ dokumentieren; die vorbereitete Demo enthält keinen selbständigen strukturellen Eingangsguard. Für produktive Fremddaten vor Freigabe nachrüsten und separat prüfen.
10. **Abschluss:** Finale akzeptierte Blueprint-Fassung exportieren. Account-/Verbindungskennungen entfernen, Dateihash aktualisieren, lokale Strukturprüfung und Cloud-Regressionslauf wiederholen. Zeitplanung bleibt aus. Erst jetzt darf der Nachweis „in Make importiert und ausgeführt“ tragen.

## Minimales internes Laufprotokoll

```json
{
  "platform": "n8n-cloud oder make",
  "tested_at": "tatsächlicher ISO-Zeitpunkt",
  "platform_version": "angezeigte Version oder unbekannt",
  "package_manifest_sha256": "tatsächlicher SHA-256",
  "import": "pass oder fail",
  "golden_records_equal": false,
  "negative_control_observed": false,
  "rerun_equal": false,
  "output_file": "lokale minimierte Ergebnisdatei",
  "output_sha256": "tatsächlicher SHA-256",
  "credits_observed": null,
  "notes": "konkrete Abweichung; keine Secrets"
}
```

`false` und `null` sind Vorbelegungen eines **leeren Protokolls**, keine negativen oder positiven Messergebnisse. Nur tatsächlich gemessene Werte einsetzen. Fehlender Export, abgebrochener Lauf, falsche Recordzahl oder nicht aufgelöste Mappings verhindern die jeweilige Cloud-Abnahme. Andere bereits belegte Teile des Pakets bleiben davon getrennt nutzbar.
