{
  "schemaVersion": 1,
  "project": {
    "name": "OLAP-Datenbank: Abnahme mit Korrektur, Löschung und Mandanten (BIS v1)",
    "goal": "Drei selbst gewählte Systeme am selben Fall prüfen. Die Vorlage enthält keine bestätigten Produktbewertungen.",
    "sources": "Synthetische events.csv: initial 60000 Cent, final drei Zeilen und 55000 Cent; Nord 20000, Süd 35000. (tenant,id) als Schlüssel; seq ordnet Änderungen je Schlüssel. Alle weiteren Last-/Rechte-/Restoretests sind offen.",
    "owners": "Quelle, Datenmodell, Plattformbetrieb, Freigabe und Vertretung eintragen."
  },
  "candidates": [
    {
      "id": "candidate-1",
      "name": "Kandidat 1",
      "provider": "",
      "edition": ""
    },
    {
      "id": "candidate-2",
      "name": "Kandidat 2",
      "provider": "",
      "edition": ""
    },
    {
      "id": "candidate-3",
      "name": "Kandidat 3",
      "provider": "",
      "edition": ""
    }
  ],
  "criteria": [
    {
      "id": "criterion-1",
      "group": "Daten und Kennzahlen",
      "title": "Schlüssel und exakte Sollzeilen",
      "target": "(tenant,id) getrennt halten; drei Zeilen aus expected.csv, insgesamt 55000 Cent und Nord 20000 Cent.",
      "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": "Änderungen in Quellreihenfolge",
      "target": "Je Schlüssel entscheidet seq, nicht event_time; Süd-ID1 wird trotz älterem Ereigniszeitpunkt 35000 Cent.",
      "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": "Löschung und alte Ereignisse",
      "target": "Nord-ID2 bleibt nach Löschung unsichtbar, auch nach Replay eines älteren Ereignisses. Tombstone-Aufbewahrung dokumentieren.",
      "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": "Replay ohne Duplikate",
      "target": "Identische Ereignisse erneut laden; exakte Schlüssel und Werte bleiben unverändert.",
      "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": "Fehlerbatch kontrolliert behandeln",
      "target": "Ungültigen Betrag und Schemawechsel senden; vereinbarten Abbruch-/Quarantäneweg sowie partielle Übernahme prüfen.",
      "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": "Join-Kardinalität nachweisen",
      "target": "Repräsentativen Join samt Dimensionsduplikat prüfen; zusätzliche Zeilen dürfen die vereinbarte Kennzahl nicht unbemerkt vervielfachen.",
      "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": "Frische von Antwortzeit trennen",
      "target": "Zeitstempel Quelle, Eingang und sichtbares korrektes Ergebnis protokollieren; zulässigen Rückstand eintragen.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-8",
      "group": "Daten und Kennzahlen",
      "title": "Exakt oder näherungsweise rechnen",
      "target": "Für jede Kennzahl exakte/approximative Funktion und akzeptablen Fehler festlegen.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-9",
      "group": "Rollen und Rechte",
      "title": "Zweite Leseridentität begrenzen",
      "target": "Echter Nord-Leser sieht 20000 Cent und keine Süd-Zeilen; Abfrage und Export prüfen. Dashboardfilter allein reicht nicht.",
      "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": "Datenwege und Geheimnisse dokumentieren",
      "target": "Server, Backups, Logs, Telemetrie, Supportzugriffe und Zugangsdaten kontrollieren; konkrete Region und Verantwortliche belegen.",
      "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": "Version und Tabellenmodell festhalten",
      "target": "Exakte Engine-/Connectorversion, Edition, Lizenz und Einstellungen notieren; explizit zwischen Herstellerbeleg und eigenem Lauf unterscheiden.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-12",
      "group": "Betrieb",
      "title": "Parallelität reproduzierbar messen",
      "target": "Reale Anfrageverteilung, aktive Leser und Schreiber, Fenster, p95/p99 und Fehler protokollieren; Sollwerte selbst festlegen.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-13",
      "group": "Betrieb",
      "title": "Wiederherstellung tatsächlich ausführen",
      "target": "Mit gesonderter Sicherung und sauberem Ziel wiederherstellen, alle Schlüssel vergleichen; Prozessneustart ist kein Restore.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-14",
      "group": "Betrieb",
      "title": "Speicher und Betrieb beobachten",
      "target": "Speicherwachstum, Rückstau, Hintergrundarbeiten und Warnungen im Pilot messen; Zuständigkeit und Vertretung benennen.",
      "requirement": "could",
      "weight": 2,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-15",
      "group": "Kosten und Exit",
      "title": "Gesamtkosten mit Annahmen rechnen",
      "target": "Lizenz/Cloud, Ressourcen, Transfer, Backups, Setup, Betrieb und Wachstum in EUR mit Zeitraum und Quellen dokumentieren.",
      "requirement": "must",
      "weight": 3,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    },
    {
      "id": "criterion-16",
      "group": "Kosten und Exit",
      "title": "Portablen Exit erproben",
      "target": "Daten und Modelle exportieren, in einem anderen Ziel nachlesen und fachlich abgleichen; Abhängigkeiten und Kosten erfassen.",
      "requirement": "could",
      "weight": 2,
      "assessments": {
        "candidate-1": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-2": {
          "status": "unchecked",
          "evidence": ""
        },
        "candidate-3": {
          "status": "unchecked",
          "evidence": ""
        }
      }
    }
  ]
}
