{
  "schemaVersion": 1,
  "project": {
    "name": "ETL — Datenkorrektheit und Betrieb (BIS v1)",
    "goal": "Quellübernahme anhand von Updates, Deletes, Wiederanlauf und Schemaänderungen abnehmen. Kriterien anpassen; keine Produktnoten.",
    "sources": "Synthetische CSV-Dateien aus etl-pipeline-pruefpaket-v1.zip; Soll IDs1/3/4 und2700EUR. Keine echten privaten Daten verwenden.",
    "owners": "Quellverantwortliche, Betrieb, Vertretung und Freigabeentscheidung ergänzen."
  },
  "candidates": [
    {
      "id": "candidate-1",
      "name": "dlt",
      "provider": "dltHub",
      "edition": "Apache-2.0-Bibliothek; Version und Ziel ergänzen"
    },
    {
      "id": "candidate-2",
      "name": "Apache Hop",
      "provider": "Apache Software Foundation",
      "edition": "Installierte stabile Version ergänzen"
    },
    {
      "id": "candidate-3",
      "name": "Airbyte",
      "provider": "Airbyte",
      "edition": "Core oder Cloud auswählen; Connector-Version ergänzen"
    }
  ],
  "criteria": [
    {
      "id": "criterion-1",
      "group": "Daten und Kennzahlen",
      "title": "Konkrete Quelle vollständig anbinden",
      "target": "Edition, Connector-Version, Quellobjekte, Berechtigungen und Ziel nennen; Erstbestand und Änderungen abgleichen.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-2",
      "group": "Daten und Kennzahlen",
      "title": "Schlüssel und Änderungsfolge belegen",
      "target": "Primärschlüssel und verlässliche Reihenfolge aus dem Quellsystem dokumentieren; event_seq ist im Beispiel eine Voraussetzung, keine garantierte Quellfunktion.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-3",
      "group": "Daten und Kennzahlen",
      "title": "Updates und Deletes übernehmen",
      "target": "Referenzfall: ID1 auf1200EUR, ID2 löschen, ID4 mit800EUR ergänzen. Löschsignal muss tatsächlich verfügbar sein.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-4",
      "group": "Daten und Kennzahlen",
      "title": "Verspätete Korrektur berücksichtigen",
      "target": "ID3 auf700EUR trotz älterem fachlichem updated_at, aber höherer event_seq. Final IDs1/3/4, Summe2700EUR. Zeit- und Ereignislogik belegen.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-5",
      "group": "Daten und Kennzahlen",
      "title": "Wiederholung ohne Dubletten",
      "target": "Dieselben Ereignisse zweimal laden: genau drei Zeilen,2700EUR. Schlüssel und Checkpoint dokumentieren.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-6",
      "group": "Daten und Kennzahlen",
      "title": "Fehlerbatch kontrolliert ablehnen",
      "target": "Ungültiger Betrag in malformed.csv: ganze Datei ablehnen, Zustand2700EUR erhalten, Datei/Zeile/Feld melden. Alternative fachlich freigegebene Fehlerstrategie vor Pilot festlegen.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-7",
      "group": "Daten und Kennzahlen",
      "title": "Schema und Historie trennen",
      "target": "Neue currency-Spalte: unbekannte alte Werte bleiben unbekannt. Backfill nur mit belegbarer Quelle. Historisierung und Löschfristen gesondert vereinbaren.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-8",
      "group": "Betrieb",
      "title": "Abbruch und Wiederanlauf nachweisen",
      "target": "Zwischen Lesen, Schreiben und Checkpoint einen Abbruch simulieren; keine übersprungenen oder doppelten fachlichen Ereignisse.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-9",
      "group": "Betrieb",
      "title": "Wiederherstellung prüfen",
      "target": "Rohdaten, Pipelinezustand, Definitionen und Ziel sichern; auf getrenntem Testziel wiederherstellen und2700EUR bestätigen.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-10",
      "group": "Rollen und Rechte",
      "title": "Region und Zugriffsrechte freigeben",
      "target": "Verarbeitung, Logs, Backups, Unterauftragnehmer und minimale Quell-/Zielrechte je gewähltem Produkt dokumentieren.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-11",
      "group": "Betrieb",
      "title": "Aktualisierungsfenster messen",
      "target": "Vereinbarte Datenlatenz und Fehleralarm mit repräsentativem Volumen erreichen; Grenzwerte vorab ergänzen.",
      "requirement": "could",
      "weight": 4,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-12",
      "group": "Kosten und Exit",
      "title": "Abrechnung mit Realvolumen kalkulieren",
      "target": "Aufbau/Betrieb, Warehouse/VM, API-Zeilen/GB, MAR oder Credits getrennt erfassen; Anfangssync, Wachstum und Reimport einschließen.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-13",
      "group": "Kosten und Exit",
      "title": "Lizenz und Edition erlauben Nutzung",
      "target": "OSS/ELv2/kommerzielle Komponenten und konkrete Nutzung inklusive optionalem Hostingangebot prüfen.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-14",
      "group": "Kosten und Exit",
      "title": "Pipeline und Daten portieren",
      "target": "Definitionen, Mapping, Rohdaten und Historie exportieren; neues Ziel mit repräsentativen Daten aufbauen.",
      "requirement": "could",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    }
  ]
}
