Eine zweite und dritte Meinung, direkt in Claude.
Mit Kirat beruft Claude einen Rat mit ChatGPT und Gemini ein. Drei Modellfamilien beziehen unabhängig voneinander Position und stimmen dann ab. Die Mehrheit entscheidet, und die Gegenstimme bleibt protokolliert. Gibt es keine Mehrheit, sagt Kirat das, statt Einigkeit zu erzwingen.
Claude Desktop (macOS/Windows) und Claude Code; Cloud-Sitzungen von Claude Code mit einmaliger Einrichtung — nicht der Chat im Browser oder auf Mobilgeräten (wo es läuft)
Ihre eigenen OpenAI- und Gemini-Keys — kein Server, kein Konto bei uns
Einmalkauf — kein Abo, 256 automatisierte Tests
Ein Modell, ein blinder Fleck.
Selbstprüfung schmeichelt
Ein Modell, das seine eigene Arbeit prüft, findet sich selbst überzeugend. Ein zweiter Durchgang desselben Modells ist keine unabhängige Prüfung.
Mehr Runden sind nicht die Lösung
Kirat begrenzt die Debatte auf zwei Runden, im Code, nicht in einem Prompt. Ein Modell kann sich nicht über das Limit hinwegreden. Gibt es dann noch immer keine Mehrheit, wird Ihnen das mitgeteilt.
Verschiedene Familien irren unterschiedlich
Kirat stellt Claude, ChatGPT und Gemini dieselbe Frage und zeigt Ihnen, wo die Meinungen auseinandergehen — einschließlich wer widersprochen hat und warum.
Drei Positionen. Eine Abstimmung. Jeder Einwand bleibt erhalten.
Unabhängige Positionen
ChatGPT und Gemini beziehen jeweils Position, ohne die der anderen zu sehen. Claude gibt als dritte Stimme seine eigene Position ab. Kein Ankereffekt, kein Konsenstheater.
Eine protokollierte Abstimmung
Eine Zweidrittelmehrheit entscheidet. Fallen Mitglieder aus und sind die übrigen uneins, löst ein festgelegter Domänenverantwortlicher das Patt auf. Ohne Mehrheit lautet das Ergebnis needs_human. Die Gegenstimme kommt mit dem Ergebnis zurück.
Gebaut, um die APIs zu überstehen
Budgetwächter, Zwei-Runden-Limit, Circuit Breaker, Timeouts pro Anbieter auf Basis des gemessenen Durchsatzes, Hintergrund-Tickets für lange Läufe. Alles im Code, nicht in Prompts.
Sie fragen in normaler Sprache. Claude führt den Aufruf aus:
// ein echter Aufruf und eine echte Antwort — nichts inszeniert kirat_vote({ question: "Cap the coupled effort default, or leave it at maximum?", options: ["cap at high", "decouple", "leave as is"], ownPosition: { position: "cap at high", reasoning: "…", confidence: 72 } }) → outcome: "completed" decision: "cap at high" decisionPath: "unanimous" rounds: 1 votes: openai 94, gemini 92, claude 72 cost: $0.021
Weitere Ergebnisse: needs_human (keine Mehrheit — Sie entscheiden), domain_decision, limited, budget_exhausted. Die Konfidenzwerte sind jeweils die Selbsteinschätzung des Modells.
Neun Tools, die Claude aufruft
7 kostenpflichtig · 2 kostenlos| Pos. | Tool | Funktion | Kosten |
|---|---|---|---|
| 01 | kirat_vote | Entscheidung per Abstimmung: Jedes Mitglied bezieht Position, dann entscheidet eine Zweidrittelmehrheit, der Domänenverantwortliche oder needs_human. | kostenpflichtig |
| 02 | kirat_review | Code-Review. Jeder Befund wird von der jeweils anderen Modellfamilie überprüft. | kostenpflichtig |
| 03 | kirat_create | Ihren Entwurf kritisieren, ein Mitglied entwerfen lassen oder kurze Varianten in eine Rangfolge bringen. | kostenpflichtig |
| 04 | kirat_brainstorm | Divergente Ideen in drei Spuren — im Rahmen des Briefings, benachbart, regelbrechend — anonym in eine Rangfolge gebracht. | kostenpflichtig |
| 05 | kirat_decide | Delegierte Entscheidung bei umkehrbaren Arbeitsentscheidungen, mit Veto und Tageslimit. | kostenpflichtig |
| 06 | kirat_ask | Genau ein Mitglied fragen. Kein Rat. | kostenpflichtig |
| 07 | kirat_image | Bildgenerierung durch beide Anbieter, bewertet von einer anonymen Jury. | kostenpflichtig |
| 08 | kirat_result | Hintergrundjobs und letzte Ergebnisse abrufen. | kostenlos |
| 09 | kirat_status | Budget, Ausgaben, verfügbare Mitglieder, Einstellungen. | kostenlos |
kirat_image und Bildeingaben arbeiten mit Dateien auf Ihrem Computer und eignen sich daher am besten für Claude Code.Sehen Sie dem Rat bei der Arbeit zu.
Echte Aufzeichnungen von Kirats Tools, entstanden am 13. Oktober 2026 mit der Version, die Sie kaufen. Wählen Sie ein Tool und sehen Sie dem Rat bei der Arbeit zu: unabhängige Positionen, gegenseitige Prüfungen, anonyme Rangfolgen und die Gegenstimme. Dies ist eine Aufzeichnung: Nichts, was Sie hier anklicken, ruft ein Modell auf, und nichts verlässt diese Seite.
Tool auswählen
Fünf Fragen aus verschiedenen Bereichen. Wählen Sie eine aus.
Gesendeter Kontext: Solo-Entwickler. Rechnungstool für Freelancer, USD 19 pro Monat, 14-tägige kostenlose Testphase, 30 zahlende Kunden nach 5 Monaten. Anmeldungen kommen überwiegend über zwei Blogartikel, die bei Google ranken. Etwa 12 % der Testphasen werden zu zahlenden Kunden. Der Support kostet schon jetzt etwa 5 Stunden pro Woche. Der Entwickler hat einen Hauptjob und etwa 10 Stunden pro Woche für das Produkt.
Optionen: Free Tier einführen · Nur kostenpflichtig, Testphase auf 30 Tage verlängern · Nur kostenpflichtig, nichts ändern
Gesendeter Kontext: Wir sind eine kleine Digitalagentur. Der Kunde verkauft rund 1.800 Möbelprodukte in Deutschland, Österreich und der Schweiz, hat 3 Mitarbeitende und keinen eigenen Entwickler. Der aktuelle Shop ist eine selbst gehostete WooCommerce-Installation, 6 Jahre alt, mit 31 Plugins, langsamen Seiten und zwei Sicherheitsvorfällen im letzten Jahr. Der Umsatz liegt bei rund EUR 1,2 Millionen pro Jahr. Der Kunde wünscht sich weniger Wartung und weniger Notfälle; er nutzt ein lokales ERP, das Produktdaten als CSV exportiert. Budget für den Neuaufbau: EUR 25.000.
Optionen: Neu auf WooCommerce aufbauen · Zu Shopify migrieren
Gesendeter Kontext: Bäckerei mit 6 Mitarbeitenden in einer deutschen Stadt mit 40.000 Einwohnern. Individuelle Torten und Vorbestellungen haben die beste Marge. Bestellungen kommen heute nur per Telefon und E-Mail herein; die Website zeigt Öffnungszeiten und ein Kontaktformular, aber nichts zum Bestellen. Das Google-Unternehmensprofil hat 4,7 Sterne aus 120 Bewertungen. Bisher keine bezahlte Werbung. Budget: EUR 3.000 für das nächste Quartal, wer den Betrieb führt, hat wenig Zeit.
Optionen: Google Ads · Eine richtige Online-Bestellseite · Gleichmäßig auf beides aufteilen
Gesendeter Kontext: Team aus 8 Engineers. Ein TypeScript-Monolith mit etwa 60.000 Zeilen, eine Postgres-Datenbank, mehrere Deployments pro Tag. Das Abrechnungsmodul ändert sich jede Woche und hat 5 der letzten 8 Produktionsvorfälle verursacht, meist dadurch, dass andere Module direkt lesend und schreibend auf Abrechnungstabellen zugreifen. Niemand im Team hat ein verteiltes System in Produktion betrieben. Die Unternehmensleitung will innerhalb von zwei Quartalen weniger Vorfälle.
Optionen: Abrechnung jetzt in einen Service auslagern · Zuerst die Grenzen im Monolithen härten
Gesendeter Kontext: Titel-und-Abstract-Screening von etwa 3.000 Datensätzen für einen systematischen Review in der Versorgungsforschung, der veröffentlicht werden soll. Aktuelles Protokoll: zwei unabhängige menschliche Screener, Konflikte werden durch Diskussion gelöst. Die Personalzeit ist knapp. Der Review folgt PRISMA, und die Gutachter der Zeitschrift werden fragen, wie gescreent wurde. Eine relevante Studie zu übersehen (falscher Ausschluss) ist schlimmer, als eine irrelevante einzuschließen.
Optionen: Ja, den zweiten menschlichen Screener ersetzen · Das LLM als zusätzlichen Screener einsetzen; Menschen lösen Konflikte · Nein, bei zwei menschlichen Screenern bleiben, ohne LLM
Aufgezeichnet am 13. Oktober 2026 mit kirat_vote auf der Standard-Aufwandsstufe; jede Sitzung dauerte unter 20 Sekunden und kostete unter zwei Cent. Fragen, Optionen und Kontext wurden auf Englisch gesendet und sind hier übersetzt, die Begründungen vollständig wiedergegeben. ChatGPT und Gemini antworteten teilweise auf Deutsch (Gemini viermal, ChatGPT einmal); diese Antworten stehen hier im Original, die übrigen sind aus dem Englischen übersetzt. Bei der Frage nach dem Free Tier unterlag Claude 2:1, und sein Einwand blieb im Protokoll. Die Konfidenzwerte sind jeweils die Selbsteinschätzung des Modells.
Fünf Code-Ausschnitte aus verschiedenen Bereichen, jeweils genau so gesendet, wie sie hier stehen. ChatGPT und Gemini prüfen parallel, Claude ergänzt zwei eigene Befunde, und jeder Befund wird von der jeweils anderen Modellfamilie gegengeprüft. Nur bestätigte Befunde zählen. Wählen Sie einen aus.
Schwerpunkt: Sicherheit und Korrektheit eines Zahlungs-Webhooks
Gesendeter Code:
// routes/webhooks.js — payment webhook of a solo invoicing SaaS (Node 20, Express 4, Stripe, pg)
const express = require('express');
const { db } = require('../db');
const router = express.Router();
router.post('/webhooks/stripe', express.json(), async (req, res) => {
const event = req.body;
if (event.type === 'invoice.paid') {
const invoice = event.data.object;
const userId = invoice.metadata.userId;
await db.query('UPDATE users SET plan = $1, paid_until = $2 WHERE id = $3',
['pro', new Date(invoice.period_end * 1000), userId]);
await db.query('INSERT INTO payments (user_id, amount) VALUES ($1, $2)',
[userId, invoice.amount_paid / 100]);
}
if (event.type === 'customer.subscription.deleted') {
await db.query("UPDATE users SET plan = 'free' WHERE stripe_customer = '" + event.data.object.customer + "'");
}
res.sendStatus(200);
});
module.exports = router;
- kritisch
Der Webhook verarbeitet den Request-Body ohne Prüfung der Stripe-Signatur. Jeder externe Aufrufer kann dadurch gefälschte `invoice.paid`- oder `customer.subscription.deleted`-Events senden und Benutzerkonten freischalten beziehungsweise herabstufen. Der JSON-Parser verwirft außerdem den für die Stripe-Signaturprüfung benötigten unveränderten Raw-Body.
Behebung: Für diese Route `express.raw({ type: 'application/json' })` verwenden und vor jeder Verarbeitung `stripe.webhooks.constructEvent(req.body, req.headers['stripe-signature'], webhookSecret)` aufrufen. Darauf achten, dass kein globaler JSON-Parser bereits vorher auf diese Route angewendet wird; ungültige Signaturen mit 400 ablehnen.
- kritisch
Fehlende Validierung der Stripe-Webhook-Signatur. Ein Angreifer kann beliebige gefälschte Webhook-Events an diesen Endpunkt senden, um Konten unberechtigt auf Pro zu setzen oder Datenbankeinträge zu manipulieren.
Behebung: Verwende stripe.webhooks.constructEvent() mit dem Stripe-Webhook-Secret, um die Authentizität und Integrität jedes Events zu überprüfen.
- kritisch
SQL-Injection-Schwachstelle durch direkte Verkettung von Benutzereingaben (event.data.object.customer) in den SQL-Query-String.
Behebung: Nutze parametrisierte Abfragen wie bei den vorherigen Statements: db.query('UPDATE users SET plan = $1 WHERE stripe_customer = $2', ['free', event.data.object.customer]).
- kritisch
Der Webhook prüft die Stripe-Signatur nie, und express.json() verwirft den Raw Body, der dafür nötig ist. Jeder kann ein gefälschtes Event vom Typ invoice.paid per POST senden und ein beliebiges Konto kostenlos auf pro hochstufen.
Behebung: Auf dieser Route express.raw({ type: 'application/json' }) verwenden und das Event mit stripe.webhooks.constructEvent(req.body, req.headers['stripe-signature'], endpointSecret) erzeugen; die Anfrage ablehnen, wenn das fehlschlägt.
- hoch
Die Customer-ID wird direkt in ein SQL-Statement eingesetzt. Ein Wert wie `' OR 1=1 --` kann die WHERE-Klausel manipulieren und sämtliche Benutzer auf den kostenlosen Plan setzen; abhängig von der Datenbankkonfiguration sind weitergehende SQL-Injektionen möglich.
Behebung: Die Abfrage vollständig parametrisieren: `UPDATE users SET plan = 'free' WHERE stripe_customer = $1` mit `[event.data.object.customer]`. Zusätzlich das Event per Stripe-Signatur authentifizieren.
- hoch
Es gibt keine Idempotenzkontrolle. Stripe stellt Webhooks mindestens einmal zu und wiederholt sie bei Timeouts oder Fehlern. Dasselbe `invoice.paid`-Event kann deshalb mehrfach identische Zahlungseinträge erzeugen.
Behebung: Die Stripe-Event-ID oder Invoice-ID im Zahlungsdatensatz speichern, mit einem UNIQUE-Constraint absichern und Eventverarbeitung samt Zahlung atomar als Insert/Upsert ausführen. Bereits verarbeitete Events mit 200 bestätigen, ohne die Geschäftsoperation zu wiederholen.
- hoch
Der `async`-Handler besitzt keine Fehlerweiterleitung. Express 4 fängt abgelehnte Promises aus asynchronen Route-Handlern nicht automatisch ab. Ein DB-Fehler oder ein unvollständiges `invoice.paid`-Objekt führt daher zu einer unbehandelten Promise-Ablehnung und kann unter Node 20 den Prozess beenden, statt kontrolliert eine Fehlerantwort zu liefern.
Behebung: Den Handler mit `try/catch` versehen und Fehler an `next(err)` weitergeben oder einen Async-Wrapper einsetzen. Eingabestruktur vor dem Zugriff validieren und bei temporären Verarbeitungsfehlern kontrolliert einen 5xx-Status zurückgeben, damit Stripe erneut zustellt.
- hoch
Verwendung von express.json() für den Webhook-Endpunkt parst den Body vorab als JSON. Für die Signaturprüfung von Stripe wird jedoch der unveränderte Raw-Body benötigt.
Behebung: Nutze express.raw({ type: 'application/json' }) anstelle von express.json() für den Stripe-Webhook-Route-Handler.
- mittel
Benutzeraktualisierung und Zahlungseintrag sind zwei unabhängig bestätigte Datenbankoperationen. Scheitert das INSERT nach erfolgreichem UPDATE, erhält der Benutzer den Pro-Plan, obwohl kein korrespondierender Zahlungsdatensatz existiert.
Behebung: Beide Operationen zusammen mit der Idempotenzmarkierung in einer Datenbanktransaktion auf demselben Client ausführen und bei jedem Fehler vollständig zurückrollen.
- mittel
Die Verarbeitung berücksichtigt nicht, dass Stripe Events außerhalb ihrer Erstellungsreihenfolge zustellen kann. Ein verspätetes älteres `invoice.paid` kann `paid_until` zurücksetzen; ein verspätetes `customer.subscription.deleted` kann einen inzwischen reaktivierten Benutzer erneut auf `free` setzen.
Behebung: Den aktuellen Subscription-Zustand anhand stabiler Stripe-IDs abgleichen, beispielsweise durch Abruf bei Stripe, und Zustandsübergänge beziehungsweise den letzten verarbeiteten Event-Zeitpunkt persistieren. `paid_until` mindestens nur vorwärts aktualisieren und Lösch-Events nicht blind auf den aktuellen Benutzerzustand anwenden.
- mittel
`amount_paid / 100` setzt ungeprüft voraus, dass die Währung genau zwei Dezimalstellen hat. Das ist etwa für JPY falsch. Zudem wird die Währung nicht mitgespeichert, wodurch der Betrag im Zahlungsdatensatz ohne eindeutige Einheit ist.
Behebung: Beträge vorzugsweise unverändert in der kleinsten Währungseinheit zusammen mit `invoice.currency` speichern. Falls Hauptwährungseinheiten benötigt werden, die Umrechnung anhand der jeweiligen Währungsexponenten durchführen.
- mittel
Fehlendes Exception-Handling in einer asynchronen Express-4-Route. Bei einem Datenbankfehler oder fehlenden Feldern führt dies zu einer Unhandled Promise Rejection, die die Anwendung abstürzen lassen kann.
Behebung: Füge einen try-catch-Block hinzu und passe Fehler an next(err) weiter oder verwende ein Utility wie express-async-handler.
- mittel
Keine Validierung auf Vorhandensein von invoice.metadata.userId. Wenn das Feld metadata oder userId fehlt oder undefined ist, schlagen die SQL-Queries fehl oder arbeiten mit ungültigen Werten.
Behebung: Prüfe vor Ausführung der Datenbankabfragen explizit, ob invoice.metadata und invoice.metadata.userId vorhanden und gültig sind.
- mittel
Stripe wiederholt Webhooks und kann dasselbe Event mehr als einmal zustellen. Jede Zustellung legt eine weitere Zahlungszeile an, sodass Umsatzberichte doppelt zählen.
Behebung: event.id (oder die Rechnungs-ID) mit einem Unique Constraint speichern und Events überspringen, die bereits verarbeitet wurden.
Schwerpunkt: Sicherheit und Korrektheit eines WooCommerce-Import-Plugins
Gesendeter Code:
<?php
// erp-import.php — custom plugin: imports the ERP's CSV export into WooCommerce (WordPress 6, WooCommerce 9)
add_action('wp_ajax_erp_import', 'erp_import');
add_action('wp_ajax_nopriv_erp_import', 'erp_import');
function erp_import() {
global $wpdb;
$path = $_POST['file'];
$rows = array_map('str_getcsv', file($path));
foreach ($rows as $row) {
[$sku, $name, $price, $stock] = $row;
$id = $wpdb->get_var("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_sku' AND meta_value = '$sku'");
if (!$id) continue;
update_post_meta($id, '_price', $price);
update_post_meta($id, '_regular_price', $price);
update_post_meta($id, '_stock', $stock);
wp_update_post(['ID' => $id, 'post_title' => $name]);
}
echo 'Imported ' . count($rows) . ' rows';
wp_die();
}
- kritisch
Der Import ist über `wp_ajax_nopriv_erp_import` öffentlich erreichbar; auch beim authentifizierten Hook fehlen Capability- und Nonce-Prüfungen. Dadurch können anonyme Benutzer beziehungsweise CSRF-Angriffe Produktnamen, Preise und Bestände verändern.
Behebung: Den `nopriv`-Hook entfernen, vor jeder Verarbeitung eine geeignete Capability wie `manage_woocommerce` prüfen und die Anfrage mit `check_ajax_referer()` absichern.
- kritisch
Der Hook wp_ajax_nopriv_erp_import gewährt unauthentifizierten Besuchern Zugriff auf die Import-Funktion.
Behebung: Den nopriv-Hook entfernen und die Berechtigung mittels current_user_can('manage_options') prüfen.
- kritisch
Der Dateipfad aus $_POST['file'] wird ungeprüft an file() übergeben, was Path Traversal und Arbitrary File Read (LFI) ermöglicht.
Behebung: Dateiuploads über $_FILES abwickeln oder den Eingabepfad strikt auf zugelassene Verzeichnisse (z. B. wp_upload_dir()) validieren.
- kritisch
SQL-Injection-Schwachstelle, da $sku unbereinigt direkt in die SQL-Abfrage eingefügt wird.
Behebung: Prepared Statements mit $wpdb->prepare() nutzen.
- kritisch
Der Import ist für wp_ajax_nopriv registriert, und es gibt weder eine Capability-Prüfung noch eine Nonce. Wer die Seite besucht, kann ihn auslösen und Preise, Lagerbestände und Produktnamen überschreiben.
Behebung: Den nopriv-Hook entfernen, current_user_can('manage_woocommerce') prüfen und mit check_ajax_referer() eine Nonce verifizieren, bevor irgendetwas geschieht.
- hoch
Der vom Client gelieferte Pfad wird ungeprüft an `file()` übergeben. Damit können beliebige lesbare lokale Dateien und – abhängig von `allow_url_fopen` – externe oder interne URLs verarbeitet werden, was unerwünschte Datei-Zugriffe und Blind-SSRF ermöglicht.
Behebung: Keine frei wählbaren Pfade akzeptieren. Nur serverseitig bekannte Upload-IDs verwenden, den kanonischen Pfad gegen ein festes Importverzeichnis prüfen und ausschließlich reguläre lokale CSV-Dateien erlauben.
- hoch
`$sku` stammt aus der CSV und wird direkt in SQL interpoliert. Ein SKU-Wert mit SQL-Metazeichen kann die Abfrage manipulieren und unter anderem eine beliebige Post-ID als Aktualisierungsziel auswählen.
Behebung: Die Abfrage mit `$wpdb->prepare()` parametrisieren, beispielsweise mit `meta_value = %s`, oder die WooCommerce-Funktion zur Produktsuche anhand der SKU verwenden.
- hoch
`file()` lädt die komplette Eingabe in den Speicher und `array_map()` erzeugt zusätzlich das vollständige geparste Array. Ohne Größenlimit kann eine große oder endlose entfernte Ressource Speicher, Laufzeit und PHP-Worker erschöpfen; die öffentliche Erreichbarkeit verschärft dies.
Behebung: Dateigröße und Zeilenzahl begrenzen, die Datei lokal mit `fopen()` öffnen und Datensätze streaming-basiert über `fgetcsv()` verarbeiten. Zusätzlich Rate-Limits beziehungsweise einen kontrollierten Hintergrundjob einsetzen.
- hoch
Fehlende CSRF-Absicherung (Nonce-Validierung).
Behebung: Zu Beginn der Funktion check_ajax_referer() aufrufen.
- hoch
Der Dateipfad kommt direkt aus der Anfrage und wird an file() übergeben. Angreifende können jede Datei lesen, die der Webserver lesen kann, oder eine entfernte URL, wenn allow_url_fopen aktiviert ist.
Behebung: Eine hochgeladene Datei über wp_handle_upload() annehmen oder nur aus einem einzigen festen Importverzeichnis lesen; niemals einen Pfad aus der Anfrage übernehmen.
- mittel
Es wird vorausgesetzt, dass jede Zeile exakt vier verwertbare Spalten besitzt. Leere oder beschädigte Zeilen liefern fehlende Werte, wodurch Warnungen entstehen und Name, Preis oder Bestand unbeabsichtigt auf leere Werte gesetzt werden können.
Behebung: Vor der Destrukturierung Spaltenzahl und Pflichtfelder prüfen, leere Zeilen überspringen und fehlerhafte Datensätze mit einer klaren Fehlermeldung ablehnen.
- mittel
Die Kombination aus `file()` und `str_getcsv()` parst jede physische Zeile separat. Gültige CSV-Felder mit eingebetteten Zeilenumbrüchen werden dadurch in mehrere fehlerhafte Datensätze zerlegt.
Behebung: Die CSV als Stream mit `fgetcsv()` lesen; diese Funktion verarbeitet mehrzeilige, korrekt quotierte Felder über Datensatzgrenzen hinweg.
- mittel
Preis und Bestand werden ungeprüft als beliebige Strings gespeichert. Nichtnumerische Werte, falsche Dezimalformate oder unzulässige Bestände können die Produktdaten beschädigen und zu inkonsistenten Berechnungen führen.
Behebung: Preis und Bestand vor dem Schreiben validieren und mit WooCommerce-Helfern wie `wc_format_decimal()` und `wc_stock_amount()` normalisieren; ungültige oder fachlich unzulässige Werte zurückweisen.
- mittel
WooCommerce-Daten werden direkt als Post-Meta geändert. Dadurch werden zugehörige Zustände wie `_stock_status`, Produkt-Lookup-Tabellen und gegebenenfalls Caches nicht zuverlässig mit den neuen Preisen und Beständen synchronisiert.
Behebung: Das Produkt über `wc_get_product()` laden, die CRUD-Methoden wie `set_regular_price()`, `set_price()` und `set_stock_quantity()` verwenden, den Bestandsstatus beziehungsweise `manage_stock` fachlich setzen und anschließend `save()` aufrufen.
- mittel
Die SKU-Suche betrachtet sämtliche Post-Metadaten und prüft weder Post-Typ noch, ob die gefundene ID tatsächlich ein WooCommerce-Produkt oder eine Variation ist. Bei doppelten oder zweckfremden `_sku`-Metadaten wird außerdem ein nicht deterministischer Treffer aktualisiert.
Behebung: `wc_get_product_id_by_sku()` verwenden und das Ergebnis anschließend mit `wc_get_product()` sowie dem erwarteten Produkttyp validieren; doppelte SKUs als Importfehler behandeln.
- mittel
Rückgabewerte von `update_post_meta()` und `wp_update_post()` werden ignoriert. Der Import kann teilweise scheitern oder abbrechen, meldet aber dennoch die Gesamtzahl gelesener Zeilen als erfolgreich importiert.
Behebung: Erfolg und Fehler pro Produkt erfassen, `wp_update_post(..., true)` verwenden, nur tatsächlich aktualisierte Datensätze zählen und eine strukturierte Fehlerantwort ausgeben. Für große Importe einen wiederaufnehmbaren Hintergrundjob vorsehen.
- mittel
Für jede CSV-Zeile werden mindestens eine Suchabfrage und mehrere einzelne Schreiboperationen synchron ausgeführt. Große Importe verursachen dadurch viele Datenbank-Roundtrips, können in ein Request-Timeout laufen und einen nur teilweise aktualisierten Katalog hinterlassen.
Behebung: Den Import in begrenzten Batches als Hintergrundprozess ausführen, SKUs gesammelt auflösen und Fortschritt sowie Wiederaufnahmezustand speichern.
- mittel
file() liest die komplette Datei auf einmal in den Arbeitsspeicher, was bei großen CSV-Dateien zu Memory-Exhaustion-Fehlern führt.
Behebung: Datei zeilenweise per fopen() und fgetcsv() streamen.
- mittel
Das Array-Destructuring setzt voraus, dass jede Zeile mindestens 4 Elemente enthält; andernfalls kommt es zu PHP-Warnings oder Uninitialized Index Errors.
Behebung: Vor dem Entpacken mit count($row) prüfen, ob ausreichend Spalten vorhanden sind.
- mittel
Datenbankabfragen und Post-Updates erfolgen einzeln in einer Schleife (N+1-Problem), was die Ausführungszeit stark verlangsamt.
Behebung: Import in Batches aufteilen und Abfragen/Updates bündeln.
- niedrig
Fehler von `file()` werden nicht geprüft. Bei einem fehlenden, unlesbaren oder nicht unterstützten Pfad liefert `file()` `false`, worauf `array_map()` unter aktuellen PHP-Versionen einen `TypeError` auslösen kann.
Behebung: Öffnen und Lesen explizit prüfen, PHP-Warnungen nicht als Kontrollfluss verwenden und bei Fehlern eine passende HTTP- beziehungsweise `wp_send_json_error()`-Antwort zurückgeben.
Schwerpunkt: Sicherheit und Korrektheit eines Bestell- und Zahlungsablaufs
Gesendeter Code:
// routes/order.js — order endpoint of the bakery's ordering page (Node 20, Express 4, pg)
const express = require('express');
const { pool } = require('../db');
const { sendConfirmation } = require('../mail');
const router = express.Router();
router.post('/order', async (req, res) => {
const { cakeId, pickupDate, name, email, price, note } = req.body;
const cake = await pool.query(`SELECT * FROM cakes WHERE id = ${cakeId}`);
if (!cake.rows.length) return res.status(404).send('Unknown cake');
const order = await pool.query(
'INSERT INTO orders (cake_id, pickup_date, name, email, amount, note) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id',
[cakeId, pickupDate, name, email, price, note]
);
sendConfirmation(email, order.rows[0].id);
res.redirect(`/pay?order=${order.rows[0].id}&amount=${price}`);
});
module.exports = router;
- kritisch
cakeId wird direkt in den SQL-String interpoliert. Ein Angreifer kann SQL-Ausdrücke oder zusätzliche Anweisungen einschleusen und dadurch Daten lesen beziehungsweise verändern oder die Datenbank belasten.
Behebung: Auch diese Abfrage parametrisieren, z. B. `SELECT ... FROM cakes WHERE id = $1` mit `[cakeId]`, und cakeId zusätzlich auf den erwarteten Typ prüfen.
- kritisch
SQL-Injection-Schwachstelle durch direkte Template-String-Interpolation von cakeId in der SQL-Abfrage.
Behebung: Verwende eine parametrisierte SQL-Abfrage: pool.query('SELECT * FROM cakes WHERE id = $1', [cakeId]).
- kritisch
Clientseitige Preismanipulation möglich. Der Preis wird aus req.body übernommen und direkt gespeichert sowie verarbeitet.
Behebung: Lese den Preis serverseitig aus der Datenbank (cake.rows[0].price) ab und vertraue nicht dem vom Client gesendeten Wert.
- kritisch
cakeId aus dem Request-Body wird in den SQL-String interpoliert: SQL-Injection.
Behebung: Eine parametrisierte Abfrage verwenden: SELECT * FROM cakes WHERE id = $1.
- hoch
Der zu speichernde und an den Zahlungsfluss übergebene Betrag stammt vollständig aus `req.body.price`. Ein Kunde kann für einen beliebigen Kuchen einen manipulierten, negativen oder sehr kleinen Betrag eintragen.
Behebung: Den Preis ausschließlich serverseitig aus dem ausgewählten Kuchen beziehungsweise einer unveränderlichen Preisversion ermitteln. Beim Zahlungsanbieter eine serverseitige Payment-Session mit diesem Betrag erzeugen und den erwarteten Betrag bei der Zahlungsbestätigung erneut serverseitig prüfen.
- hoch
Die Bestellung wird angelegt und eine Bestätigung versandt, bevor irgendeine erfolgreiche Zahlung nachgewiesen wurde. Abgebrochene oder absichtlich nicht bezahlte Vorgänge erscheinen dadurch als bestätigte Bestellungen und können beliebig erzeugt werden.
Behebung: Bestellungen zunächst mit einem Status wie `pending_payment` anlegen. Erst nach einer authentifizierten, idempotent verarbeiteten Zahlungsanbieter-Benachrichtigung auf `paid` wechseln und dann die Bestätigung versenden beziehungsweise Produktion oder Reservierung auslösen.
- hoch
Fehlende Fehlerbehandlung in asynchroner Express-4-Route. Datenbank- oder Laufzeitfehler führen zu unbehandelten Promise Rejections.
Behebung: Verwende einen try/catch-Block und leite Fehler mit next(err) weiter oder nutze ein Paket wie express-async-errors.
- hoch
Der Betrag wird vom Client übernommen (price im Request-Body), sodass ein Kunde seinen eigenen Preis festlegen kann.
Behebung: Den Preis serverseitig aus der Zeile in cakes lesen und jeden Wert vom Client ignorieren.
- mittel
Der asynchrone Handler besitzt keine Fehlerweiterleitung. Express 4 verarbeitet abgelehnte Promises aus `async`-Handlern nicht automatisch; Datenbank- oder synchrone Mailfehler können daher zu unbeantworteten Requests und unhandled rejections führen.
Behebung: Den Handler mit `try/catch` umgeben und Fehler an `next(err)` weiterreichen oder einen etablierten Async-Wrapper verwenden. Zusätzlich eine zentrale Fehlerbehandlung konfigurieren.
- mittel
Das Ergebnis von `sendConfirmation` wird weder awaited noch anderweitig auf Fehler behandelt. Eine Promise-Ablehnung kann unhandled bleiben; zugleich erhält der Client bereits eine Erfolgsantwort, obwohl der Mailversand fehlgeschlagen sein kann.
Behebung: Den Versand nach bestätigter Zahlung über eine persistente Outbox beziehungsweise Job-Queue mit Wiederholungen ausführen. Mindestens die Promise awaiten und Fehler kontrolliert protokollieren beziehungsweise behandeln.
- mittel
Es gibt keinen Idempotenzschutz. Browser-Wiederholungen, Doppelklicks oder Netzwerk-Retries erzeugen jeweils eine neue Bestellung und gegebenenfalls mehrere Bestätigungen beziehungsweise Zahlungsversuche.
Behebung: Eine Idempotency-Key- oder Checkout-Session-ID akzeptieren, sie mit einem Unique Constraint absichern und bei Wiederholungen die bereits vorhandene Bestellung zurückgeben.
- mittel
pickupDate, name, email, price und note werden ohne fachliche oder syntaktische Validierung verarbeitet. So können etwa vergangene oder ungültige Abholtermine, fehlende Kundendaten und ungeeignete Feldwerte gespeichert werden; Datenbankfehler treten zudem erst spät und unkontrolliert auf.
Behebung: Ein Request-Schema mit Typen, Pflichtfeldern, Längenlimits und normalisierten Formaten verwenden. Abholtermine gegen Zeitzone, Vorlaufzeit und zulässige Öffnungs- beziehungsweise Kapazitätsregeln prüfen; den Preis nicht als Client-Eingabe akzeptieren.
- mittel
Asynchroner Aufruf von sendConfirmation wird weder mit await erwartet noch auf Fehler abgefangen.
Behebung: Setze await vor sendConfirmation und behandle mögliche Fehler beim E-Mail-Versand.
- niedrig
Unvollständige Eingabevalidierung für Felder wie email, pickupDate, name und note.
Behebung: Implementiere eine Schema-Validierung (z. B. mit Zod oder express-validator) vor der Verarbeitung der Anfragedaten.
Schwerpunkt: Korrektheit und Datenintegrität einer Abrechnungsfunktion
Gesendeter Code:
// billing/applyCredit.ts — billing module in the monolith (TypeScript, node-postgres)
import { pool } from '../db';
export async function applyCredit(customerId: string, invoiceId: string, creditCents: number) {
const inv = await pool.query('SELECT total_cents, status FROM invoices WHERE id = $1', [invoiceId]);
const balance = await pool.query('SELECT credit_cents FROM customers WHERE id = $1', [customerId]);
const available = balance.rows[0].credit_cents;
if (creditCents > available) throw new Error('Not enough credit');
const newTotal = inv.rows[0].total_cents - creditCents;
await pool.query('UPDATE invoices SET total_cents = $1 WHERE id = $2', [newTotal, invoiceId]);
await pool.query('UPDATE customers SET credit_cents = credit_cents - $1 WHERE id = $2', [creditCents, customerId]);
if (newTotal <= 0) {
await pool.query("UPDATE invoices SET status = 'paid' WHERE id = $1", [invoiceId]);
}
return newTotal * 1.19 / 100;
}
- kritisch
Fehlende Datenbanktransaktion und Zeilensperre. Bei parallelen Anfragen kann es zu Race Conditions (z. B. Double Spending von Guthaben) und unvollständigen Updates im Fehlerfall kommen.
Behebung: Verwende einen Client aus dem Pool mit BEGIN/COMMIT und nutze SELECT FOR UPDATE, um Zeilen atomar zu sperren und zu aktualisieren.
- hoch
Die drei zusammengehörigen Updates werden nicht in einer Datenbanktransaktion ausgeführt. Schlägt die Abbuchung des Kundenguthabens oder die Statusänderung fehl, kann die Rechnung bereits reduziert sein, ohne dass das Guthaben korrekt belastet beziehungsweise der Status gesetzt wurde.
Behebung: Einen dedizierten Client aus dem Pool beziehen und alle Prüfungen sowie Updates zwischen BEGIN und COMMIT ausführen; bei jedem Fehler ROLLBACK verwenden.
- hoch
Die Rechnung wird erst gelesen und später mit einem absolut berechneten Wert überschrieben. Zwei parallele Aufrufe können denselben Ausgangswert lesen und sich anschließend gegenseitig überschreiben; beide Guthabenabbuchungen erfolgen dennoch, während nur eine Gutschrift vollständig in der Rechnung sichtbar bleibt.
Behebung: Die betroffene Rechnung innerhalb derselben Transaktion mit SELECT ... FOR UPDATE sperren oder den Betrag atomar per UPDATE ... SET total_cents = total_cents - $1 mit geeigneten Bedingungen ändern.
- hoch
Prüfung und Abbuchung des Kundenguthabens sind nicht atomar. Parallele Aufrufe können beide dieselbe verfügbare Deckung sehen und das Guthaben anschließend unter null reduzieren.
Behebung: Den Kundendatensatz transaktional sperren oder ein bedingtes UPDATE verwenden, etwa UPDATE customers SET credit_cents = credit_cents - $1 WHERE id = $2 AND credit_cents >= $1 RETURNING credit_cents, und genau eine zurückgegebene Zeile verlangen.
- hoch
Es wird nicht geprüft, ob die Rechnung dem angegebenen Kunden gehört. Dadurch kann Guthaben eines Kunden auf eine beliebige über invoiceId bezeichnete Rechnung angewendet werden.
Behebung: Rechnung und Kunde über die Eigentümerbeziehung abfragen und aktualisieren, beispielsweise mit WHERE invoices.id = $1 AND invoices.customer_id = $2; bei fehlender Übereinstimmung abbrechen.
- hoch
Der anzuwendende Kredit wird nicht auf den offenen Rechnungsbetrag begrenzt. Ist creditCents größer als total_cents, wird ein negativer Rechnungsbetrag gespeichert und überschüssiges Kundenguthaben verbraucht.
Behebung: Nur Beträge bis zum offenen Rechnungswert zulassen oder den tatsächlich verwendeten Betrag als min(creditCents, total_cents) bestimmen und ausschließlich diesen vom Kundenguthaben abbuchen.
- hoch
Negative, nicht ganzzahlige oder nicht sicher darstellbare Werte werden nicht abgewiesen. Insbesondere erhöht ein negativer creditCents-Wert den Rechnungsbetrag und zugleich durch die Subtraktion eines negativen Werts das Kundenguthaben.
Behebung: Vor Datenbankzugriffen Number.isSafeInteger(creditCents) && creditCents > 0 verlangen; Geldbeträge durchgehend als ganzzahlige Centwerte behandeln.
- hoch
Der gelesene Rechnungsstatus wird vollständig ignoriert. Damit kann Guthaben auch auf bereits bezahlte, stornierte oder anderweitig nicht mehr änderbare Rechnungen angewendet werden; ein bereits bezahlter Beleg kann dadurch negativ werden.
Behebung: Zulässige Ausgangsstatus explizit definieren und atomar in der UPDATE-Bedingung prüfen, beispielsweise AND status = 'open'. Bei keinem Treffer den Vorgang abbrechen.
- hoch
Zugriff auf balance.rows[0] und inv.rows[0] ohne Vorabprüfung. Wenn ein Kunde oder eine Rechnung nicht gefunden wird, stürzt die Anwendung mit einem Unhandled TypeError ab.
Behebung: Prüfe inv.rows.length und balance.rows.length vor dem Zugriff und wirf eine explizite Fehlermeldung.
- hoch
Fehlende Validierung für creditCents auf negative Werte. Ein negativer Wert hebelt die Prüfung (creditCents > available) aus und führt zu fehlerhaften Guthaben- oder Rechnungsanpassungen.
Behebung: Stelle sicher, dass creditCents eine positive Ganzzahl größer als 0 ist.
- hoch
Die Lesezugriffe und die drei Updates laufen außerhalb einer Transaktion und ohne Zeilensperren. Zwei gleichzeitige Aufrufe können beide die Guthabenprüfung bestehen und dasselbe Guthaben zweimal verbrauchen, und ein Absturz zwischen den Updates hinterlässt Rechnung und Guthabenstand inkonsistent.
Behebung: Alles in einer Transaktion auf einem einzigen Client ausführen, die Zeilen mit SELECT ... FOR UPDATE sperren und erst committen, wenn alle Updates erfolgreich waren.
- hoch
Die Funktion prüft nie, ob die Rechnung zum Kundenkonto gehört oder ob sie noch offen ist. Guthaben eines Kundenkontos kann auf die Rechnung eines anderen Kundenkontos angerechnet werden oder auf eine Rechnung, die bereits bezahlt ist.
Behebung: Die Rechnung mit WHERE id = $1 AND customer_id = $2 AND status = 'open' abfragen und mit einem Fehler abbrechen, wenn keine Zeile zurückkommt.
- mittel
Die Existenz von Rechnung und Kunde wird nicht geprüft. Bei unbekannten IDs führen Zugriffe auf rows[0] zu Laufzeitfehlern statt zu einem kontrollierten fachlichen Fehler; außerdem werden beide Abfragen unnötig ausgeführt, bevor dies auffällt.
Behebung: rowCount beziehungsweise rows.length für beide Abfragen prüfen und einen definierten Not-found-Fehler auslösen; die Prüfung in die Transaktion und möglichst in eine relationale Abfrage integrieren.
- mittel
Der Rückgabewert entspricht weder dem gespeicherten Centbetrag noch einer einfachen Umrechnung in die Hauptwährung: Er addiert pauschal 19 Prozent und verwendet Fließkommaarithmetik. Dadurch kann der Aufrufer einen steuerlich und rundungstechnisch anderen Wert erhalten als den tatsächlich gespeicherten Rechnungsrest.
Behebung: Den verbleibenden Betrag in Cent unverändert zurückgeben oder einen klar typisierten Rückgabewert definieren. Falls Steuerberechnung fachlich erforderlich ist, Steuersatz und Rundungsregel aus den Rechnungsdaten beziehen und mit Integer- oder Decimal-Arithmetik berechnen.
- mittel
Verwendung von IEEE 754-Gleitkomma-Arithmetik (newTotal * 1.19 / 100) für Finanzberechnungen. Dies führt zu Präzisions- und Rundungsfehlern.
Behebung: Rechne durchgehend in Cents mit Ganzzahlen (BigInt/Math.round) oder verwende eine Library für exakte Dezimalarithmetik.
- niedrig
Separierter UPDATE-Befehl für den Rechnungsstatus erzeugt unnötige Datenbank-Roundtrips.
Behebung: Führe die Aktualisierung von total_cents und status in einer einzigen UPDATE-Abfrage zusammen.
Schwerpunkt: Korrektheit einer Screening-Auswertung für ein systematisches Review
Gesendeter Code:
# screening/agreement.py — compares two screeners' include/exclude decisions (Python 3.12, pandas)
import pandas as pd
a = pd.read_csv('screener_a.csv') # columns: record_id, decision ('include'/'exclude')
b = pd.read_csv('screener_b.csv')
merged = a.merge(b, on='record_id', suffixes=('_a', '_b'))
agree = (merged.decision_a == merged.decision_b).mean()
p_inc_a = (merged.decision_a == 'include').mean()
p_inc_b = (merged.decision_b == 'include').mean()
expected = p_inc_a * p_inc_b + (1 - p_inc_a) * (1 - p_inc_b)
kappa = (agree - expected) / (1 - expected)
conflicts = merged[merged.decision_a != merged.decision_b]
excluded = merged[merged.decision_a == 'exclude']
print(f'Records screened: {len(a)}')
print(f"Cohen's kappa: {kappa:.2f}")
excluded.record_id.to_csv('excluded.csv', index=False)
conflicts.to_csv('conflicts.csv', index=False)
- hoch
Der standardmäßige Inner Join entfernt alle record_id-Werte, die nur in einer der beiden Dateien vorkommen. Kappa und Konflikte werden dadurch nur für die Schnittmenge berechnet, ohne fehlende Screenings sichtbar zu machen. Gleichzeitig meldet „Records screened“ in Zeile 18 die Länge von a statt der tatsächlich analysierten Schnittmenge.
Behebung: Einen Outer Join mit merge-Indikator verwenden, die ID-Mengen explizit vergleichen und fehlende Entscheidungen separat melden bzw. als Datenfehler behandeln. Für jede Kennzahl den tatsächlich verwendeten Nenner ausgeben.
- hoch
Die Eindeutigkeit von record_id wird nicht geprüft. Doppelte IDs führen beim Merge zu einem Many-to-many-kartesischen Produkt und gewichten einzelne Studien mehrfach, wodurch Übereinstimmung, Prävalenzen, Kappa und Ausgabedateien verfälscht werden.
Behebung: Vor dem Merge in beiden Dateien record_id auf Nicht-Nullheit und Eindeutigkeit prüfen und bei Duplikaten abbrechen. Zusätzlich merge(..., validate='one_to_one') verwenden.
- hoch
Entscheidungswerte werden nicht validiert. Fehlwerte, Tippfehler, Groß-/Kleinschreibung oder weitere Kategorien werden bei der Berechnung der Include-Prävalenz implizit wie „exclude“ behandelt, während die beobachtete Übereinstimmung exakte Werte vergleicht. Damit entspricht die Berechnung nicht mehr einem binären Cohen-Kappa und kann widersprüchliche Resultate liefern.
Behebung: decision vor der Analyse kontrolliert normalisieren und sicherstellen, dass jeder Wert genau 'include' oder 'exclude' ist. Fehlende oder unbekannte Werte als Datenfehler bzw. unvollständiges Screening separat behandeln.
- hoch
excluded enthält alle von Screener A ausgeschlossenen Datensätze, einschließlich Konflikten, bei denen Screener B „include“ entschieden hat. Solche Datensätze werden somit gleichzeitig nach excluded.csv und conflicts.csv geschrieben. Falls excluded.csv die endgültig ausgeschlossenen Treffer darstellen soll, können ungeklärte Konflikte fälschlich aus dem Review entfernt werden.
Behebung: Ohne dokumentierte Vorrangregel nur übereinstimmende Ausschlüsse auswählen, also (decision_a == 'exclude') & (decision_b == 'exclude'). Konflikte bis zur Konsensentscheidung ausschließlich in conflicts.csv halten.
- hoch
Fälschliche Filterung der ausgeschlossenen Studien: 'excluded' berücksichtigt ausschließlich die Entscheidung von Screener A ('merged.decision_a == "exclude"'). Liegt ein Konflikt vor (Screener A schließt aus, Screener B schließt ein), wird die Studie fälschlicherweise als ausgeschlossen gewertet.
Behebung: Ausschlüsse nur dann exportieren, wenn beide Screener übereinstimmend 'exclude' gewählt haben (z. B. '(merged.decision_a == "exclude") & (merged.decision_b == "exclude")'), oder die Konfliktklärung abwarten.
- hoch
excluded.csv enthält jeden Datensatz, den Screener A ausgeschlossen hat, einschließlich der Konflikte, in denen Screener B ihn eingeschlossen hat. Diese Datensätze fallen vor der Konfliktbesprechung heraus, und genau das ist der falsche Ausschluss, den das Protokoll vermeiden muss.
Behebung: Nur Datensätze ausschließen, die beide Screener ausgeschlossen haben: merged[(merged.decision_a == 'exclude') & (merged.decision_b == 'exclude')]; jeden Konflikt zuerst in die Klärung geben.
- mittel
Wenn beide Screener ausschließlich dieselbe Kategorie verwenden, ist expected gleich 1 und der Nenner von Kappa gleich 0. Das Ergebnis wird NaN bzw. kann eine Division-durch-null-Warnung erzeugen; die formatierte Ausgabe „nan“ erklärt nicht, dass Kappa mathematisch nicht definiert ist. Auch eine leere analysierte Schnittmenge führt zu nicht aussagekräftigen NaN-Kennzahlen.
Behebung: Vor der Division prüfen, ob überhaupt gepaarte gültige Entscheidungen vorliegen und ob 1 - expected größer als 0 ist. In degenerierten Fällen Kappa explizit als „nicht definiert“ ausweisen und die zugrunde liegenden Häufigkeiten berichten.
- mittel
Mögliche Division durch Null bei Cohen's Kappa, wenn der erwartete Zufallswert 'expected' gleich 1 ist (z. B. wenn beide Screener für 100% der Datensätze dieselbe Kategorie wählen).
Behebung: Vor der Berechnung abfangen, ob '1 - expected == 0' ist, und in diesem Fall einen definierten Wert (z. B. 1.0 oder NaN) zuweisen.
- mittel
Stummes Verwerfen von Datensätzen durch den Standard-Inner-Join. Wenn Screener A und Screener B unterschiedliche Mengen an 'record_id's bewertet haben, werden Unstimmigkeiten bei den bearbeiteten Studien nicht gemeldet. Zudem entspricht 'len(a)' in der Konsolenausgabe dann nicht der Anzahl tatsächlich gematchter Studien.
Behebung: Prüfen, ob 'len(a) == len(b) == len(merged)' gilt, oder einen Outer Join durchführen, um unvollständig bewertete Datensätze explizit anzuzeigen.
- mittel
Der Inner Merge verwirft stillschweigend Datensätze, über die nur ein Screener entschieden hat, und die ausgegebene Anzahl verwendet len(a). Nicht gescreente Datensätze verschwinden sowohl aus der Übereinstimmung als auch aus den PRISMA-Zahlen.
Behebung: Mit how='outer', indicator=True mergen und abbrechen oder eine Meldung ausgeben, wenn einem Datensatz die Entscheidung eines der beiden Screener fehlt.
- niedrig
Fehlende Eingabebereinigung und Behandlung von Fehlwerten in der Spalte 'decision'. Groß-/Kleinschreibung, Whitespaces oder NaN-Werte führen zu fehlerhaften Vergleichen.
Behebung: Spaltenwerte vor dem Vergleich bereinigen (z. B. mit '.str.strip().str.lower()') und Datentypsicherheit sicherstellen.
Gezeigt: jeder bestätigte Befund mit seiner Behebung, so wie die Mitglieder ihn geschrieben haben; die Begründung der Prüfer ist auf ihr Urteil gekürzt. Duplikate werden nicht zusammengeführt, ein Problem kann also mehrfach erscheinen, wenn mehrere Mitglieder es melden. Was die Mitglieder auf Deutsch geschrieben haben, steht hier im Original; was auf Englisch gesendet oder geschrieben wurde, ist hier übersetzt, Code-Kommentare ausgenommen.
Fünf Ideen-Briefings aus verschiedenen Bereichen. ChatGPT und Gemini arbeiten in drei Spuren, Claude steuert eine Idee bei, und beide Mitglieder bewerten jede Idee anonym (je 1–10, bis zu 20 Punkte). Wählen Sie eines aus.
Thema: Ideen, wie jemand, der allein entwickelt, mehr Lesende von zwei bei Google rankenden Blogposts zu Testanmeldungen für ein Rechnungstool für Freelancer bringt
Gesendeter Kontext: Rechnungstool für Freelancer, 19 USD pro Monat, 14 Tage kostenlos testen, 30 zahlende Kundinnen und Kunden nach 5 Monaten. Anmeldungen kommen überwiegend über zwei Blogposts, die bei Google ranken (wie man eine Freelancer-Rechnung schreibt; wie man verspäteten Zahlungen nachgeht). Etwa 12 % der Testphasen werden zu zahlenden Abos. Wer das Produkt entwickelt, hat einen Hauptjob und etwa 10 Stunden pro Woche dafür. HARTE VORGABE: keine bezahlte Werbung. HARTE VORGABE: höchstens 3 Stunden pro Woche hierfür.
- 1
Drei echte Versände statt der 14-Tage-Uhr
Eine Testphase erproben, die nach drei versendeten Rechnungen oder Zahlungserinnerungen endet statt nach 14 Kalendertagen. Das bricht bewusst die weiche Annahme, dass eine zeitlich begrenzte Testphase angemessen ist: Freelancer stellen in einem willkürlichen Zwei-Wochen-Fenster womöglich gar keine Rechnung, sodass die aktuelle Testphase ablaufen kann, bevor das Produkt seinen Wert bewiesen hat. Den Monatstarif zu $19 unverändert lassen und die Umwandlung von Aktivierung zu zahlendem Abo nach Kohorten vergleichen.
- 2
Die Aufgabe direkt im Artikel erledigen
Einen kleinen Rechnungsgenerator in „Wie man eine Freelancer-Rechnung schreibt“ einbetten: Lesende geben Auftraggeber, Betrag, Fälligkeitsdatum und Zahlungsbedingungen ein und sehen dann eine fertige Vorschau. „Diese Rechnung senden oder speichern“ legt eine Testphase an, in der diese Angaben bereits geladen sind, und schließt so die Lücke zwischen Lernen und Tun. In wöchentlichen Etappen von höchstens drei Stunden bauen und den Wartungsaufwand danach nahe null halten.
- 3
Den Mahn-Artikel zur Konsole fürs Eintreiben machen
Als Ersetzung des eingebetteten Rechnungsgenerators in einem Schritt können Lesende einen überfälligen Betrag und ein Fälligkeitsdatum eingeben und erhalten eine datierte Folge von drei Mahnnachrichten. Der Start einer Testphase speichert den Schuldner, plant die Nachrichten und öffnet den ersten Entwurf versandfertig. Das bewahrt das stärkste Muster — ein nützliches Ergebnis vor der Anmeldung — und trifft zugleich die Absicht des zweiten Posts.
- 4
Den Moment der Conversion in den Kalender des Schuldners legen
Im Artikel über verspätete Zahlungen eine generierte .ics-Datei anbieten, mit Erinnerungen an das Fälligkeitsdatum und eskalierenden Nachfassterminen an Tag 1, 7 und 14. Jeder Kalendereintrag enthält einen Deep Link, der den passenden Mahnablauf mit vorausgefüllten Daten öffnet, und holt die Lesenden zurück, wenn der Schmerz real ist, statt während sie nur recherchieren. Das erfordert keine Erfassung von E-Mail-Adressen und kann unbeaufsichtigt laufen.
- 5
Dauerhaft kostenfreier Tarif für einen Kunden statt Testphase
Diese Idee bricht die weiche Vorgabe der 14-Tage-Testversion und ersetzt sie durch einen Freemium-Tarif für genau einen aktiven Kunden. Freelancer nutzen das Produkt dauerhaft kostenfrei für ihren ersten Kunden und upgraden nahtlos auf die 19-Dollar-Flatrate, sobald ein zweiter Kunde hinzukommt.
- 6
Lesende nach ihrem akuten Problem lenken
Generische Banner für die Testphase durch drei Inline-Optionen ersetzen, etwa „Ich brauche meine erste Rechnung“, „Ich stelle regelmäßig Rechnungen“ und „Ein Kunde zahlt schon zu spät“. Jede Option öffnet einen passenden Onboarding-Zustand statt derselben Startseite, und Abschnitts-IDs im Artikel können sinnvolle Voreinstellungen vorauswählen. Abgeschlossene Aktivierungen der Testphase messen, nicht nur CTA-Klicks, und pro Woche eine Route testen.
- 7
Drei forensische Rechnungs-Makeovers veröffentlichen
Mit Erlaubnis drei anonymisierte Kundenrechnungen in statische Vorher-nachher-Fallstudien verwandeln, die genau zeigen, was sich geändert hat und warum. Jedes Makeover neben den passenden Ratschlag im rankenden Post setzen, mit einem CTA, der dieselbe korrigierte Struktur als bearbeitbare Vorlage in der Testphase öffnet. Konkrete Belege aus einem kleinen Kundenstamm können glaubwürdiger sein als allgemeine Testimonials.
- 8
Lesende ihren Fortschritt zwischen beiden Posts mitnehmen lassen
Die von Lesenden gewählte Währung, den Rechnungsstand und das Fälligkeitsdatum lokal im Browser speichern und diesen Zustand nutzen, wenn sie zwischen den beiden Artikeln wechseln. Wer einen Rechnungsplan erstellt hat, sieht später einen kontextbezogenen Hinweis wie „Ihre Rechnung ist jetzt 3 Tage überfällig — öffnen Sie die vorbereitete Nachfass-Nachricht“, mit vorausgefülltem Onboarding für die Testphase. So entsteht eine leichtgewichtige Reise über zwei Posts, ohne Konto und ohne laufende Content-Produktion.
- 9
Interaktiver Mahnschreiben-Konfigurator
Ergänzen Sie den Artikel zum Nachfassen überfälliger Zahlungen um einen Generator für abgestufte Mahnschreiben. Nach der Texteingabe wird die Vorlage generiert, kombiniert mit dem CTA, automatische Zahlungserinnerungen für zukünftige Rechnungen im Testzugang einzurichten.
- 10
Sofort-Senden Magic-Link ohne vorherige Registrierung
Mutation des In-Content-Generators: Der Leser gibt Rechnungsdaten direkt im Blogartikel ein und klickt auf Rechnung jetzt sofort senden. Das System erstellt im Hintergrund nahtlos ein Test-Konto und versendet die E-Mail direkt; die Passwortvergabe erfolgt erst im Anschluss.
- 11
Live-Rechnungs-Generator direkt im Blogartikel
Betten Sie ein einfaches, interaktives Formulartool direkt in den Artikel zum Schreiben von Rechnungen ein. Leser tippen ihre Rechnungsdaten ein und können das fertige PDF sofort kostenlos herunterladen. Ein prominenter Button bietet an, die Rechnung mit einem Klick digital zu versenden und den Zahlungsstatus im 14-Tage-Testzugang zu tracken.
- 12
Einmalige Pay-Per-Use Mahnung statt Monats-Abo
Diese Idee bricht die weiche Vorgabe des reinen SaaS-Abo-Modells von 19 Dollar pro Monat. Leser des Late-Payment-Artikels können für eine einmalige Gebühr von 5 Dollar ein rechtssicheres Mahnschreiben samt Tracking-Link versenden lassen, wobei die Gebühr bei spätestem Abo-Abschluss voll angerechnet wird.
- 13
Vorlage, die sich im Tool öffnet
Die Rechnungsvorlage aus dem Post als einsatzbereite Rechnung im Tool anbieten: Ein Klick öffnet ein vorausgefülltes Testkonto statt eines Datei-Downloads.
- 14
Problembezogener Exit-Intent mit automatisierter E-Mail-Sequenz
Implementieren Sie ein Exit-Intent-Popup auf dem Late-Payment-Artikel, das eine Notfall-E-Mail-Vorlage für säumige Kunden gegen E-Mail-Adresse anbietet. Eine automatisierte dreiteilige E-Mail-Sequenz erklärt anschließend passiv, wie automatierte Workflows Zahlungsverzug reduzieren und verlinkt auf den Testzugang.
Thema: Ideen, wie eine kleine Digitalagentur aus einem einmaligen Shop-Relaunch einen laufenden Betreuungsvertrag macht, den das Kundenunternehmen wirklich will
Gesendeter Kontext: Agentur mit 4 Personen. Das Kundenunternehmen verkauft etwa 1.800 Möbelprodukte in Deutschland, Österreich und der Schweiz, hat 3 Mitarbeitende und keine eigene Entwicklung, Umsatz etwa 1,2 Millionen EUR pro Jahr. Der alte, selbst gehostete WooCommerce-Shop hatte 31 Plugins und im vergangenen Jahr zwei Sicherheitsvorfälle; das Kundenunternehmen will weniger Wartung und weniger Notfälle. Ein lokales ERP exportiert Produktdaten als CSV. Budget für den Relaunch: 25.000 EUR. HARTE VORGABE: kein Lock-in; das Kundenunternehmen muss jederzeit mit allen Daten und Zugängen gehen können. HARTE VORGABE: keine Neueinstellungen in der Agentur.
- 1
Budgetbruch: Betrieb vor Launch-Glanz
Diese Idee bricht gezielt die weiche Vorgabe des 25.000-EUR-Rebuild-Budgets: Angeboten werden beispielsweise 22.000 EUR für einen bewusst schlanken Launch plus 12.000 EUR für ein verbindliches erstes Betriebsjahr. Dafür entfallen Nice-to-have-Funktionen aus dem Erstprojekt; finanziert werden stattdessen Importhärtung, Restore-Proben, Monitoring und monatliche Verbesserungen. Das höhere Gesamtvolumen lohnt sich, weil der Kunde nicht erneut einen scheinbar fertigen Shop kauft, dessen reale Betriebskosten erst nach dem Launch sichtbar werden; alle Zugänge, Daten und Arbeitsergebnisse bleiben jederzeit übertragbar.
- 2
CSV Product Gatekeeper
Vor jedem ERP-Import prüft eine automatisierte Pipeline die CSV auf fehlende Preise, Dubletten, ungültige Varianten, Bildfehler, DACH-Steuerlogik und verdächtige Bestandsänderungen. Der monatliche Retainer umfasst Regelpflege, Importüberwachung und einen verständlichen Fehlerbericht für die drei Mitarbeitenden. Das macht aus technischer Pflege einen unmittelbar geschäftlichen Nutzen: weniger falsche Produkte, Rückfragen und abgebrochene Käufe.
- 3
Reliability Dividend
Der Kunde zahlt eine moderate Grundgebühr für Überwachung und Pflege; ein zusätzlicher Quartalsbetrag wird nur fällig, wenn vereinbarte Zuverlässigkeitsziele wie erfolgreiche Importe, getestete Wiederherstellung und Reaktionszeiten erreicht wurden. Vermeidbare, durch die Agentur verursachte Störungen erzeugen Serviceguthaben statt abrechenbarer Notfallstunden. Dieses Modell richtet die wirtschaftlichen Anreize auf Prävention aus und nimmt dem Kunden die Angst, die Agentur profitiere von Problemen.
- 4
Exit-ready Care Charter
Der Retainer wird bewusst als Anti-Lock-in-Produkt verkauft: Monitoring, Updates, Backups, Sicherheitsprüfungen und zwei kleine Änderungen pro Monat für etwa 1.200–1.500 EUR. Sämtliche Konten liegen beim Kunden, Code und Importskripte in dessen Repository; monatlich erhält er außerdem Dokumentation, Datenexport und eine kündigungsfähige Übergabemappe. So bezahlt der Kunde für nachweisbare Betriebsfähigkeit statt für Abhängigkeit.
- 5
Saisonaler Release-Zug
Statt beliebiger Supporttickets gibt es vier planbare Commerce-Releases pro Jahr, etwa für Gartenmöbel, Sommerschluss, Black Week und Weihnachten. Im Retainer enthalten sind je Release ein kleines UX- oder Merchandising-Paket, Regressionstests sowie die technische Pflege dazwischen. Das gibt dem Kunden sichtbare Weiterentwicklung und hält den Aufwand für die vierköpfige Agentur bündelbar.
- 6
Der quartalsweise Fluchttest
Einmal pro Quartal stellt die Agentur einen vollständigen Export aus Produkt-, Kunden-, Bestell- und Inhaltsdaten bereit und führt in einer neutralen Testumgebung einen dokumentierten Wiederanlauf durch. Bezahlt wird damit ausgerechnet der regelmäßig bewiesene Ausstieg: Zugangsliste, Restore-Protokoll und Übergabehandbuch gehören dem Kunden. Das harte No-Lock-in-Kriterium wird so vom Einwand zum ungewöhnlichen Verkaufsargument für den Retainer.
- 7
Care Charter plus Wachstumsbörse
Als kleine Mutation der Exit-ready Care Charter werden die enthaltenen Änderungsstunden nicht fest verplant, sondern monatlich zwischen Betrieb, Datenqualität und Conversion-Verbesserungen verschoben; ungenutztes Volumen fließt höchstens ein Quartal weiter. Ein gemeinsames 30-Minuten-Board entscheidet anhand von Risiken und Umsatzchancen über den Einsatz. Der Retainer bleibt exit-ready, fühlt sich aber weniger wie eine Versicherung und mehr wie ein flexibles externes Digitalteam an.
- 8
ERP-Sync & Katalog-Sicherheits-Retainer
Die Agentur übernimmt die kontinuierliche Überwachung und Wartung der Schnittstelle zwischen der lokalen ERP-CSV und dem Onlineshop. Fehlerhafte Datenimporte, fehlende Möbel-Varianten oder falsche Preise werden automatisiert abgefangen, bevor sie live gehen. Das nimmt dem 3-köpfigen Kundenteam die operative Last der Datenpflege komplett ab.
- 9
KI-gestützte Produktdaten-Enrichment-Flatrate
Mutation der ERP-Schnittstellen-Idee: Die Agentur wartet nicht nur den CSV-Import, sondern reichert die Rohdaten automatisch durch KI-Skripte um strukturierte Attribute, SEO-Texte und DACH-spezifische Lieferzeit-Hinweise an. Das spart dem Kunden manuellen Pflegeaufwand und steigert die Sichtbarkeit im Möbelmarkt ohne Agenturnachbesetzung.
- 10
CI/CD-basierter Visual-Regression-Wartungsvertrag
Anstelle von riskanten Live-Updates richtet die Agentur eine Staging-Pipeline ein, die monatliche Plugin-Updates visuell und funktional automatisiert prüft. Der Kunde erhält einen monatlichen Transparenzbericht und garantierte Reaktionszeiten bei Sicherheitslücken. Dies garantiert absolute Stabilität ohne die bisherigen Notfälle.
- 11
Quartalsweises Conversion- & UX-Polishing
Ergänzend zur Basiswartung beinhaltet der Retainer feste Stundenkontingente für die Optimierung von Checkout-Funktionen und Möbel-Variantendarstellungen. Die Agentur analysiert monatlich das Nutzerverhalten in der DACH-Region und setzt renditestarke Anpassungen um. So wird der Retainer vom reinen Kostenfaktor zum Umsatztreiber.
- 12
Safe-Update & Instant-Rollback-Garantie
Mutation des CI/CD-Wartungsvertrags: Der Retainer fokussiert sich rein auf ein garantiertes Zero-Downtime-SLA mit automatisierter Snapshot-Wiederherstellung innerhalb von 15 Minuten bei Zwischenfällen. Das adressiert direkt die Angst des Kunden nach den zwei Sicherheitsvorfällen bei minimalem laufenden manuellen Aufwand.
- 13
Umsatzbeteiligtes Growth-Paket statt Fixbudget
Bricht die weiche Annahme eines starren Einmal-Rebuild-Budgets von 25.000 EUR: Die Rebuild-Kosten werden auf 10.000 EUR gesenkt, gekoppelt an einen monatlichen Retainer mit kleiner Umsatzbeteiligung am Mehrumsatz. Das lohnt sich, weil der Kunde Investitionsrisiko senkt und die Agentur direkt am Wachstum des 1,2 Mio. EUR Shops partizipiert.
- 14
Headless-Architecture Care Service
Bricht die weiche Vorgabe eines klassischen Monolithen-Setups (wie Standard-WooCommerce): Das Frontend wird vom Backend entkoppelt, wodurch Plugin-Sicherheitslücken die Website nicht mehr direkt angreifen können. Das lohnt sich, weil Notfälle strukturell eliminiert werden und der Kunde dank Open-Source-Stack und vollem Git-Zugriff jederzeit portabel bleibt.
- 15
Monatlicher Betreuungsbericht auf einer Seite
Ein einseitiger Monatsbericht mit Uptime, Seitengeschwindigkeit, eingespielten Updates und verhinderten Vorfällen, damit das Kundenunternehmen sieht, wofür der Betreuungsvertrag bezahlt wird.
Thema: Ideen, wie eine Bäckerei vor Ort über ihre neue Online-Bestellseite mehr Vorbestellungen für individuelle Torten bekommt, ohne bezahlte Anzeigen
Gesendeter Kontext: Bäckerei mit 6 Mitarbeitenden in einer deutschen Stadt mit 40.000 Einwohnern. Individuelle Torten und Vorbestellungen haben die beste Marge. Eine neue Online-Bestellseite (Tortenauswahl, Abholtermin, Vorauszahlung) geht nächsten Monat online; bisher kamen Bestellungen nur per Telefon und E-Mail. Das Google-Unternehmensprofil hat 4,7 Sterne aus 120 Bewertungen. Wer den Betrieb führt, hat wenig Zeit, daher müssen die Ideen mit höchstens 2 Stunden pro Woche auskommen. HARTE VORGABE: keine bezahlte Werbung in diesem Quartal. HARTE VORGABE: kein zusätzliches Personal.
- 1
Der jährliche Geburtstags-Autopilot
Beim Checkout können Kundinnen und Kunden freiwillig Anlass und Monat für eine Erinnerung im Folgejahr hinterlegen. Eine automatisierte E-Mail 21 Tage vorher führt zur vorausgefüllten Bestellseite; so baut jede Bestellung einen künftigen Auftrag auf, ohne laufende Akquise und mit sauberer Einwilligung.
- 2
Echte Torten-Slots statt allgemeiner Posts
Die Bestellseite zeigt die real verbleibenden Produktionsplätze der nächsten vier Wochen, etwa „Noch 2 individuelle Torten für Samstag möglich“. Ein wöchentlicher Google-Business-Post verlinkt direkt auf diese Ansicht; Aktualisierung und Post benötigen zusammen höchstens 20 Minuten und erzeugen glaubwürdige Dringlichkeit ohne Rabatt.
- 3
Die Torte reist als eigener Werbeträger
Jede abgeholte Torte erhält eine kleine Karte mit „Diese Torte nachbestellen oder anpassen“ und einem QR-Code zur passenden Variante. Die Karte wird beim Anschneiden sichtbar aufgestellt, sodass genau die anwesenden Geburtstags- oder Hochzeitsgäste den Bestellweg entdecken; ein einmal erstelltes Kartenset verursacht nahezu keinen Wochenaufwand.
- 4
Einmalige Torten-Sprechstunde zum Launch
Am ersten Samstag nach dem Start gibt es vier Stunden lang eine offene Torten-Sprechstunde: Gäste wählen Geschmack und Stil an Musterkarten und geben ihre Bestellung anschließend selbst über bereitliegende QR-Codes auf. Das bricht gezielt die weiche Vorgabe von maximal zwei Stunden Aufwand in dieser Woche; der Mehraufwand lohnt sich, weil dabei reale Bestellungen, beobachtete Bedienprobleme und wiederverwendbare Fotos beziehungsweise Kundenfragen gleichzeitig entstehen — ohne zusätzliches Personal oder bezahlte Werbung.
- 5
Anlass-Partner statt Influencer
Kinder-Spielorte, Fotografen, Floristen, Hochzeitslocations und Vereinsheime erhalten jeweils einen kleinen QR-Aufsteller, der auf eine für ihren Anlass vorkonfigurierte Tortenauswahl führt. Als Gegenleistung nennt die Bäckerei diese Partner auf einer lokalen Empfehlungsseite; fünf gezielte Anfragen pro Monat reichen, Provisionen und bezahlte Reichweite entfallen.
- 6
Torten-Rota für Büros und Vereine
Lokale Büros, Praxen und Vereine bekommen eine Seite, auf der mehrere Geburtstage oder wiederkehrende Termine gesammelt und nacheinander vorausbezahlt werden können. Einmal eingerichtete Quartals-Rotas verwandeln einzelne Anlässe in planbare Serienbestellungen; die Ansprache kann auf zwei Organisationen pro Woche begrenzt werden.
- 7
Hybrid-Torten-Sprechstunde am Verkaufs-Tablet
Bricht gezielt die weiche Vorgabe 'Ausschließliche Online-Bestellung', indem freitags 1 Stunde Beratung im Laden angeboten wird, bei der Bestellungen gemeinsam am Tablet getippt werden. Es lohnt sich, weil unentschlossene und ältere Kunden schrittweise an das neue Online-System herangeführt werden.
- 8
Bewertungen werden zur Entscheidungshilfe
Als kleine Rekombination des stärksten vorhandenen Materials werden zwölf aussagekräftige Sätze aus den 120 Google-Bewertungen mit passenden Tortenstilen verbunden, jeweils mit direktem Bestelllink. So werden die 4,7 Sterne nicht nur als Vertrauenssignal gezeigt, sondern helfen bei der Produktauswahl; die Seite ist nach einmaliger Einrichtung weitgehend wartungsfrei.
- 9
Muster-Torten-Aufsteller mit Shop-Deep-Links
Eine physische Foto-Galerie der schönsten Torten im Verkaufsraum enthält bei jedem Bild einen spezifischen QR-Code, der genau dieses Tortenmodell vorausgewählt im Online-Shop öffnet. Mutation von Idee 1: Verknüpfung von Laden-Ausstellung mit direktem Deep-Link im Shop.
- 10
Google-Profil Optimierung & automatisierte Bewertungs-Links
Das starke Google-Profil (4,7 Sterne) wird um den offiziellen 'Online bestellen'-Button ergänzt und wöchentlich mit einem Foto aktueller Torten bespielt. Bei Abholung erhalten Kunden eine Vorlage per E-Mail mit Link zur Bewertungs- und Nachbestellseite. Dauert unter 30 Minuten pro Woche.
- 11
QR-Code Taster auf Kassenbons & Brot-Tüten
Auf jeden Kassenbon und Verpackungen wird ein auffälliger QR-Code gedruckt, der direkt zum Online-Tortenkonfigurator führt ('Traumtorte für Ihr Fest online planen'). Das wandelt tägliche Laufkundschaft ohne Zusatzaufwand im Verkauf in digitale Vorbesteller um.
- 12
B2B-Partnerschaft mit lokalen Event-Locations
Aufsteller und Flyer mit direktem Buchungscode für die Website werden bei lokalen Restaurants, Event-Scheunen und Hochzeitsplanern platziert. Feiernde Kunden buchen ihre Torte direkt online, während die Location eine kleine Aufwandsentschädigung oder Gegenempfehlung erhält.
- 13
Kita- & Schul-Geburtstagskalender
Kooperation mit örtlichen Kindergärten über Info-Flyer für Elternbeiräte, die einen festen Rabattcode für Kinder-Motivtorten enthalten. Mutation von Idee 3: Statt allgemeiner B2B-Partner wird gezielt der hochfrequente Anlass Kindergeburtstag automatisiert adressiert.
- 14
Monatlicher Motivtorten-Mini-Workshop
Bricht gezielt die weiche Vorgabe 'maximal 2 Stunden Zeitaufwand pro Woche', da einmal im Monat ein 4-stündiger Workshop stattdfindet. Es lohnt sich, weil die Teilnehmer als Markenbotschafter fungieren, begeisterte Social-Media-Inhalte erzeugen und Folgebestellungen garantiert über den Online-Shop tätigen.
- 15
Bestelllink auf jedem Tortenkarton
Einen QR-Code zur Bestellseite auf die Tortenkartons und Kassenbons drucken, damit jeder Kunde, der bereits eine Torte kauft, für den nächsten Geburtstag nachbestellen kann, ohne anzurufen.
Kirats Notiz an Claude: Beste Regelbrecher-Idee erst auf Rang 4: „Einmalige Torten-Sprechstunde zum Launch“ — sie bricht bewusst eine weiche Vorgabe. Einmal in ihrer stärksten Form durchdenken, bevor sie verworfen wird.
Thema: Ideen, um vom Abrechnungsmodul verursachte Produktionsvorfälle innerhalb von zwei Quartalen zu reduzieren, ohne es in einen separaten Service auszulagern
Gesendeter Kontext: Team aus 8 Engineers. Ein TypeScript-Monolith mit etwa 60.000 Zeilen, eine Postgres-Datenbank, mehrmals täglich deployt. Das Abrechnungsmodul ändert sich jede Woche und hat 5 der letzten 8 Produktionsvorfälle verursacht, meist weil andere Module direkt Abrechnungstabellen lesen und schreiben. Niemand im Team hat je ein verteiltes System in Produktion betrieben. Die Leitung will innerhalb von zwei Quartalen weniger Vorfälle. HARTE VORGABE: kein Neuschreiben des Abrechnungsmoduls. HARTE VORGABE: Die Feature-Arbeit an der Abrechnung geht jede Woche weiter.
- 1
Datenbank-Firewall um die Abrechnungstabellen
Getrennte Postgres-Rollen für die Abrechnungs- und Nicht-Abrechnungs-Codepfade des Monolithen anlegen und der allgemeinen Anwendungsrolle direkte Schreibrechte auf Abrechnungstabellen entziehen. Alle Änderungen über eine kleine Zahl geprüfter Stored Procedures oder Transaktionsfunktionen leiten und zuerst vorübergehendes Audit-Logging einführen, um Aufrufer zu finden und zu migrieren, ohne die wöchentliche Feature-Arbeit anzuhalten.
- 2
Ausführbare finanzielle Invarianten
Eine kurze Liste von Invarianten — etwa unveränderliche finalisierte Rechnungen, ausgeglichene Ledger-Einträge, idempotente Erstellung von Belastungen und gültige Zustandsübergänge — als Datenbank-Constraints kodieren, wo das sicher ist, und andernfalls als geplante Prüfungen in Produktion. Dieselben Prüfungen in der CI gegen anonymisierte, produktionsähnliche Fixtures laufen lassen und so das Wissen aus Vorfällen in dauerhafte Stolperdrähte verwandeln statt in eine breite Ausweitung der Tests.
- 3
Vorfall-Replay als Bewährungsprobe vor jedem Release
Die fünf Abrechnungsvorfälle mit erfassten Query-Formen und bereinigten Zeilen in deterministische Replay-Szenarien umwandeln und verlangen, dass jede Änderung an der Abrechnung sie besteht. Generative Tests ergänzen, die Wiederholungen, doppelte Events, Transaktionsreihenfolgen und Teilausfälle rund um genau diese Szenarien permutieren, und damit gezielt das Umfeld der Fehler abdecken, statt eine erschöpfende Abdeckung des Monolithen anzustreben.
- 4
Die Abrechnungsgrenze im Schattenmodus durchsetzen
Als risikoärmere Mutation der Datenbank-Firewall die aktuellen Berechtigungen zunächst beibehalten, aber jede Abfrage, die Abrechnungstabellen berührt, mit Modul, Aufrufstelle und Transaktions-ID protokollieren. Nach vier Wochen unerwartete Schreibzugriffe zu CI-Fehlern machen und dann Modul für Modul zu Fehlern in Produktion; das ersetzt eine sofortige Umstellung der Berechtigungen durch eine gestufte Durchsetzung.
- 5
Schaltzentrale für den Schadensradius der Abrechnung
Riskante Abrechnungsfunktionen — nicht das ganze Modul — hinter serverseitige Kill Switches und prozentuale Rollouts legen, mit Dashboards, die auf Anomalien bei Rechnungen, Zahlungen und Abgleich ausgerichtet sind. Jedes wöchentliche Feature wird mit einem getesteten Abschaltpfad ausgeliefert, sodass das Bereitschaftsteam das neue Verhalten deaktivieren kann, ohne unabhängige Monolith-Deployments zurückzurollen oder Schemamigrationen rückgängig zu machen.
- 6
Postgres-Schema-Kapselung und Row Level Security
Isoliere Billing-Tabellen in ein eigenes Postgres-Schema (billing.*) und entziehe anderen DB-Rollen den direkten Schreib- und Lesezugriff. Module greifen nur über definierte SQL-Views oder gespeicherte Schnittstellen darauf zu. Das eliminiert die Hauptursache der Incidents direkt auf Datenbankebene.
- 7
Contract Testing und Shadow-Pipeline für Billing-Releases
Etabliere automatisierte Consumer-Driven Contract Tests für alle Billing-Schnittstellen in der CI-Pipeline. Ergänzend laufen Billing-Änderungen für kritische Berechnungen im Shadow-Modus ohne Seiteneffekte mit automatischer Differenzprüfung in Produktion.
- 8
Eine zweite Datenbank als Sicherheitsinstrument
Die weiche Annahme „eine Postgres-Datenbank“ bewusst brechen, indem eine schreibgeschützte Schattendatenbank hinzukommt, die per logischer Replikation gespeist wird, während die Abrechnung im Monolithen bleibt und die primäre Datenbank weiterhin als einzige beschrieben wird. Neue Lesezugriffe der Abrechnung und Abgleichsprüfungen gegen beide Datenbanken laufen lassen, die Ergebnisse vor der Freigabe vergleichen und die Schattendatenbank für forensische Abfragen nutzen, damit die Diagnose von Vorfällen die Produktion weder überlasten noch versehentlich verändern kann.
- 9
Striktes Module-Boundary Linting und Public API Facade
Führe ein Architektur-Linting via dependency-cruiser ein, das direkte Imports von Billing-Interna in anderen Modulen im Build-Schritt verbietet. Kommunikation darf nur über ein einzelnes, typsicheres BillingFacade-Interface erfolgen, um schleichende Koppelungen sofort zu blockieren.
- 10
Änderungspässe für die Abrechnung
Jeder Pull Request mit Bezug zur Abrechnung muss einen maschinell geprüften Pass mitführen: betroffene Tabellen, Invarianten, Migrationskompatibilität, Rollback-Pfad und eine Abfrage in Produktion, die den Zustand nach dem Deployment belegt. Ein CODEOWNERS-Gate plus ein 15-minütiges Review durch eine wechselnd für die Abrechnung zuständige Person hält den Prozess schlank genug für wöchentliche Änderungen und bündelt die Prüfung auf modulübergreifende Auswirkungen.
- 11
Auto-generierte Read-Only Postgres Views für Fremdmodule
Eine Mutation der Schema-Kapselung: Statt aufwändiger API-Refactorings werden automatisch schreibgeschützte Postgres Views für externe Abfragen bereitgestellt. Fremdmodule lesen nur diese stabilen Views, während direkte Tabellenzugriffe per DB-Permissions blockiert werden.
- 12
Asynchroner in-process Event-Bus für Read-Models
Anstatt dass fremde Module Billing-Tabellen direkt abfragen, sendet das Billing-Modul In-Memory Events bei Zustandsänderungen. Empfängermodule bauen sich eigene, lokale Projektionen auf. Das entkoppelt Lesezugriffe vollständig von den Billing-Tabellen ohne verteilte Systeme einzuführen.
- 13
Zweiwöchiger Feature-Freeze für Billing-Kapselung
Bricht die weiche Vorgabe des kontinuierlichen wöchentlichen Feature-Outputs für genau zwei Wochen. Das gesamte Team konzentriert sich fokussiert darauf, DB-Koppelungen aufzutrennen. Der Einmalaufwand schafft die Basis, um Incident-Zahlen für die verbleibenden 5 Monate nachhaltig zu senken.
- 14
Datenbankrolle pro Modul
Der Abrechnung ein eigenes Postgres-Schema und eine eigene Rolle geben und anderen Modulen die Schreibrechte auf Abrechnungstabellen entziehen, sodass direkte Schreibzugriffe schon im Staging scheitern, bevor sie die Produktion erreichen.
- 15
Physikalische DB-Partitionierung in eine zweite Postgres-Instanz
Bricht die weiche Vorgabe der Ein-Datenbank-Architektur, behält aber den monolithischen Code bei. Billing-Daten ziehen in eine eigene Datenbankinstanz um, wodurch übergreifende SQL-Joins technisch unmöglich werden. Die betriebliche Komplexität bleibt minimal, da der Code monolithisch bleibt.
Kirats Notiz an Claude: Beste Regelbrecher-Idee erst auf Rang 8: „Eine zweite Datenbank als Sicherheitsinstrument“ — sie bricht bewusst eine weiche Vorgabe. Einmal in ihrer stärksten Form durchdenken, bevor sie verworfen wird.
Thema: Ideen, wie sich der Personalaufwand für das Titel-und-Abstract-Screening von etwa 3.000 Datensätzen senken lässt, ohne die Strenge eines systematischen Reviews zu schwächen
Gesendeter Kontext: Systematisches Review in der Versorgungsforschung, zur Veröffentlichung geplant. Aktuelles Protokoll: zwei unabhängige menschliche Screener, Konflikte werden durch Diskussion gelöst. Personalzeit ist knapp. Die Gutachtenden der Zeitschrift werden fragen, wie das Screening durchgeführt wurde. Eine relevante Studie zu übersehen (falscher Ausschluss) ist schlimmer, als eine irrelevante einzuschließen. HARTE VORGABE: Die Methode muss nach PRISMA 2020 berichtbar sein. HARTE VORGABE: Die Rate falscher Ausschlüsse darf nicht steigen.
- 1
Ausschluss-Schranke mit zwei Menschen
Reviewer A screent jeden Datensatz, doch die Einschlüsse und unsicheren Entscheidungen von A gehen direkt weiter; Reviewer B bewertet unabhängig nur die von A vorgeschlagenen Ausschlüsse. Ein Datensatz wird nur ausgeschlossen, wenn beide Menschen ihn unabhängig ausschließen, und jede Uneinigkeit wird automatisch weitergereicht, wodurch die meisten Konfliktbesprechungen entfallen. Das bricht bewusst die weiche Annahme des aktuellen Protokolls, dass zwei Menschen jeden Datensatz bewerten müssen; es lohnt sich, weil es Screening-Zeit spart und dabei strukturell zwar mehr falsche Einschlüsse zulässt, aber keine zusätzlichen falschen Ausschlüsse, und es lässt sich im PRISMA-Abschnitt zum Auswahlprozess einfach beschreiben.
- 2
Kalibrierungssprint mit einem Grenzfall-Register
Eine geschichtete erste Charge unabhängig doppelt screenen, Konflikte klären und wiederkehrende Unklarheiten in kurze operative Regeln mit Positiv- und Negativbeispielen überführen. Die Regeln festschreiben, bevor es weitergeht; die Pilotentscheidungen nur behalten, wenn sich die Eignungskriterien nicht geändert haben, andernfalls neu screenen. Das erhält das doppelte unabhängige Screening und senkt zugleich den späteren Aufwand für Beratung und Konfliktklärung, und die Kalibrierung lässt sich nach PRISMA berichten.
- 3
Schnelle binäre Konsole statt Mini-Datenextraktion
Beiden Prüfenden eine verblindete, per Tastatur bedienbare Oberfläche geben, die auf Einschluss, Ausschluss oder unsicher beschränkt ist, mit stets vollständig sichtbarem Titel und Abstract; detaillierte Kodierung und Ausschlussgründe auf die Volltextprüfung verschieben. PRISMA 2020 verlangt auf der Titel-und-Abstract-Stufe keine Gründe pro Datensatz. Der Entscheidungsprozess bleibt unverändert, doch vermeidbarer Aufwand für Lesen, Klicken und Dokumentation fällt weg.
- 4
Maschinelles Ventil nur für Einschlüsse
Als Mutation der Ausschluss-Schranke mit zwei Menschen in einem Schritt die von A vorgeschlagenen Ausschlüsse durch einen validierten Klassifikator laufen lassen, der Datensätze nur zum Einschluss freigeben darf, niemals ausschließen; Reviewer B screent unabhängig alles, was der Klassifikator nicht freigibt. Der endgültige Ausschluss erfordert weiterhin übereinstimmende Entscheidungen von zwei Menschen, sodass ein Fehler der Maschine zwar Volltexte hinzufügen, aber keinen falschen Ausschluss erzeugen kann. Modell, Version, Eingaben, Schwellenwerte, Validierung und seine strikt auf Einschlüsse beschränkte Rolle nach PRISMA berichten.
- 5
Asymmetrisches Exklusions-Screening
Ein Erstprüfer klassifiziert alle 3.000 Datensätze vollständig. Der Zweitprüfer prüft exklusiv nur diejenigen Datensätze, die vom Erstprüfer ausgeschlossen wurden, um falsch-negative Treffer abzufangen (Einschlüsse werden direkt akzeptiert). Dies halbiert den Aufwand des Zweitprüfers nahezu, hält das Risiko falscher Exklusionen extrem niedrig und erfüllt alle PRISMA-Vorgaben.
- 6
Screening für ertragreiche Teilmengen umgehen
Ertragreiche Teilmengen vorab festlegen — etwa Datensätze aus einem hochspezifischen Suchblock, direkte Nachfahren bekannter geeigneter Studien oder Datensätze, die bereits in einem eng verwandten Review eingeschlossen sind — und sie alle ohne Titel-und-Abstract-Entscheidung direkt in die Volltextbeschaffung geben. Das bricht für diese Datensätze bewusst das weiche Zwei-Screener-Protokoll, kann aber die falschen Ausschlüsse nicht erhöhen, weil in der Teilmenge nichts ausgeschlossen wird; der Preis ist zusätzliche Volltextarbeit. Die Umgehungsregel und die daraus resultierenden Zahlen ausdrücklich im PRISMA-Flussdiagramm und in den Methoden zur Auswahl berichten.
- 7
Priorisiertes Screening via Active Learning
Beide Human-Screener nutzen ein Active-Learning-Tool (wie ASReview), das relevante Titel/Abstracts an den Anfang sortiert. Sobald ein statistisch validiertes Abbruchkriterium erreicht ist (z. B. 500 irrelevante Treffer in Folge), wird das Screening beendet. Das Verfahren spart bis zu 70% Zeit, ist PRISMA-2020-konform dokumentierbar und wahrt durch die Algorithmus-Kalibrierung eine minimale Falsch-Exklusionsrate.
- 8
Nur exakte Deduplizierung vor dem Screening
Nur Datensätze entfernen, deren Identität über DOI, Zugangsnummer der Datenbank oder exakten normalisierten bibliografischen Abgleich nachgewiesen ist; die Kopie mit den meisten Metadaten behalten und unsichere Beinahe-Duplikate lediglich markieren. Beide Prüfenden screenen dann jeden verbleibenden eindeutigen Datensatz unabhängig, und PRISMA weist die vor dem Screening entfernten Duplikate aus. Das senkt die Menge, ohne einen Weg zu schaffen, auf dem eine eindeutige Studie ausgeschlossen werden könnte.
- 9
Mensch-KI-Kaskade mit KI-Sicherheitsnetz
Eine Mutation des asymmetrischen Exklusions-Screenings: Ein menschlicher Screener bearbeitet alle Datensätze alleine, während ein auf maximale Sensitivität getrimmtes KI-Modell exklusiv die menschlichen Exklusionen prüft. Nur bei Diskrepanzen prüft ein zweiter Mensch nach. Dies reduziert die Humankapazitäten um über 50% bei vollständiger Abdeckung.
- 10
Vollautomatischer KI-Zweitprüfer
Bricht die weiche Vorgabe, dass zwingend zwei menschliche Personen screenen müssen. Ein Large Language Model (LLM) übernimmt die Rolle des unabhängigen Zweitprüfers mit Zero-False-Negative-Prompting. Es lohnt sich, weil die menschliche Arbeitszeit halbiert wird und LLMs bei Abstract-Screenings nachweislich hohe Recall-Raten erreichen; PRISMA 2020 erlaubt die Angabe von KI-Tools explizit.
- 11
Risikoadaptiertes Single-Screening mit Konfidenz-Triagierung
Bricht die weiche Vorgabe des durchgängigen Doppel-Screenings für den gesamten Datensatz. Wenn der Erstprüfer eine hohe Subjekt-Konfidenz angibt und eindeutige Ausschlussgründe vorliegen, entfällt der Zweitprüfer; nur unsichere Fälle wandern ins Doppel-Screening. Dies spart bis zu 60% Personalzeit, während das Risiko verpasster Studien durch Fokussierung der Ressourcen auf Grauzonen minimal bleibt.
- 12
Zuerst eine Kalibrierungsrunde
Beide Screener screenen dieselben 100 Datensätze, besprechen jeden Konflikt und schärfen die Eignungskriterien vor der Hauptrunde, sodass spätere Konflikte und erneutes Lesen abnehmen.
- 13
Binarisiertes Blitz-Screening mit KI-Triage
Mutation der Active-Learning-Priorisierung: Das Team nutzt eine vereinfachte Oberfläche zur Schnell-Bewertung (nur Klicks für 'Einschluss/Unsicher' vs. 'Ausschluss'). Ein KI-Modell wertet im Hintergrund Unsicherheiten aus und schickt nur Wackelkandidaten in die vertiefte Doppelprüfung. Minimiert kognitive Last und Lesezeit pro Abstract drastisch.
- 14
Deterministisches Pre-Filtering via Match-Algorithmen
Konservative Such-Filter und Skripte sortieren vorab eindeutig unpassende Treffer aus (z. B. falsches Studiendesign oder nicht-menschliche Population). Beide Screener prüfen diese automatisierten Exklusionen nur über eine repräsentative Stichprobe (z. B. 10%). Dies reduziert das manuell zu screenende Gesamtvolumen PRISMA-konform und ohne Sensitivitätsverlust.
Alle Ideen, vollständig und in der Rangfolge. Claudes eigene Idee nimmt anonym und gleichberechtigt teil. Was die Mitglieder auf Deutsch geschrieben haben, steht hier im Original; was auf Englisch gesendet oder geschrieben wurde, ist hier übersetzt.
Fünf Headlines und Titel aus verschiedenen Bereichen. Jedes Mitglied schreibt eine Variante, Claudes Entwurf nimmt teil, und beide Mitglieder bewerten alle drei anonym. Wählen Sie eine Aufgabe aus.
Briefing: Headline für die Preisseite eines kleinen Rechnungstools für Freelancer (19 USD pro Monat, 14 Tage kostenlos testen). Zielgruppe: Freelancer, die ihre Rechnungen bisher in Word oder Excel schreiben. Ziel: Die Testphase soll sich risikolos und lohnend anfühlen. Format: eine Headline, auf Englisch.
Kriterien: max. 8 Wörter · konkret, keine Superlative · nennt gesparte Zeit oder das Bezahltwerden · keine Ausrufezeichen
- 1
"Get paid without Word—free for 14 days"
Spricht Word-Nutzer direkt an, stellt das Bezahltwerden heraus und macht den risikofreien Test konkret.
- 2
"Send invoices in minutes. Get paid on time."
Der eigene Entwurf des Orchestrators.
- 3
"Replace Word and Excel. Get paid days faster."
Den aktuellen manuellen Arbeitsablauf direkt anzusprechen, schafft einen sofortigen Kontrast und stellt die Testphase als schnelles, risikofreies Upgrade für den Cashflow dar, ohne generischen Hype.
Briefing: Headline für die Landingpage einer kleinen Digitalagentur über Shop-Relaunches für den Möbelhandel mit WooCommerce. Zielgruppe: Inhaberinnen und Inhaber mittelgroßer Möbelshops ohne eigene Entwicklung. Ziel: einen kostenlosen Shop-Check buchen lassen. Format: eine Headline, deutscher Markt, aber auf Englisch schreiben.
Kriterien: max. 10 Wörter · nennt das Problem der Lesenden, nicht die Agentur · kein Jargon wie „headless“ oder „omnichannel“ · keine Superlative
- 1
"Losing furniture buyers to a slow, frustrating WooCommerce store?"
Zielt direkt auf den größten Frust derer, die den Shop führen — entgangene Umsätze durch einen schwachen Shop —, ohne Tech-Jargon oder selbstgefällige Agentursprache.
- 2
"Is your WooCommerce shop turning furniture buyers away?"
Benennt das Kernproblem direkt und spricht den Möbelhandel ohne Jargon an.
- 3
"Fewer shop emergencies, more time for your furniture."
Der eigene Entwurf des Orchestrators.
Briefing: Headline für die neue Online-Bestellseite der Bäckerei für individuelle Torten. Zielgruppe: Kundschaft vor Ort, die bisher telefonisch bestellt hat. Ziel: Online zu bestellen soll sich einfach und persönlich anfühlen. Format: eine Headline, deutscher Markt, aber auf Englisch schreiben.
Kriterien: max. 8 Wörter · konkret, keine Superlative · nennt die Abholung oder den Anlass · klingt nach einer Bäckerei vor Ort, nicht nach einer Kette
- 1
"Your celebration cake, baked here for pickup."
Warm, konkret und persönlich: „baked here“ wirkt lokal, während „for pickup“ den Online-Ablauf unkompliziert erscheinen lässt.
- 2
"Order your custom birthday cake, pick up fresh."
Die Headline nennt konkret Anlass sowie Abholung und vermittelt durch das Frischeversprechen lokale Handwerksqualität ohne unpersönlichen Floskeln.
- 3
"Your cake, your date. Order in two minutes."
Der eigene Entwurf des Orchestrators.
Briefing: Titel für einen internen Engineering-Vorschlag: die Grenzen des Abrechnungsmoduls innerhalb des Monolithen härten, bevor ein separater Service in Betracht gezogen wird. Zielgruppe: 8 Engineers und die Leitung, die weniger Vorfälle wollen. Ziel: dass der Vorschlag gelesen und genehmigt wird. Format: ein Titel, auf Englisch.
Kriterien: max. 10 Wörter · benennt die Entscheidung, nicht nur das Thema · keine Buzzwords · auch ohne technischen Hintergrund verständlich
- 1
"Fix billing's boundaries first, split it later if needed"
Der eigene Entwurf des Orchestrators.
- 2
"Keep Billing Together, but Isolate It to Prevent Incidents"
Der Titel benennt die Entscheidung, die Abrechnung im Monolithen zu belassen und zugleich ihre Grenzen zu stärken, und verknüpft diese Wahl mit dem gemeinsamen Ziel, weniger Vorfälle zu haben.
- 3
"Strengthen Billing Boundaries in Current App Before Splitting Service"
Der Titel trifft eine eindeutige Richtungsentscheidung, vermeidet unnötigen Fachjargon wie 'Monolith' für das Management und spricht das gemeinsame Ziel der Stabilität direkt an.
Briefing: Titel für ein Methodenpaper über den Einsatz eines LLM als zusätzlicher Screener in einem systematischen Review in der Versorgungsforschung. Zielgruppe: Forschende und Gutachtende von Fachzeitschriften. Ziel: präzise und zitierfähig, kein Hype. Format: ein Titel, optional mit Untertitel nach einem Doppelpunkt, auf Englisch.
Kriterien: max. 20 Wörter · nennt die Methode und das Setting · keine Aussagen, die über die Daten hinausgehen · keine Hype-Wörter wie „revolutionize“
- 1
"Large Language Model–Assisted Study Selection in Health Services Research: A Method for Additional Screening in Systematic Reviews"
Der Titel benennt die Screening-Methode, den Kontext des systematischen Reviews und das Setting der Versorgungsforschung, ohne Leistung oder Nutzen zu unterstellen.
- 2
"An LLM as additional screener: a prospective comparison in a health services systematic review"
Der eigene Entwurf des Orchestrators.
- 3
"Large Language Models as Auxiliary Screeners in Health Services Research Systematic Reviews: A Methodological Evaluation"
Der Titel benennt Einsatzgebiet und Methodik präzise, verzichtet auf Reizwörter und wählt einen sachlichen, zitierfähigen Ton für ein wissenschaftliches Publikationsumfeld.
Headlines und Titel stehen so da, wie sie geschrieben wurden, auf Englisch, wie es die Briefings verlangten. Die Begründung in Claudes Eintrag ist Kirats eigene Kennzeichnung dafür. Was die Mitglieder auf Deutsch geschrieben haben, steht hier im Original; alles andere, was auf Englisch gesendet oder geschrieben wurde, ist hier übersetzt.
Fünf Bild-Briefings aus verschiedenen Bereichen. OpenAI und Google erzeugen je ein Bild, und beide Mitglieder bewerten beide Bilder anonym. Wählen Sie eines aus.
Briefing: Hero-Bild für die Landingpage eines kleinen Rechnungstools für Freelancer: ein aufgeräumter Schreibtisch im Homeoffice am Morgen mit einem Laptop (Bildschirm abgewandt oder unscharf, keine lesbare Oberfläche), einer Tasse Kaffee und einem Notizbuch aus Papier. Natürliches Tageslicht, ruhiger dokumentarischer Fotostil, kein Text, keine Logos, keine Gesichter von Menschen.
Kriterien: wirkt wie der echte Arbeitsplatz einer freiberuflich arbeitenden Person, nicht wie ein Stockfoto-Büro · ruhig und aufgeräumt · lässt ruhige Fläche für eine Headline · kein Text, keine Logos und keine lesbaren Bildschirme
gpt-5.6 · 9/10 Sehr ruhiger, glaubwürdiger Homeoffice-Arbeitsplatz mit natürlichem Morgenlicht, abgewandtem Bildschirm und viel freier Wandfläche für eine Headline. Wirkt etwas inszeniert, erfüllt den Auftrag aber nahezu vollständig.
gemini-3.6-flash · 9/10 Sehr helle, natürliche Morgenlicht-Atmosphäre. Der abgewendete Laptop löst das Bildschirm-Problem perfekt ohne künstlichen Unschärfe-Effekt. Die helle Wandfläche bietet idealen Platz für Text.
gpt-5.6 · 6/10 Gemütlich und authentisch mit unscharfem Bildschirm, jedoch stehen deutlich sichtbarer Text auf dem Notizbuch sowie handschriftliche Notizen im Bild. Zudem ist die Komposition voller und bietet weniger ruhige Headline-Fläche.
gemini-3.6-flash · 7/10 Sehr gemütliches und realistisches Setup. Allerdings wirkt der künstlich weichgezeichnete Bildschirm etwas auffällig und der gesamte Bildaufbau bietet etwas weniger ruhige Fläche für eine Headline.
Briefing: Produktfoto für einen Möbel-Onlineshop: ein massiver Esstisch aus Eiche mit vier Stühlen in einem hellen, echt wirkenden mitteleuropäischen Wohnzimmer. Natürliches Tageslicht, redaktioneller Interior-Stil, kein Text, keine Logos, keine Menschen.
Kriterien: der Tisch ist eindeutig das Hauptmotiv · naturgetreue Holzmaserung und Holzfarbe · wirkt wie ein echtes Zuhause, nicht wie ein 3D-Rendering · kein Text und keine Logos
gpt-5.6 · 9/10 Sehr glaubwürdiges, helles mitteleuropäisches Wohnambiente mit natürlichem Tageslicht, vier Stühlen und realistischer Eichenstruktur; die etwas umfangreiche Dekoration lenkt minimal vom Tisch ab.
gemini-3.6-flash · 9/10 Sehr gelungene, wohnliche Atmosphäre mit authentischem Tageslicht und realistischer Holzmaserung. Erfüllt alle Vorgaben hervorragend.
gpt-5.6 · 8/10 Der massive Eichentisch ist klar inszeniert, vier Stühle sind vorhanden, Holzfarbe und Maserung wirken überzeugend; insgesamt jedoch etwas zu makellos und leicht renderartig.
gemini-3.6-flash · 9/10 Der Esstisch steht klar im Fokus, das Eichenholz und die Texturen wirken äußerst natürlich und fotorealistisch. Perfekter Editorial-Stil für den Online-Shop.
Briefing: Hero-Bild für die neue Online-Bestellseite einer kleinen Bäckerei vor Ort für individuelle Torten: eine fertige Geburtstagstorte auf einer Holztheke in einer hellen, echt wirkenden Familienbäckerei, abholbereit in einem schlichten Tortenkarton. Natürliches Tageslicht, dokumentarischer Fotostil, kein Text, keine Logos, keine Gesichter von Menschen.
Kriterien: wirkt wie eine echte Bäckerei vor Ort, nicht wie eine Kette oder ein Stockfoto · die Torte ist eindeutig das Hauptmotiv · lässt ruhige Fläche für eine Headline · kein Text und keine Logos im Bild
gpt-5.6 · 8/10 Kuchen als eindeutiges Hauptmotiv, einfache Kartonbox, natürliches Tageslicht und plausibles lokales Bäckerei-Umfeld. Kein sichtbarer Text oder Logo; die ruhige Deckelfläche eignet sich für eine Headline, auch wenn das Bild etwas stark inszeniert wirkt.
gemini-3.6-flash · 9/10 Erfüllt den Auftrag optimal: Völlig frei von Text und Logos, der Kuchen steht klar im Fokus, helles natürliches Licht und eine sehr authentische Atmosphäre. Der aufgeklappte Kartondeckel bietet eine ideale ruhige Fläche für Headlines.
gpt-5.6 · 4/10 Kuchen und Abholbox sind klar inszeniert, die handwerkliche Bäckerei wirkt glaubwürdig. Verstößt jedoch deutlich gegen „no text“: Schriftzug auf dem Kuchenaufsatz, Menůtafeln und Kassenbon; zudem fehlt ruhige Headline-Fläche.
gemini-3.6-flash · 3/10 Verstößt gegen die strikte Vorgabe 'kein Text im Bild' durch den 'HAPPY BIRTHDAY'-Stecker und die beschrifteten Tafeln im Hintergrund. Auch der Hintergrund ist etwas zu unruhig.
Briefing: Titelbild für einen internen Engineering-Blogpost über das Herauslösen eines Abrechnungsmoduls aus einem Monolithen: eine abstrakte, ruhige Illustration eines klar abgegrenzten Blocks, der von einem dichten Cluster miteinander verbundener Blöcke abgesetzt ist. Flacher Stil, gedeckte Farben, kein Text, keine Logos.
Kriterien: die Idee einer klaren Grenze ist auf einen Blick erkennbar · ruhig, nicht dramatisch · funktioniert auch in kleiner Größe · kein Text und keine Logos
gpt-5.6 · 9/10 Die isolierte Einheit mit gestrichelter Umgrenzung ist sofort erkennbar und steht klar dem dichten, vernetzten Blockcluster gegenüber. Ruhige, gedeckte Farbgebung; auch klein gut lesbar. Leichte räumliche Schattierung statt konsequent flachem Stil.
gemini-3.6-flash · 7/10 Gute Darstellung des isolierten Blocks mit gestrichelter Grenze, ruhiger Stil und klare Lesbarkeit auch in kleiner Ansicht.
gpt-5.6 · 6/10 Abgesetztes Element und komplexes Geflecht vermitteln die Entkopplung grundsätzlich, doch die Grenze wirkt eher wie ein Bildschirmrahmen als wie eine klar definierte Modulgrenze. Das Cluster ist sehr kleinteilig und verliert bei kleiner Darstellung an Lesbarkeit; insgesamt dennoch ruhig und ohne Logos oder lesbaren Text.
gemini-3.6-flash · 4/10 Fokus liegt auf einem Tablet-Bildschirm statt einem abgetrennten Baustein, das Wirrwarr wirkt weniger strukturiert.
Briefing: Titelbild für einen Konferenzvortrag über KI-gestütztes Screening in systematischen Reviews: ein ordentlicher Stapel ausgedruckter Forschungs-Abstracts auf einem Schreibtisch, einige in zwei Ablagekörbe sortiert, weiches Tageslicht, dokumentarischer Fotostil. Kein lesbarer Text, keine Logos, keine Gesichter von Menschen.
Kriterien: seriös und wissenschaftlich, kein Hype · keine Roboter oder leuchtenden Gehirne · die Idee des Sortierens ist sichtbar · kein lesbarer Text und keine Logos
gpt-5.6 · 9/10 Seriöse, dokumentarische Schreibtischszene mit weichem Tageslicht; zwei Ablagen und farbige Reiter vermitteln die Sortierung klar. Keine Logos oder eindeutig lesbaren Texte, keine Personen.
gemini-3.6-flash · 9/10 Sehr gut umgesetzt. Hohe fotografische Qualität im Dokumentarstil, das Sortierkonzept mit Stapeln und Ablagen ist klar verständlich, ohne lesbaren Text oder Gesichter.
gpt-5.6 · 5/10 Wissenschaftlicher Arbeitskontext und Sortierung sind deutlich erkennbar. Die lesbaren Ablageetiketten verletzen jedoch die Vorgabe „kein lesbarer Text“; zudem ist im Hintergrund eine Person mit erkennbarem, wenn auch unscharfem Gesicht zu sehen.
gemini-3.6-flash · 4/10 Das Motiv passt prinzipiell, jedoch ist im Hintergrund eine Person/ein Gesicht sichtbar und die Ablagen enthalten fehlerhaften, teils lesbaren Text (INCLVDED/EACLVDED).
KI-generierte Bilder, verkleinert und ansonsten unbearbeitet. Mit ≈ markierte Kosten stammen aus parallel gelaufenen Durchläufen: die eigenen Bildkosten jedes Durchlaufs plus ein gleicher Anteil an den Bewertungsaufrufen. Die Rangfolge ist eine Vorauswahl, die endgültige Wahl bleibt bei Ihnen. Was die Mitglieder auf Deutsch geschrieben haben, steht hier im Original; was auf Englisch gesendet oder geschrieben wurde, ist hier übersetzt.
Zwei Keys, eine Installation, eine Frage.
Kirat ist kein Dienst, für den Sie sich registrieren. Es läuft auf Ihrem Computer (oder in Ihrer eigenen Cloud-Umgebung von Claude Code), innerhalb von Claude, mit Ihren eigenen API-Keys. Es gibt keinen Kirat-Server und kein Konto bei uns. Alles, was Sie Kirat geben, geht direkt an OpenAI und Google, über Ihre Konten — von Ihrem Computer aus oder, in Cloud-Sitzungen von Claude Code, aus Ihrer eigenen Cloud-Umgebung über den Netzwerk-Proxy von Anthropic für diese Umgebung. Wir sehen Ihre Keys und Ihre Fragen nie.
Zwei API-Keys
Ein OpenAI-API-Key und ein Google-Gemini-API-Key, beide mit aktivierter Abrechnung. Zeit kosten hier die Registrierungs- und Abrechnungsformulare der Anbieter. Ein separates Projekt beim Anbieter mit Ausgabenlimit ist eine gute Idee.
Sie haben beide Keys schon? Weiter mit Schritt 2.
Installieren
Claude Desktop: Entpacken Sie den Download. Öffnen Sie Settings → Extensions → Advanced settings → Install Extension… und wählen Sie die .mcpb-Datei. Geben Sie beide Keys im Dialog ein. Desktop bringt sein eigenes Node mit, es ist also nichts weiter zu installieren.
Claude Code: Entpacken Sie den Download und verschieben Sie den entpackten Ordner kirat in Ihren Home-Ordner, sodass ~/kirat/claude-code existiert. Führen Sie dann die Befehle unten aus. Erfordert Node.js 20 oder neuer.
Cloud-Sitzungen von Claude Code: eine einmalige Einrichtung Ihrer Cloud-Umgebung, mit Einschränkungen — siehe unten.
Fragen
Prüfen Sie die Installation: Nutze die Kirat-Erweiterung und rufe kirat_status auf.
Stellen Sie dann eine echte Frage: Frag den Kirat-Rat: Postgres oder SQLite? Gib auch deine eigene Position ab.
# in Claude Code, sobald ~/kirat/claude-code existiert /plugin marketplace add ~/kirat/claude-code /plugin install kirat@kirat # beide Keys eingeben, wenn danach gefragt wird; später ändern mit: /plugin configure kirat@kirat
Claude Desktop warnt, dass die Erweiterung nicht von Anthropic verifiziert ist. Diese Warnung ist bei jeder aus einer Datei installierten Erweiterung zu erwarten — siehe FAQ.
Prüfen Sie das vor dem Kauf.
Kirat ist ein Programm, kein Dienst. Es funktioniert nur dort, wo Claude Tools auf einem Rechner ausführt, auf dem Kirat installiert ist: auf Ihrem Computer, auf einem entfernten Rechner per SSH oder in einer Cloud-Umgebung von Claude Code, die Sie einmal einrichten.
Funktioniert in
- Chats in Claude Desktop unter macOS und Windows Nutzt die
.mcpb-Erweiterung. - Claude Code im Terminal oder in VS Code Nutzt das Claude-Code-Plugin. Erfordert Node.js 20 oder neuer; für die Installation wird einmalig das Kommandozeilen-Tool
claudebenötigt. - Lokale Sitzungen im Code-Tab von Claude Desktop Ebenfalls das Claude-Code-Plugin. Die
.mcpb-Erweiterung ist für Chats gemacht, nicht für Sitzungen im Code-Tab. - SSH-Sitzungen Das Plugin, installiert auf dem entfernten Rechner.
- Cloud-Sitzungen von Claude Code — eingeschränkt, mit einmaliger Einrichtung der Cloud-Umgebung Cloud-Sitzungen im Code-Tab, Claude Code im Web oder in der mobilen App. Einmal pro Cloud-Umgebung:
- Fügen Sie den Block aus dem Download (
cloud/setup.sh) am Anfang des Setup-Skripts der Umgebung ein. - Legen Sie Ihre beiden Keys als Umgebungsvariablen an. Wir empfehlen die Namen
KIRAT_OPENAI_API_KEYundKIRAT_GEMINI_API_KEY: Sie kollidieren nicht mit dem eigenenOPENAI_API_KEYeines Projekts. Kirat akzeptiert auchOPENAI_API_KEYundGEMINI_API_KEY. - Netzwerkzugriff: Steht er auf Full, ist nichts zu ändern. Andernfalls stellen Sie ihn auf Custom (in neueren Apps: Limited) mit der Standardliste für Paketmanager, plus
api.openai.comund den Kirat-Download-Host.
- Fügen Sie den Block aus dem Download (
Funktioniert nicht in
- Chat im Browser (claude.ai)
- Chat in den mobilen Claude-Apps Claude Code in der mobilen App läuft als Cloud-Sitzung; das funktioniert mit der Cloud-Einrichtung.
- Cowork-Aufgaben, die in der Cloud laufen
- Netzwerke auf Ihrem eigenen Computer, die einen HTTP-Proxy erfordern Cloud-Umgebungen von Claude Code funktionieren.
- Organisationen, die Desktop-Erweiterungen auf eine Freigabeliste beschränken Manuelle Installationen sind gesperrt; fragen Sie Ihren Admin.
Cloud-Grenzen — vor dem Kauf prüfen
- Alle, die die Umgebung nutzen, können ihre Umgebungsvariablen lesen — auch Ihre beiden Keys. Teilen Sie die Umgebung nicht mit Personen, die diese Keys nicht verwenden sollen.
- Das Tagesbudget gilt pro Sitzung. Jede Cloud-Sitzung startet neu, daher zählt das Tagesbudget von Kirat pro Sitzung, nicht über alle Ihre Sitzungen eines Tages hinweg. Setzen Sie Ausgabenlimits bei OpenAI und Google: In der Cloud sind sie Ihre eigentliche Obergrenze.
- Hintergrundjobs und letzte Ergebnisse enden mit der Sitzung. Sie gehen verloren, wenn der Rechner der Sitzung beendet wird.
- Zwei Hosts freigeben. Neben
api.openai.commuss der Netzwerkzugriff der Umgebung den Kirat-Download-Host zulassen (Gemini ist durch die Standardliste abgedeckt). - Ein fehlgeschlagenes Setup kann zwischengespeichert bleiben. Schlägt das Setup fehl, startet die Sitzung trotzdem, nur ohne Kirat — und der fehlgeschlagene Zustand kann für neue Sitzungen zwischengespeichert bleiben, bis Sie das Setup-Skript bearbeiten (jede Änderung bewirkt, dass neue Sitzungen es erneut ausführen).
Warum die Erweiterung nie eine Cloud-Sitzung erreicht: Cloud-Sitzungen laufen auf den Servern von Anthropic, in einer Cloud-Umgebung, und können kein Programm auf Ihrem Computer erreichen — selbst wenn Claude Desktop Kirat in einer solchen Sitzung unter „+ → Connectors“ als eingeschaltet anzeigt. Eine Cloud-Sitzung hat Kirat nur, wenn ihre Cloud-Umgebung die Kirat-Einrichtung hat.
Welche Art von Code-Tab-Sitzung ist es? Die Umgebungsauswahl im Eingabefeld zeigt es: Local, SSH, WSL oder der Name einer Cloud-Umgebung. Local- und SSH-Sitzungen nutzen das Plugin; eine Cloud-Umgebung braucht die Cloud-Einrichtung.
Nicht getestet: WSL-Sitzungen und lokale Cowork-Aufgaben.
Diesen Kasten gibt es, weil der Rat ihn verlangt hat. Als er am 8. Oktober 2026 dafür stimmte, Kirat als Desktop-Erweiterung auszuliefern, war eine seiner Bedingungen, dass diese Grenzen vor dem Kauf klar sichtbar sind. Zur Entscheidung. Als er später dafür stimmte, Cloud-Sitzungen von Claude Code zu unterstützen, stellte er dieselbe Bedingung für die Cloud-Grenzen.
Wir heben die Belege auf.
Behaupten kann jeder, dass ein Rat funktioniert. Hier sind echte Ratssitzungen über Kirat selbst, Messungen aus Produktivläufen und die Fehler, die das Design verändert haben.
Historische Entscheidung, August 2026. Diese Abstimmung betraf den früheren Plan: Kirat als Bauanleitung zu verkaufen. Dieser Plan hat sich später geändert, und die Gegenstimme unten hat geprägt, was danach kam.
Ein Mitglied stimmte dagegen, das Produkt überhaupt zu verkaufen. Seine Begründung blieb im Protokoll, und die Gegenstimme prägte, was danach kam: Kirat ist jetzt eine installationsfertige Erweiterung, keine Bauanleitung. Genau darum geht es bei einem Rat — Sie bekommen den Einwand, nicht nur das Urteil.
| Messung | Wert |
|---|---|
| Median-Ausgabedurchsatz | gpt-5.6 ≈ 48 tok/s gemini-3.6-flash ≈ 196 tok/s |
| Reasoning-Anteil eines generativen gpt-5.6-Aufrufs | ≈ 90% |
| Kosten einer Ratsentscheidung | $0.02–$0.15 |
| Gesamtdauer einer Entscheidung | 8 s – 3 min |
Bildgenerierung (kirat_image) | etwa $0.05–$0.15 pro Aufruf |
| Alle dokumentierten Sitzungen zu Produktentscheidungen | insgesamt unter $0.70 |
| Automatisierte Tests | 256, ohne Netzwerkzugriff ausgeführt |
METHODE — Durchsatz gemessen im Aug. 2026 gegen die Live-APIs aus einem einzelnen EU-Container: Median der Ausgabe-Tokens pro Sekunde über Produktivläufe, kein synthetischer Benchmark. Die Kosten pro Entscheidung hängen von Aufwandsstufe und Eingabegröße ab. Ihre Zahlen weichen je nach Modellmix, Prompt-Größe und Anbieterpreisen ab. Die Benchmark-Daten hinter diesen Zahlen sind Teil des Blueprints.
Ein 4×-Unterschied im Durchsatz ist der Grund, warum ein gemeinsamer Timeout nicht zu beiden Anbietern passen konnte. Diese Messung prägte das Design — siehe den Tab „Fehler“.
Wir veröffentlichen die Fehler, die das Design verändert haben, mit Symptomen und Korrekturen. Die letzten beiden stammen aus den Release Candidates der Erweiterung im Oktober 2026.
„Die Einschränkung muss vor dem Kauf klar sichtbar sein: nur Claude Desktop unter macOS/Windows, nicht im Browser, nicht auf Mobilgeräten.“
Deshalb steht der Kasten Wo es läuft über dem Preis. Spätere Abstimmungen erweiterten die Unterstützung auf Claude Code und, mit einmaliger Einrichtung, auf Cloud-Sitzungen von Claude Code, mit derselben Bedingung für deren Grenzen.
Diese Abstimmung korrigierte eine frühere Bedingung. Jene Bedingung beruhte auf unvollständigen Fakten, die Claude dem Rat gegeben hatte.
Auch das Format, das Sie kaufen, wurde dem Rat vorgelegt. Alle dokumentierten Sitzungen zu Produktentscheidungen kosteten zusammen unter $0.70. Die Konfidenzwerte sind jeweils die Selbsteinschätzung des Modells.
Ein Kauf. Beide Formate.
Kein Abo, keine Nutzerplätze, kein Konto bei uns. Kirat läuft auf Ihrem Computer oder in Ihrer eigenen Cloud-Umgebung; Sie mieten keinen Dienst bei uns.
- 01Claude-Desktop-Erweiterung (
.mcpb) für macOS und Windows - 02Claude-Code-Plugin — derselbe Server, dieselben Funktionen
- 03Cloud-Setup-Skript für Cloud-Sitzungen von Claude Code
- 04Neun Tools: vote, review, create, brainstorm, decide, ask, image — dazu result und status
- 05Budgetwächter mit Tagesobergrenze, Zwei-Runden-Limit, Circuit Breaker, Hintergrund-Tickets
- 06Lizenz für eine Person, Ihre eigenen Geräte und Cloud-Umgebungen
- 07Kompatibilitätsupdates nach Möglichkeit — kostenlos, aber ohne Garantie
Läuft in Claude Desktop (macOS/Windows) und Claude Code; Cloud-Sitzungen von Claude Code mit einmaliger Einrichtung — nicht der Chat im Browser oder auf Mobilgeräten. Wo es läuft · Cloud-Grenzen
Kirat kaufen- 01Die Spezifikation: strukturierte Anforderungen an die Tools
- 02Die Architekturentscheidungen, jeweils mit ihrer Begründung
- 03Die Abnahme-Checkliste, anhand derer ein Agent sich selbst prüfen kann
- 04Die Benchmark-Daten hinter den Zahlen auf dieser Website
Kein Code, keine installierbare Erweiterung.
Blueprint kaufenEinmalkauf · Zahlung über Lemon Squeezy (Merchant of Record, Verkäufer), Umsatzsteuer wird im Checkout abgewickelt · Erstattungen: siehe AGB
Die API-Nutzung bezahlen Sie direkt an OpenAI und Google, über Ihre Konten — $0.02–$0.15 pro Ratsentscheidung in unseren Messungen.
Kirat ist nichts für Sie, wenn …
- —Sie Claude nur als Chat im Browser oder auf dem Smartphone nutzen. Kirat läuft in Claude Desktop (macOS/Windows) und Claude Code sowie in Cloud-Sitzungen von Claude Code mit einmaliger Einrichtung — nicht in diesen Chats.
- —Sie SaaS mit Support-Hotline wollen.
- —Sie keine API-Konten und keine Abrechnung bei zwei Anbietern wollen.
- —Sie nur eine Handvoll Entscheidungen im Monat treffen. Zwei Browser-Tabs sind kostenlos und leisten Ihnen dann genauso gute Dienste.
- —Sie erwarten, dass drei Modelle so viel kosten wie eines. Ratsläufe verbrauchen echte API-Tokens — $0.02 bis $0.15 pro Entscheidung in unseren Messungen.
- —Sie eine Antwort wollen, die sicher klingt. Die Aufgabe eines Rats ist es, Ihnen die Uneinigkeit zu zeigen, und manchmal ist die Uneinigkeit die Antwort.
- —Ihre Daten nicht an OpenAI oder Google gehen dürfen. Alles, was Sie Kirat geben, geht an beide, über Ihre Konten und zu deren Bedingungen.
- —Ihre Organisation Erweiterungen sperrt oder einen HTTP-Proxy vorschreibt.
Sie müssen kein Entwickler sein.
Wenn Sie eine Claude-Erweiterung installieren und zwei API-Keys anlegen können, können Sie Kirat nutzen. Sie fragen in normaler Sprache; Claude ruft die Tools auf.
Und was Agenten bauen können: Kirat selbst besteht aus 11.351 Zeilen TypeScript, Quellcode und Tests, in 38 Commits — jeder Commit von einem KI-Agenten (Claude) geschrieben, keiner von Hand.
Vor dem Kauf.
Was unterscheidet Kirat von llm-council oder PAL MCP?
Sehen Sie sich zuerst beide an. llm-council ist eine Open-Source-Web-App; ihr Autor bezeichnet sie als bewusst ohne Support. PAL MCP ist ein kostenloser Open-Source-MCP-Server, den Sie über das Terminal installieren; er unterstützt viele Anbieter und hat ein eigenes Konsens-Tool. Prüfen Sie ihren aktuellen Stand. Wenn eines davon abdeckt, was Sie brauchen, nutzen Sie es.
Der Unterschied von Kirat liegt im Paket: Es wird über den eigenen Erweiterungsdialog von Claude Desktop installiert, mit Ihren Keys im sicheren Speicher des Betriebssystems, und bringt einen Budgetwächter mit Tagesobergrenze, ein Zwei-Runden-Limit, einen Stichentscheid durch den Domänenverantwortlichen, Hintergrund-Tickets, Fehlerbehandlung, 256 Tests, englische Ergebnisfelder und die Bedienung in normaler Sprache mit.
Muss ich Entwickler sein?
Nein. Wenn Sie eine Claude-Erweiterung installieren und zwei API-Keys anlegen können, können Sie Kirat nutzen. Sie fragen Claude in normaler Sprache — Frag den Kirat-Rat: Postgres oder SQLite? Gib auch deine eigene Position ab.
— und Claude ruft die Tools auf.
Was brauche ich?
Claude Desktop unter macOS oder Windows. Es bringt sein eigenes Node mit, Sie installieren also nichts weiter. Oder Claude Code mit Node.js 20 oder neuer. Für Cloud-Sitzungen von Claude Code eine einmalige Einrichtung Ihrer Cloud-Umgebung (siehe unten).
Dazu ein OpenAI-API-Key und ein Google-Gemini-API-Key, beide mit aktivierter Abrechnung. Kirat läuft auch mit einem Key: Der Rat hat dann ein externes Mitglied, und jedes Ergebnis nennt den fehlenden Key.
Was kostet der Betrieb, und was verhindert eine ausufernde Rechnung?
Sie bezahlen OpenAI und Google direkt für Ihre Nutzung. In unseren Messungen kostet eine Ratsentscheidung $0.02–$0.15, abhängig von Aufwandsstufe und Eingabegröße, und dauert 8 Sekunden bis 3 Minuten. Bildgenerierung kostet etwa $0.05–$0.15 pro Aufruf.
Der Budgetwächter reserviert vor jedem Aufruf die Kosten für den ungünstigsten Fall und blockiert Aufrufe, die Ihr Tagesbudget überschreiten könnten — standardmäßig $5 pro UTC-Tag, anpassbar. Er arbeitet nach bestem Bemühen, ohne Gewähr; setzen Sie also zusätzlich Ausgabenlimits bei den Anbietern. kirat_status zeigt Budget und Ausgaben und kostet nichts.
Wohin gehen meine Daten und Keys?
Ihre Daten: Alles, was Sie Kirat geben (Fragen, Kontext, Code, Bilder), geht direkt an OpenAI und Google, über Ihre Konten und zu deren Bedingungen — von Ihrem Computer aus oder, in Cloud-Sitzungen von Claude Code, aus Ihrer eigenen Cloud-Umgebung über den Netzwerk-Proxy von Anthropic für diese Umgebung. Es gibt keinen Kirat-Server, kein Konto bei uns und keine Telemetrie. Wir sehen Ihre Keys und Ihre Daten nie.
Ihre Keys: Sie geben sie im Installations- oder Einstellungsdialog von Claude selbst ein. Claude Desktop speichert sie im sicheren Speicher Ihres Betriebssystems (macOS-Schlüsselbund, Windows-Anmeldeinformationsverwaltung). Claude Code speichert sie im macOS-Schlüsselbund; unter Windows und Linux in ~/.claude/.credentials.json, nur für Ihr Benutzerkonto lesbar. Wir empfehlen ein separates Projekt beim Anbieter mit Ausgabenlimit.
In Cloud-Sitzungen von Claude Code: Kirat läuft in Ihrer Cloud-Umgebung, und die Keys sind Umgebungsvariablen dieser Umgebung, lesbar für alle, die sie nutzen.
Auf Ihrem Computer: Kirat legt in Ihrem Home-Ordner einen Ordner .kirat an, mit dem täglichen Kostenzähler, dem Kostenprotokoll, den letzten 20 Ergebnissen (sie enthalten Ihre Fragen und Antworten), dem Protokoll delegierter Entscheidungen und generierten Bildern. Sie können ihn jederzeit löschen. Alle Kirat-Sitzungen auf dem Computer teilen ihn, Desktop und Code.
Wo funktioniert es? Desktop-Chats, Code-Tab, Browser, Smartphone, Cloud?
Kurz gesagt: Claude Desktop (macOS/Windows) und Claude Code; Cloud-Sitzungen von Claude Code mit einmaliger Einrichtung — nicht der Chat im Browser oder auf Mobilgeräten. Kirat ist ein Programm, kein Dienst. Es funktioniert nur dort, wo Claude Tools auf einem Rechner ausführt, auf dem Kirat installiert ist:
- Chats in Claude Desktop unter macOS und Windows — mit der
.mcpb-Erweiterung. - Claude Code im Terminal oder in VS Code sowie lokale Sitzungen im Code-Tab von Claude Desktop — mit dem Claude-Code-Plugin. Es erfordert Node.js 20 oder neuer, und für die Installation wird einmalig das Kommandozeilen-Tool
claudebenötigt. Die.mcpb-Erweiterung ist für Chats gemacht, nicht für Sitzungen im Code-Tab. - SSH-Sitzungen — mit dem auf dem entfernten Rechner installierten Plugin.
- Cloud-Sitzungen von Claude Code (Cloud-Sitzungen im Code-Tab, Claude Code im Web oder in der mobilen App) — mit einmaliger Einrichtung Ihrer Cloud-Umgebung und mit Einschränkungen (siehe nächste Frage).
Nicht unterstützt: Chat im Browser (claude.ai) oder in den mobilen Apps sowie Cowork-Aufgaben, die in der Cloud laufen. Die Erweiterung auf Ihrem Computer erreicht nie eine Cloud-Sitzung, selbst wenn Claude Desktop Kirat dort unter „+ → Connectors“ als eingeschaltet anzeigt. Welche Art von Code-Tab-Sitzung Sie nutzen, sehen Sie an der Umgebungsauswahl im Eingabefeld: Local, SSH, WSL oder der Name einer Cloud-Umgebung.
Nicht getestet: WSL-Sitzungen und lokale Cowork-Aufgaben.
Netzwerke auf Ihrem eigenen Computer, die einen HTTP-Proxy erfordern, werden nicht unterstützt; Cloud-Umgebungen von Claude Code funktionieren. Wenn Ihre Organisation Desktop-Erweiterungen auf eine Freigabeliste beschränkt, sind manuelle Installationen gesperrt; fragen Sie Ihren Admin.
Wie funktioniert Kirat in Cloud-Sitzungen von Claude Code, und welche Grenzen gibt es?
Cloud-Sitzungen — Cloud-Sitzungen im Code-Tab, Claude Code im Web oder in der mobilen App — laufen auf den Servern von Anthropic in einer Cloud-Umgebung. Die Erweiterung auf Ihrem Computer kann sie nicht erreichen. Stattdessen richten Sie die Cloud-Umgebung einmal ein:
- den Block aus dem Download (
cloud/setup.sh) am Anfang des Setup-Skripts der Umgebung einfügen; - Ihre beiden Keys als Umgebungsvariablen anlegen — wir empfehlen die Namen
KIRAT_OPENAI_API_KEYundKIRAT_GEMINI_API_KEY, die nicht mit dem eigenenOPENAI_API_KEYeines Projekts kollidieren (Kirat akzeptiert auchOPENAI_API_KEYundGEMINI_API_KEY); - Netzwerkzugriff: Steht er auf Full, ist nichts zu ändern; andernfalls auf Custom (in neueren Apps: Limited) stellen, mit der Standardliste für Paketmanager, plus
api.openai.comund den Kirat-Download-Host.
Das Skript lädt genau Ihre Version von Kirat herunter, prüft ihre SHA-256-Prüfsumme und installiert sie. Es ist eine einmalige Einrichtung, kein einzelner Klick. Wir haben sie in einem Cloud-Container getestet.
Die Grenzen: Alle, die die Umgebung nutzen, können ihre Umgebungsvariablen lesen, auch Ihre Keys. Jede Cloud-Sitzung startet neu, daher zählt das Tagesbudget von Kirat pro Sitzung — setzen Sie Ausgabenlimits bei OpenAI und Google; in der Cloud sind sie Ihre eigentliche Obergrenze. Hintergrundjobs und letzte Ergebnisse enden mit der Sitzung. Neben api.openai.com muss der Netzwerkzugriff der Umgebung den Kirat-Download-Host zulassen (Gemini ist durch die Standardliste abgedeckt). Schlägt das Setup fehl, startet die Sitzung trotzdem, nur ohne Kirat — und der fehlgeschlagene Zustand kann für neue Sitzungen zwischengespeichert bleiben, bis Sie das Setup-Skript bearbeiten (jede Änderung bewirkt, dass neue Sitzungen es erneut ausführen).
Die Download-Adresse im Setup-Skript ist Teil Ihres Kaufs, wie das ZIP; veröffentlichen Sie sie nicht. Die Lizenz deckt Ihre eigenen Cloud-Umgebungen ab. Eine Cloud-Umgebung, die Sie mit anderen teilen, erfordert eine Lizenz pro Person.
Welche Modelle nutzt es? Und wenn ein Anbieter eines außer Betrieb nimmt?
Standardmäßig gpt-5.6 von OpenAI und gemini-3.6-flash von Google, mit Claude als dritter Stimme.
Modellnamen und Preise sind Einstellungen. Nimmt ein Anbieter ein Modell außer Betrieb, tragen Sie den neuen Namen und seine beiden Preise ein. Kein Update nötig.
Claude Desktop meldet, die Erweiterung sei nicht von Anthropic verifiziert. Ist das ein Problem?
Diese Warnung ist zu erwarten. Claude Desktop zeigt sie bei Erweiterungen, die aus einer Datei installiert werden, und Kirat wird aus einer Datei installiert — es ist nicht von Anthropic verifiziert oder signiert.
Wie funktionieren Updates?
Installieren Sie in Claude Desktop die neue .mcpb auf dieselbe Weise wie die erste. Ihre Keys und Einstellungen bleiben erhalten.
Kompatibilitätsupdates sind nach Möglichkeit kostenlos, aber ohne Garantie. Größere neue Versionen können separat verkauft werden.
Bekomme ich Support?
Bei Problemen mit Kauf, Download und Installation: ja, per E-Mail — die Kontaktdaten stehen im Impressum. Es gibt keine Implementierungsberatung und keine garantierte Antwortzeit.
Was erlaubt die Lizenz?
Eine Person, auf beliebig vielen eigenen Geräten und in Ihren eigenen Cloud-Umgebungen. Eine Cloud-Umgebung, die Sie mit anderen teilen, erfordert eine Lizenz pro Person. Kein Weiterverkauf und keine Weitergabe. Kirat ist proprietäre Software, nicht Open Source.
Was der Rat produziert, in Ihrer eigenen Arbeit zu verwenden, auch in kommerzieller Arbeit, ist erlaubt. Die vollständigen Bedingungen stehen in den AGB.
Wofür ist der Blueprint? Brauche ich ihn?
Für die Nutzung von Kirat brauchen Sie ihn nicht. Der Blueprint richtet sich an alle, die mit einem Coding-Agenten ihren eigenen Rat-Server bauen oder anpassen wollen.
Er enthält nur Dokumente — keinen Code, keine installierbare Erweiterung: die Spezifikation (strukturierte Anforderungen an die Tools), die Architekturentscheidungen jeweils mit ihrer Begründung, die Abnahme-Checkliste, anhand derer ein Agent sich selbst prüfen kann, und die Benchmark-Daten hinter den Zahlen auf dieser Website. Einen Bundle-Preis gibt es nicht.