For Claude Desktop and Claude Code

Don't let one AI decide alone.

Kirat brings ChatGPT and Gemini into Claude. They take positions on your question independently, Claude adds its own, then all three vote. You see the majority view, every reason and the dissent. Without a majority, Kirat says so.

Exploded view of Kirat Five stacked layers, each drawn with its function: the tool surface with nine tools Claude calls, seven with API costs at the providers and two without; the vote engine turning three positions into one verdict; the budget guard with its reservation threshold; failure handling with an interrupted path and a retry route; and the background waiting room queue. 01 Tool surface Nine tools Claude calls 02 Vote engine Majority, tie-break, round cap 03 Budget guard Reserves worst case, daily cap 04 Failure handling Breaker, per-provider timeouts 05 Waiting room Long runs return a ticket FIG. 1 — EXPLODED VIEW, ALL PARTS INCLUDED
Kirat in 73 seconds
01 — Replay

Watch the council work.

Real recordings of Kirat's tools, made on 13 October 2026 with the version you buy. Pick a tool and watch the council work: independent positions, cross-checks, anonymous rankings and the dissent. This is a replay: nothing you click here calls a model, and nothing leaves this page. The chat is written for illustration and only restates the recorded result; what Claude sent to Kirat and what came back are shown unchanged under “Behind the scenes”.

Five questions from different fields. Pick one.

Let Kirat vote on this: I run a small B2B SaaS alone. Should I add a free tier?

kirat_voteasked the council

The council has decided (majority 2:1): Keep paid only, change nothing.

My own vote was the dissent: “Keep paid only, extend the trial to 30 days”. It stays on record with its reasoning, so you can weigh it yourself.

Behind the scenes

kirat_voteWhat Claude sends to Kirat

Question: I run a small B2B SaaS alone. Should I add a free tier?

RECORDED 2026-10-13 · KIRAT_VOTE · EFFORT: STANDARD · 1 ROUND

Context sent: Solo developer. Invoicing tool for freelancers, USD 19 per month, 14-day free trial, 30 paying customers after 5 months. Signups come mostly from two blog posts that rank on Google. About 12% of trials convert. Support already takes about 5 hours a week. The developer has a day job and about 10 hours a week for the product.

Options: Add a free tier · Keep paid only, extend the trial to 30 days · Keep paid only, change nothing

Result from the council

gpt-5.6confidence 88
Keep paid only, change nothingA free tier would likely increase non-paying users and support load, which is already consuming half of the available 10 hours per week. A 12% trial conversion is respectable, so there is no clear evidence that trial length is the bottleneck. Keep the current model and spend scarce time reducing support needs and expanding acquisition beyond two blog posts.
gemini-3.6-flashconfidence 90
Keep paid only, change nothingWith only 10 hours a week available, support already takes 50% of the capacity. A free tier would drive up support volume from non-paying users without any control. A 12% trial conversion rate is already strong; the bottleneck is traffic, not the pricing model.
claude (third voter)confidence 58
Keep paid only, extend the trial to 30 daysA free tier mainly adds support load, which is already half of the available time. Invoicing is monthly, so a 14-day trial may end before a freelancer sends a second invoice and sees the value. A 30-day trial covers one full billing cycle without adding permanent free users.Dissent, recorded
DecisionKeep paid only, change nothingPathmajority 2:1Cost$0.015

Let Kirat vote on this: Our client's online shop needs a rebuild. Rebuild it on WooCommerce or migrate to Shopify?

kirat_voteasked the council

The council has decided (unanimous 3:0): Migrate to Shopify.

All three positions, mine included, point the same way. Each one comes with its reasoning.

Behind the scenes

kirat_voteWhat Claude sends to Kirat

Question: Our client's online shop needs a rebuild. Rebuild it on WooCommerce or migrate to Shopify?

RECORDED 2026-10-13 · KIRAT_VOTE · EFFORT: STANDARD · 1 ROUND

Context sent: We are a small digital agency. The client sells about 1,800 furniture products in Germany, Austria and Switzerland, has 3 staff and no in-house developer. The current shop is a self-hosted WooCommerce install, 6 years old, with 31 plugins, slow pages and two security incidents in the last year. Revenue is about EUR 1.2 million a year. The client wants lower maintenance and fewer emergencies; they use a local ERP that exports product data as CSV. Budget for the rebuild: EUR 25,000.

Options: Rebuild on WooCommerce · Migrate to Shopify

Result from the council

gpt-5.6confidence 89
Migrate to ShopifyShopify better matches the client's primary goals: lower maintenance, fewer security emergencies and no need for an in-house developer. A 1,800-product catalogue and CSV-based ERP workflow are manageable, and the EUR 25,000 budget should cover a disciplined migration plus DACH-specific tax, payment and legal setup. The trade-offs are recurring app/platform costs, less backend flexibility and the need to validate the ERP import workflow and any furniture-specific variants before committing. Rebuilding WooCommerce could preserve flexibility, but it would retain responsibility for hosting, updates, plugin compatibility and security—the exact operational burden the client wants to reduce.
gemini-3.6-flashconfidence 90
Migrate to ShopifyWith no in-house developer, 3 staff members, and a history of security incidents, Shopify drastically reduces maintenance overhead and security risks. A €25,000 budget is sufficient for a Shopify migration including CSV ERP integration, whereas rebuilding on WooCommerce would perpetuate high maintenance costs and ongoing emergency risks.
claude (third voter)confidence 72
Migrate to ShopifyWith no in-house developer, 31 plugins and two security incidents, the client's real problem is maintenance, not features. Shopify removes hosting, updates and most security work; CSV product import from the ERP is standard. The trade-off is transaction and app fees and less flexibility, which matters less than stability at this size.
DecisionMigrate to ShopifyPathunanimous 3:0Cost$0.015

Let Kirat vote on this: A local bakery wants more cake pre-orders. Where should the next EUR 3,000 go first?

kirat_voteasked the council

The council has decided (unanimous 3:0): A proper online ordering page.

All three positions, mine included, point the same way. Each one comes with its reasoning.

Behind the scenes

kirat_voteWhat Claude sends to Kirat

Question: A local bakery wants more cake pre-orders. Where should the next EUR 3,000 go first?

RECORDED 2026-10-13 · KIRAT_VOTE · EFFORT: STANDARD · 1 ROUND

Context sent: Bakery with 6 staff in a German town of 40,000 people. Custom cakes and pre-orders have the best margin. Today, orders come in only by phone and email; the website has opening hours and a contact form, nothing to order with. The Google Business Profile has 4.7 stars from 120 reviews. No paid advertising so far. Budget: EUR 3,000 for the next quarter, the owner has little time.

Options: Google Ads · A proper online ordering page · Split evenly between both

Result from the council

gpt-5.6confidence 94
A proper online ordering pageFix the bottleneck first: right now, interested customers cannot pre-order conveniently or in a structured way. A simple, mobile-friendly ordering page with cake selection, pick-up date, customization options, price or deposit, and a confirmation uses the strong local visibility the bakery already has and cuts down phone and email work. Google Ads without a reliable ordering process would send paid traffic into a weak conversion path. After a few weeks of measurable orders, a later ad budget can be spent in a more targeted way.
gemini-3.6-flashconfidence 90
A proper online ordering pageWithout a digital ordering path, ads only create more time-consuming manual work by phone and email, which the owner can hardly handle. On top of that, the strong Google profile (4.7 stars) will convert the organic traffic it already brings much better with a real ordering page, right away, before any money should go into ads.
claude (third voter)confidence 74
A proper online ordering pageAds only pay off if the click can turn into an order. Right now every visitor has to call or email, so paid traffic would leak. An ordering page with product choices, pick-up dates and prepayment converts the demand the 4.7-star profile already brings, and makes later ads measurable.
DecisionA proper online ordering pagePathunanimous 3:0Cost$0.012

Let Kirat vote on this: Extract our billing module into a separate service now, or harden its boundaries inside the monolith first?

kirat_voteasked the council

The council has decided (unanimous 3:0): Harden boundaries inside the monolith first.

All three positions, mine included, point the same way. Each one comes with its reasoning.

Behind the scenes

kirat_voteWhat Claude sends to Kirat

Question: Extract our billing module into a separate service now, or harden its boundaries inside the monolith first?

RECORDED 2026-10-13 · KIRAT_VOTE · EFFORT: STANDARD · 1 ROUND

Context sent: Team of 8 engineers. One TypeScript monolith, about 60,000 lines, one Postgres database, deployed several times a day. The billing module changes every week and caused 5 of the last 8 production incidents, mostly through other modules reading and writing billing tables directly. No one on the team has run a distributed system in production. Leadership wants fewer incidents within two quarters.

Options: Extract billing into a service now · Harden boundaries inside the monolith first

Result from the council

gpt-5.6confidence 94
Harden boundaries inside the monolith firstThe incidents are primarily caused by uncontrolled database access, not by the lack of a network boundary. Enforce billing ownership inside the monolith: remove direct table access, expose a narrow internal API, add database permissions or schema-level controls, and add contract and integration tests. This targets the failure mode quickly within the two-quarter window. Extracting now would add deployment, observability, retries, data consistency, and operational complexity to a team with no distributed-systems experience. Once access paths and data ownership are explicit, extraction becomes safer and can be reconsidered if independent scaling or deployment is still valuable.
gemini-3.6-flashconfidence 90
Harden boundaries inside the monolith firstThe main cause of the outages is other modules accessing billing tables directly in the database. Hardening the module boundaries solves this problem directly within the existing monolith. Since the 8-person team has no experience with distributed systems, extracting the module now would create new risks and endanger the goal of reducing incidents within two quarters.
claude (third voter)confidence 76
Harden boundaries inside the monolith firstThe incidents come from other modules touching billing tables directly. A service split would force that boundary too, but it adds network failures, distributed transactions and new operations work for a team without that experience. Enforcing a module API and table ownership inside the monolith fixes the cause faster, and keeps the extraction option open for later.
DecisionHarden boundaries inside the monolith firstPathunanimous 3:0Cost$0.014

Let Kirat vote on this: In our systematic review, can a single LLM screening pass replace the second human screener?

kirat_voteasked the council

The council has decided (unanimous 3:0): Use the LLM as an additional screener; humans resolve conflicts.

All three positions, mine included, point the same way. Each one comes with its reasoning.

Behind the scenes

kirat_voteWhat Claude sends to Kirat

Question: In our systematic review, can a single LLM screening pass replace the second human screener?

RECORDED 2026-10-13 · KIRAT_VOTE · EFFORT: STANDARD · 1 ROUND

Context sent: Title-and-abstract screening of about 3,000 records for a systematic review in health services research, planned for publication. Current protocol: two independent human screeners, conflicts resolved by discussion. Staff time is short. The review follows PRISMA, and reviewers of the journal will ask how screening was done. Missing a relevant study (false exclusion) is worse than including an irrelevant one.

Options: Yes, replace the second human screener · Use the LLM as an additional screener; humans resolve conflicts · No, keep two human screeners and no LLM

Result from the council

gpt-5.6confidence 94
Use the LLM as an additional screener; humans resolve conflictsA single LLM pass should not replace independent human screening when false exclusions are the main risk: performance may vary by topic, prompt, and model version, and errors can be systematic. Use it to prioritize records or flag disagreements, but require human resolution of conflicts and human confirmation of exclusions. Document the model, version, prompt, validation sample, and decision workflow for PRISMA reporting and reproducibility.
gemini-3.6-flashconfidence 88
Use the LLM as an additional screener; humans resolve conflictsA hybrid approach substantially reduces the human workload for 3,000 titles and abstracts, while keeping the methodological rigor that PRISMA and peer reviewers require. Because false exclusions must be avoided, having humans resolve every discrepancy (or using a highly sensitive prompting approach) ensures that no relevant studies are lost.
claude (third voter)confidence 70
Use the LLM as an additional screener; humans resolve conflictsFalse exclusions are the costly error, and LLM recall on screening varies by topic and prompt. Replacing the second human removes the check that catches those errors and is hard to defend to journal reviewers. Adding the LLM as a third screener and resolving conflicts by humans keeps the protocol defensible and still flags likely misses.
DecisionUse the LLM as an additional screener; humans resolve conflictsPathunanimous 3:0Cost$0.019

Recorded on 13 October 2026 with kirat_vote at the standard effort tier; each session took under 20 seconds and cost under two cents. Questions, options and context are shown exactly as sent, the reasoning in full. Gemini answered four times in German and ChatGPT once; those answers are translated here. In the free-tier question, Claude lost the vote 2:1, and its objection stayed on the record. Confidence values are each model's own self-report.

Five code excerpts from different fields, each sent exactly as shown. ChatGPT and Gemini review in parallel, Claude adds two findings of its own, and every finding is checked by the other model family. Only confirmed findings count. Pick one.

Have Kirat review our Stripe payment webhook for security and correctness before we ship it.

kirat_reviewasked the council

Kirat found 14 confirmed issues (4 × critical, 4 × high, 6 × medium). Each finding was cross-checked by the other model family.

Start with the ones at the top of the list; each comes with a suggested fix.

Behind the scenes

kirat_reviewWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_REVIEW · EFFORT: STANDARD · 14 CONFIRMED, 0 REJECTED · $0.14

Focus: security and correctness of a payment webhook

Code sent:

// 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;

Result from the council

  1. critical

    The webhook processes the request body without checking the Stripe signature. Any external caller can therefore send forged `invoice.paid` or `customer.subscription.deleted` events and unlock or downgrade user accounts. The JSON parser also discards the unmodified raw body that Stripe signature verification requires.

    Fix: Use `express.raw({ type: 'application/json' })` for this route and call `stripe.webhooks.constructEvent(req.body, req.headers['stripe-signature'], webhookSecret)` before any processing. Make sure that no global JSON parser is already applied to this route beforehand; reject invalid signatures with 400.

    line 6 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  2. critical

    Missing validation of the Stripe webhook signature. An attacker can send arbitrary forged webhook events to this endpoint in order to set accounts to Pro without authorization or manipulate database entries.

    Fix: Use stripe.webhooks.constructEvent() with the Stripe webhook secret to verify the authenticity and integrity of every event.

    line 6 · found by gemini-3.6-flash · confirmed by gpt-5.6

  3. critical

    SQL injection vulnerability due to direct concatenation of user input (event.data.object.customer) into the SQL query string.

    Fix: Use parameterized queries as in the previous statements: db.query('UPDATE users SET plan = $1 WHERE stripe_customer = $2', ['free', event.data.object.customer]).

    line 18 · found by gemini-3.6-flash · confirmed by gpt-5.6

  4. critical

    The webhook never verifies the Stripe signature, and express.json() discards the raw body needed to do so. Anyone can POST a fake invoice.paid event and upgrade any account to pro for free.

    Fix: Use express.raw({ type: 'application/json' }) on this route and build the event with stripe.webhooks.constructEvent(req.body, req.headers['stripe-signature'], endpointSecret); reject the request on failure.

    line 6 · found by claude · confirmed by gpt-5.6, gemini-3.6-flash

  5. high

    The customer ID is inserted directly into an SQL statement. A value such as `' OR 1=1 --` can manipulate the WHERE clause and set all users to the free plan; depending on the database configuration, further SQL injections are possible.

    Fix: Fully parameterize the query: `UPDATE users SET plan = 'free' WHERE stripe_customer = $1` with `[event.data.object.customer]`. Additionally, authenticate the event via the Stripe signature.

    line 19 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  6. high

    There is no idempotency check. Stripe delivers webhooks at least once and retries them on timeouts or errors. The same `invoice.paid` event can therefore create identical payment entries multiple times.

    Fix: Store the Stripe event ID or invoice ID in the payment record, secure it with a UNIQUE constraint, and execute event processing together with the payment atomically as an insert/upsert. Acknowledge already processed events with 200 without repeating the business operation.

    line 14 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  7. high

    The `async` handler has no error forwarding. Express 4 does not automatically catch rejected promises from asynchronous route handlers. A DB error or an incomplete `invoice.paid` object therefore leads to an unhandled promise rejection and, under Node 20, can terminate the process instead of returning an error response in a controlled way.

    Fix: Wrap the handler in `try/catch` and pass errors on to `next(err)`, or use an async wrapper. Validate the input structure before accessing it and, on temporary processing errors, return a 5xx status in a controlled way so that Stripe redelivers.

    line 6 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  8. high

    Using express.json() for the webhook endpoint parses the body as JSON in advance. Stripe's signature verification, however, requires the unmodified raw body.

    Fix: Use express.raw({ type: 'application/json' }) instead of express.json() for the Stripe webhook route handler.

    line 6 · found by gemini-3.6-flash · confirmed by gpt-5.6

  9. medium

    The user update and the payment entry are two independently committed database operations. If the INSERT fails after a successful UPDATE, the user gets the Pro plan even though no corresponding payment record exists.

    Fix: Execute both operations together with the idempotency marker in a single database transaction on the same client, and roll back completely on any error.

    line 12 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  10. medium

    The processing does not take into account that Stripe can deliver events out of their creation order. A delayed older `invoice.paid` can reset `paid_until`; a delayed `customer.subscription.deleted` can set a user who has since been reactivated back to `free`.

    Fix: Reconcile the current subscription state using stable Stripe IDs, for example by fetching it from Stripe, and persist state transitions or the timestamp of the last processed event. At a minimum, only ever update `paid_until` forward, and do not blindly apply deletion events to the current user state.

    line 12 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  11. medium

    `amount_paid / 100` assumes without checking that the currency has exactly two decimal places. That is wrong for JPY, for example. In addition, the currency is not stored alongside it, so the amount in the payment record has no unambiguous unit.

    Fix: Preferably store amounts unchanged in the smallest currency unit together with `invoice.currency`. If major currency units are needed, perform the conversion based on the respective currency exponents.

    line 15 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  12. medium

    Missing exception handling in an asynchronous Express 4 route. On a database error or missing fields, this leads to an unhandled promise rejection that can crash the application.

    Fix: Add a try-catch block and pass errors on to next(err), or use a utility such as express-async-handler.

    line 6 · found by gemini-3.6-flash · confirmed by gpt-5.6

  13. medium

    No validation that invoice.metadata.userId is present. If the metadata or userId field is missing or undefined, the SQL queries fail or operate on invalid values.

    Fix: Before executing the database queries, explicitly check whether invoice.metadata and invoice.metadata.userId are present and valid.

    line 10 · found by gemini-3.6-flash · confirmed by gpt-5.6

  14. medium

    Stripe retries webhooks and can deliver the same event more than once. Each delivery inserts another payment row, so revenue reports double-count.

    Fix: Store event.id (or the invoice id) with a unique constraint and skip events that were already processed.

    line 14 · found by claude · confirmed by gpt-5.6, gemini-3.6-flash

Have Kirat review this WooCommerce import plugin for security and correctness.

kirat_reviewasked the council

Kirat found 21 confirmed issues (5 × critical, 5 × high, 10 × medium, 1 × low). Each finding was cross-checked by the other model family.

Start with the ones at the top of the list; each comes with a suggested fix.

Behind the scenes

kirat_reviewWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_REVIEW · EFFORT: STANDARD · 21 CONFIRMED, 0 REJECTED · $0.17

Focus: security and correctness of a WooCommerce import plugin

Code sent:

<?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();
}

Result from the council

  1. critical

    The import is publicly reachable via `wp_ajax_nopriv_erp_import`; the authenticated hook also lacks capability and nonce checks. As a result, anonymous users or CSRF attacks can change product names, prices and stock levels.

    Fix: Remove the `nopriv` hook, check a suitable capability such as `manage_woocommerce` before any processing, and secure the request with `check_ajax_referer()`.

    line 3 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  2. critical

    The hook wp_ajax_nopriv_erp_import grants unauthenticated visitors access to the import function.

    Fix: Remove the nopriv hook and check the permission using current_user_can('manage_options').

    line 4 · found by gemini-3.6-flash · confirmed by gpt-5.6

  3. critical

    The file path from $_POST['file'] is passed to file() unchecked, which enables path traversal and arbitrary file read (LFI).

    Fix: Handle file uploads via $_FILES, or strictly validate the input path against permitted directories (e.g. wp_upload_dir()).

    line 7 · found by gemini-3.6-flash · confirmed by gpt-5.6

  4. critical

    SQL injection vulnerability, since $sku is inserted directly into the SQL query without sanitization.

    Fix: Use prepared statements with $wpdb->prepare().

    line 11 · found by gemini-3.6-flash · confirmed by gpt-5.6

  5. critical

    The import is registered for wp_ajax_nopriv, and there is no capability check and no nonce. Any visitor can trigger it and overwrite prices, stock and product names.

    Fix: Remove the nopriv hook, check current_user_can('manage_woocommerce') and verify a nonce with check_ajax_referer() before doing anything.

    line 4 · found by claude · confirmed by gpt-5.6, gemini-3.6-flash

  6. high

    The path supplied by the client is passed to `file()` unchecked. This allows any readable local files and – depending on `allow_url_fopen` – external or internal URLs to be processed, which enables unwanted file access and blind SSRF.

    Fix: Do not accept freely chosen paths. Use only upload IDs known on the server side, check the canonical path against a fixed import directory, and allow only regular local CSV files.

    line 8 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  7. high

    `$sku` comes from the CSV and is interpolated directly into SQL. A SKU value containing SQL metacharacters can manipulate the query and, among other things, select any post ID as the update target.

    Fix: Parameterize the query with `$wpdb->prepare()`, for example with `meta_value = %s`, or use the WooCommerce function for looking up a product by SKU.

    line 13 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  8. high

    `file()` loads the entire input into memory, and `array_map()` additionally creates the complete parsed array. Without a size limit, a large or endless remote resource can exhaust memory, runtime and PHP workers; the public reachability makes this worse.

    Fix: Limit file size and line count, open the file locally with `fopen()` and process records in a streaming fashion via `fgetcsv()`. Additionally, use rate limits or a controlled background job.

    line 9 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  9. high

    Missing CSRF protection (nonce validation).

    Fix: Call check_ajax_referer() at the start of the function.

    line 6 · found by gemini-3.6-flash · confirmed by gpt-5.6

  10. high

    The file path comes straight from the request and is passed to file(). An attacker can read any file the web server can read, or a remote URL if allow_url_fopen is on.

    Fix: Accept an uploaded file through wp_handle_upload() or read only from one fixed import directory; never take a path from the request.

    line 8 · found by claude · confirmed by gpt-5.6, gemini-3.6-flash

  11. medium

    It is assumed that every line has exactly four usable columns. Empty or corrupted lines yield missing values, which produces warnings and can unintentionally set name, price or stock to empty values.

    Fix: Before destructuring, check the column count and required fields, skip empty lines, and reject faulty records with a clear error message.

    line 12 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  12. medium

    The combination of `file()` and `str_getcsv()` parses each physical line separately. Valid CSV fields with embedded line breaks are therefore split into several faulty records.

    Fix: Read the CSV as a stream with `fgetcsv()`; this function handles multi-line, correctly quoted fields across record boundaries.

    line 9 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  13. medium

    Price and stock are stored unchecked as arbitrary strings. Non-numeric values, wrong decimal formats or impermissible stock levels can corrupt the product data and lead to inconsistent calculations.

    Fix: Validate price and stock before writing and normalize them with WooCommerce helpers such as `wc_format_decimal()` and `wc_stock_amount()`; reject values that are invalid or impermissible from a business standpoint.

    line 15 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  14. medium

    WooCommerce data is changed directly as post meta. As a result, related states such as `_stock_status`, product lookup tables and possibly caches are not reliably synchronized with the new prices and stock levels.

    Fix: Load the product via `wc_get_product()`, use the CRUD methods such as `set_regular_price()`, `set_price()` and `set_stock_quantity()`, set the stock status or `manage_stock` according to the business rules, and then call `save()`.

    line 15 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  15. medium

    The SKU lookup considers all post metadata and checks neither the post type nor whether the ID found is actually a WooCommerce product or variation. With duplicate or unrelated `_sku` metadata, a non-deterministic match is also updated.

    Fix: Use `wc_get_product_id_by_sku()` and then validate the result with `wc_get_product()` and the expected product type; treat duplicate SKUs as import errors.

    line 13 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  16. medium

    The return values of `update_post_meta()` and `wp_update_post()` are ignored. The import can partially fail or abort, but still reports the total number of lines read as successfully imported.

    Fix: Record success and failure per product, use `wp_update_post(..., true)`, count only records that were actually updated, and return a structured error response. Provide a resumable background job for large imports.

    line 15 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  17. medium

    For each CSV line, at least one lookup query and several individual write operations are executed synchronously. Large imports therefore cause many database round trips, can run into a request timeout and leave behind a catalog that is only partially updated.

    Fix: Run the import in limited batches as a background process, resolve SKUs collectively, and store progress and resume state.

    line 11 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  18. medium

    file() reads the entire file into memory at once, which leads to memory exhaustion errors with large CSV files.

    Fix: Stream the file line by line via fopen() and fgetcsv().

    line 8 · found by gemini-3.6-flash · confirmed by gpt-5.6

  19. medium

    The array destructuring assumes that every line contains at least 4 elements; otherwise PHP warnings or uninitialized index errors occur.

    Fix: Before unpacking, check with count($row) whether enough columns are present.

    line 10 · found by gemini-3.6-flash · confirmed by gpt-5.6

  20. medium

    Database queries and post updates are performed individually in a loop (N+1 problem), which slows execution time considerably.

    Fix: Split the import into batches and bundle queries/updates.

    line 11 · found by gemini-3.6-flash · confirmed by gpt-5.6

  21. low

    Errors from `file()` are not checked. For a missing, unreadable or unsupported path, `file()` returns `false`, whereupon `array_map()` can throw a `TypeError` under current PHP versions.

    Fix: Explicitly check opening and reading, do not use PHP warnings as control flow, and on errors return an appropriate HTTP or `wp_send_json_error()` response.

    line 9 · found by gpt-5.6 · confirmed by gemini-3.6-flash

Have Kirat review the order and payment flow of the bakery’s ordering page for security and correctness.

kirat_reviewasked the council

Kirat found 14 confirmed issues (4 × critical, 4 × high, 5 × medium, 1 × low). Each finding was cross-checked by the other model family.

Start with the ones at the top of the list; each comes with a suggested fix.

Behind the scenes

kirat_reviewWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_REVIEW · EFFORT: STANDARD · 14 CONFIRMED, 0 REJECTED · $0.11

Focus: security and correctness of an order and payment flow

Code sent:

// 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;

Result from the council

  1. critical

    cakeId is interpolated directly into the SQL string. An attacker can inject SQL expressions or additional statements and thereby read or modify data, or put load on the database.

    Fix: Parameterize this query as well, e.g. `SELECT ... FROM cakes WHERE id = $1` with `[cakeId]`, and additionally check cakeId for the expected type.

    line 10 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  2. critical

    SQL injection vulnerability due to direct template-string interpolation of cakeId in the SQL query.

    Fix: Use a parameterized SQL query: pool.query('SELECT * FROM cakes WHERE id = $1', [cakeId]).

    line 9 · found by gemini-3.6-flash · confirmed by gpt-5.6

  3. critical

    Client-side price manipulation is possible. The price is taken from req.body and directly stored and processed.

    Fix: Read the price server-side from the database (cake.rows[0].price) and do not trust the value sent by the client.

    line 8 · found by gemini-3.6-flash · confirmed by gpt-5.6

  4. critical

    cakeId from the request body is interpolated into the SQL string: SQL injection.

    Fix: Use a parameterized query: SELECT * FROM cakes WHERE id = $1.

    line 10 · found by claude · confirmed by gpt-5.6, gemini-3.6-flash

  5. high

    The amount that is stored and passed to the payment flow comes entirely from `req.body.price`. A customer can enter a manipulated, negative or very small amount for any cake.

    Fix: Determine the price exclusively server-side from the selected cake or an immutable price version. Create a server-side payment session with this amount at the payment provider and verify the expected amount again server-side upon payment confirmation.

    line 16 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  6. high

    The order is created and a confirmation is sent before any successful payment has been verified. Aborted or deliberately unpaid transactions therefore appear as confirmed orders and can be generated at will.

    Fix: Create orders initially with a status such as `pending_payment`. Only switch to `paid` after an authenticated, idempotently processed payment provider notification, and then send the confirmation or trigger production or reservation.

    line 19 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  7. high

    Missing error handling in an async Express 4 route. Database or runtime errors lead to unhandled promise rejections.

    Fix: Use a try/catch block and forward errors with next(err), or use a package such as express-async-errors.

    line 8 · found by gemini-3.6-flash · confirmed by gpt-5.6

  8. high

    The amount is taken from the client (price in the request body), so a customer can set their own price.

    Fix: Read the price from the cakes row on the server and ignore any client value.

    line 15 · found by claude · confirmed by gpt-5.6, gemini-3.6-flash

  9. medium

    The async handler has no error forwarding. Express 4 does not automatically handle rejected promises from `async` handlers; database or synchronous mail errors can therefore lead to unanswered requests and unhandled rejections.

    Fix: Wrap the handler in `try/catch` and pass errors on to `next(err)`, or use an established async wrapper. Additionally, configure central error handling.

    line 7 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  10. medium

    The result of `sendConfirmation` is neither awaited nor otherwise handled for errors. A promise rejection can remain unhandled; at the same time, the client already receives a success response even though sending the mail may have failed.

    Fix: Perform the sending after confirmed payment via a persistent outbox or job queue with retries. At a minimum, await the promise and log or handle errors in a controlled way.

    line 19 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  11. medium

    There is no idempotency protection. Browser retries, double clicks or network retries each create a new order and possibly multiple confirmations or payment attempts.

    Fix: Accept an idempotency key or checkout session ID, secure it with a unique constraint, and return the already existing order on retries.

    line 13 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  12. medium

    pickupDate, name, email, price and note are processed without business or syntactic validation. This means, for example, past or invalid pickup dates, missing customer data and unsuitable field values can be stored; database errors also only occur late and in an uncontrolled way.

    Fix: Use a request schema with types, required fields, length limits and normalized formats. Check pickup dates against time zone, lead time and permissible opening-hours or capacity rules; do not accept the price as client input.

    line 8 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  13. medium

    The async call to sendConfirmation is neither awaited nor caught for errors.

    Fix: Put await before sendConfirmation and handle possible errors when sending the email.

    line 17 · found by gemini-3.6-flash · confirmed by gpt-5.6

  14. low

    Incomplete input validation for fields such as email, pickupDate, name and note.

    Fix: Implement schema validation (e.g. with Zod or express-validator) before processing the request data.

    line 8 · found by gemini-3.6-flash · confirmed by gpt-5.6

Have Kirat check this billing function for correctness and data integrity.

kirat_reviewasked the council

Kirat found 16 confirmed issues (1 × critical, 11 × high, 3 × medium, 1 × low). Each finding was cross-checked by the other model family.

Start with the ones at the top of the list; each comes with a suggested fix.

Behind the scenes

kirat_reviewWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_REVIEW · EFFORT: STANDARD · 16 CONFIRMED, 0 REJECTED · $0.14

Focus: correctness and data integrity of a billing function

Code sent:

// 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;
}

Result from the council

  1. critical

    Missing database transaction and row lock. With parallel requests, race conditions (e.g. double spending of credit) and incomplete updates in the event of an error can occur.

    Fix: Use a client from the pool with BEGIN/COMMIT, and use SELECT FOR UPDATE to lock and update rows atomically.

    line 5 · found by gemini-3.6-flash · confirmed by gpt-5.6

  2. high

    The three related updates are not executed in a database transaction. If debiting the customer credit or the status change fails, the invoice may already have been reduced without the credit having been correctly charged or the status having been set.

    Fix: Obtain a dedicated client from the pool and execute all checks and updates between BEGIN and COMMIT; use ROLLBACK on any error.

    line 11 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  3. high

    The invoice is first read and later overwritten with an absolute calculated value. Two parallel calls can read the same starting value and then overwrite each other; both credit debits still take place, while only one credit remains fully visible in the invoice.

    Fix: Lock the affected invoice within the same transaction with SELECT ... FOR UPDATE, or change the amount atomically via UPDATE ... SET total_cents = total_cents - $1 with suitable conditions.

    line 4 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  4. high

    Checking and debiting the customer credit are not atomic. Parallel calls can both see the same available coverage and then reduce the credit below zero.

    Fix: Lock the customer record transactionally or use a conditional UPDATE, such as UPDATE customers SET credit_cents = credit_cents - $1 WHERE id = $2 AND credit_cents >= $1 RETURNING credit_cents, and require exactly one returned row.

    line 8 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  5. high

    It is not checked whether the invoice belongs to the specified customer. As a result, a customer's credit can be applied to any invoice identified via invoiceId.

    Fix: Query and update invoice and customer via the ownership relationship, for example with WHERE invoices.id = $1 AND invoices.customer_id = $2; abort if there is no match.

    line 4 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  6. high

    The credit to be applied is not capped at the open invoice amount. If creditCents is greater than total_cents, a negative invoice amount is stored and excess customer credit is consumed.

    Fix: Only allow amounts up to the open invoice value, or determine the amount actually used as min(creditCents, total_cents) and debit only this amount from the customer credit.

    line 10 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  7. high

    Negative, non-integer or not safely representable values are not rejected. In particular, a negative creditCents value increases the invoice amount and at the same time, through the subtraction of a negative value, the customer credit.

    Fix: Require Number.isSafeInteger(creditCents) && creditCents > 0 before any database access; treat monetary amounts consistently as integer cent values.

    line 8 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  8. high

    The invoice status that is read is completely ignored. Credit can therefore also be applied to invoices that are already paid, canceled or otherwise no longer modifiable; an already paid invoice can become negative as a result.

    Fix: Explicitly define the permitted starting statuses and check them atomically in the UPDATE condition, for example AND status = 'open'. If there is no match, abort the operation.

    line 4 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  9. high

    Access to balance.rows[0] and inv.rows[0] without a prior check. If a customer or invoice is not found, the application crashes with an unhandled TypeError.

    Fix: Check inv.rows.length and balance.rows.length before access and throw an explicit error message.

    line 8 · found by gemini-3.6-flash · confirmed by gpt-5.6

  10. high

    Missing validation of creditCents for negative values. A negative value bypasses the check (creditCents > available) and leads to incorrect credit or invoice adjustments.

    Fix: Make sure that creditCents is a positive integer greater than 0.

    line 9 · found by gemini-3.6-flash · confirmed by gpt-5.6

  11. high

    The reads and the three updates run outside a transaction and without row locks. Two concurrent calls can both pass the credit check and spend the same credit twice, and a crash between the updates leaves invoice and credit balance inconsistent.

    Fix: Run everything in one transaction on a single client, lock the rows with SELECT ... FOR UPDATE, and commit only after all updates succeed.

    line 5 · found by claude · confirmed by gpt-5.6, gemini-3.6-flash

  12. high

    The function never checks that the invoice belongs to the customer or that it is still open. Credit from one customer can be applied to another customer's invoice, or to an invoice that is already paid.

    Fix: Select the invoice with WHERE id = $1 AND customer_id = $2 AND status = 'open' and fail if no row comes back.

    line 11 · found by claude · confirmed by gpt-5.6, gemini-3.6-flash

  13. medium

    The existence of the invoice and the customer is not checked. For unknown IDs, accessing rows[0] leads to runtime errors instead of a controlled business error; in addition, both queries are executed unnecessarily before this becomes apparent.

    Fix: Check rowCount or rows.length for both queries and raise a defined not-found error; integrate the check into the transaction and, if possible, into a relational query.

    line 4 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  14. medium

    The return value corresponds neither to the stored cent amount nor to a simple conversion into the main currency: it adds a flat 19 percent and uses floating-point arithmetic. As a result, the caller may receive a value that differs, in tax and rounding terms, from the remaining invoice balance actually stored.

    Fix: Return the remaining amount in cents unchanged, or define a clearly typed return value. If a tax calculation is required for business reasons, take the tax rate and rounding rule from the invoice data and calculate with integer or decimal arithmetic.

    line 17 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  15. medium

    Use of IEEE 754 floating-point arithmetic (newTotal * 1.19 / 100) for financial calculations. This leads to precision and rounding errors.

    Fix: Calculate consistently in cents with integers (BigInt/Math.round), or use a library for exact decimal arithmetic.

    line 18 · found by gemini-3.6-flash · confirmed by gpt-5.6

  16. low

    A separate UPDATE command for the invoice status causes unnecessary database round trips.

    Fix: Combine the update of total_cents and status into a single UPDATE query.

    line 12 · found by gemini-3.6-flash · confirmed by gpt-5.6

Have Kirat check the screening analysis script for our systematic review for correctness.

kirat_reviewasked the council

Kirat found 11 confirmed issues (6 × high, 4 × medium, 1 × low). Each finding was cross-checked by the other model family.

Start with the ones at the top of the list; each comes with a suggested fix.

Behind the scenes

kirat_reviewWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_REVIEW · EFFORT: STANDARD · 11 CONFIRMED, 0 REJECTED · $0.09

Focus: correctness of a screening analysis for a systematic review

Code sent:

# 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)

Result from the council

  1. high

    The default inner join removes all record_id values that occur in only one of the two files. Kappa and conflicts are therefore calculated only for the intersection, without making missing screenings visible. At the same time, “Records screened” in line 18 reports the length of a instead of the intersection actually analyzed.

    Fix: Use an outer join with a merge indicator, compare the ID sets explicitly, and report missing decisions separately or treat them as data errors. For each metric, output the denominator actually used.

    line 7 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  2. high

    The uniqueness of record_id is not checked. Duplicate IDs lead to a many-to-many Cartesian product during the merge and weight individual studies multiple times, which distorts agreement, prevalences, kappa and output files.

    Fix: Before the merge, check record_id in both files for non-nullness and uniqueness, and abort on duplicates. Additionally, use merge(..., validate='one_to_one').

    line 7 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  3. high

    Decision values are not validated. Missing values, typos, upper/lower case or additional categories are implicitly treated like “exclude” when the include prevalence is calculated, while the observed agreement compares exact values. The calculation therefore no longer corresponds to a binary Cohen's kappa and can produce contradictory results.

    Fix: Normalize decision in a controlled way before the analysis and ensure that every value is exactly 'include' or 'exclude'. Handle missing or unknown values separately as data errors or incomplete screening.

    line 9 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  4. high

    excluded contains all records excluded by screener A, including conflicts in which screener B decided “include”. Such records are therefore written to both excluded.csv and conflicts.csv. If excluded.csv is meant to represent the finally excluded hits, unresolved conflicts can be wrongly removed from the review.

    Fix: Without a documented precedence rule, select only matching exclusions, i.e. (decision_a == 'exclude') & (decision_b == 'exclude'). Keep conflicts exclusively in conflicts.csv until a consensus decision has been made.

    line 16 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  5. high

    Incorrect filtering of the excluded studies: 'excluded' takes into account only the decision of screener A ('merged.decision_a == "exclude"'). If there is a conflict (screener A excludes, screener B includes), the study is wrongly counted as excluded.

    Fix: Only export exclusions if both screeners have consistently chosen 'exclude' (e.g. '(merged.decision_a == "exclude") & (merged.decision_b == "exclude")'), or wait for the conflict to be resolved.

    line 16 · found by gemini-3.6-flash · confirmed by gpt-5.6

  6. high

    excluded.csv contains every record screener A excluded, including conflicts where screener B included it. Those records are dropped before the conflict discussion, which is exactly the false exclusion the protocol must avoid.

    Fix: Exclude only records both screeners excluded: merged[(merged.decision_a == 'exclude') & (merged.decision_b == 'exclude')]; send every conflict to resolution first.

    line 16 · found by claude · confirmed by gpt-5.6, gemini-3.6-flash

  7. medium

    If both screeners use only the same category, expected equals 1 and the denominator of kappa equals 0. The result becomes NaN or can produce a division-by-zero warning; the formatted output “nan” does not explain that kappa is mathematically undefined. An empty analyzed intersection also leads to meaningless NaN metrics.

    Fix: Before the division, check whether there are any paired valid decisions at all and whether 1 - expected is greater than 0. In degenerate cases, explicitly report kappa as “not defined” and report the underlying frequencies.

    line 13 · found by gpt-5.6 · confirmed by gemini-3.6-flash

  8. medium

    Possible division by zero in Cohen's kappa if the expected chance value 'expected' equals 1 (e.g. if both screeners choose the same category for 100% of the records).

    Fix: Before the calculation, catch whether '1 - expected == 0' and in that case assign a defined value (e.g. 1.0 or NaN).

    line 12 · found by gemini-3.6-flash · confirmed by gpt-5.6

  9. medium

    Silent discarding of records by the default inner join. If screener A and screener B have rated different sets of 'record_id's, discrepancies in the processed studies are not reported. In addition, 'len(a)' in the console output then does not correspond to the number of studies actually matched.

    Fix: Check whether 'len(a) == len(b) == len(merged)' holds, or perform an outer join to explicitly show incompletely rated records.

    line 7 · found by gemini-3.6-flash · confirmed by gpt-5.6

  10. medium

    The inner merge silently drops records that only one screener has decided, and the printed count uses len(a). Unscreened records disappear from both the agreement and the PRISMA numbers.

    Fix: Merge with how='outer', indicator=True, and fail or report when any record lacks a decision from either screener.

    line 7 · found by claude · confirmed by gpt-5.6, gemini-3.6-flash

  11. low

    Missing input sanitization and handling of missing values in the 'decision' column. Upper/lower case, whitespace or NaN values lead to incorrect comparisons.

    Fix: Clean column values before the comparison (e.g. with '.str.strip().str.lower()') and ensure data type safety.

    line 9 · found by gemini-3.6-flash · confirmed by gpt-5.6

Shown: every confirmed finding with its fix, as the members wrote them; the verifiers' reasoning is shortened to their verdict. Duplicates are not merged, so one problem can appear more than once when several members report it. Code, focus and Claude's own findings were sent in English; findings the members wrote in German are translated here.

Five idea briefs from different fields. ChatGPT and Gemini work in three tracks, Claude adds one idea, and both members rate every idea anonymously (1–10 each, up to 20 points). Pick one.

My two blog posts rank on Google, but few readers start a trial. Brainstorm ideas with Kirat.

kirat_brainstormasked the council

The council came up with 14 ideas and rated each one anonymously. The top three:

  1. Replace the 14-day clock with three real sends (18/20 points)
  2. Complete the task inside the article (17/20 points)
  3. Turn the chase article into a recovery console (17/20 points)

Behind the scenes

kirat_brainstormWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_BRAINSTORM · EFFORT: STANDARD · 14 IDEAS · 1 ROUND · $0.11

Topic: Ideas for a solo developer to turn more readers of two Google-ranking blog posts into trial signups for an invoicing tool for freelancers

Context sent: Invoicing tool for freelancers, USD 19 per month, 14-day free trial, 30 paying customers after 5 months. Signups come mostly from two blog posts that rank on Google (how to write a freelance invoice; how to chase late payments). About 12% of trials convert. The developer has a day job and about 10 hours a week for the product. HARD: no paid advertising. HARD: at most 3 hours a week for this.

Result from the council

  1. 1

    Replace the 14-day clock with three real sends

    gpt-5.6 · rule breaker · 18/20 points (9 + 9)

    Test a trial that ends after three sent invoices or payment chases instead of after 14 calendar days. This deliberately breaks the soft assumption that a time-limited trial is appropriate: freelancers may not invoice during an arbitrary two-week window, so the current trial can expire before the product proves its value. Keep the $19 monthly plan unchanged and compare activation-to-paid conversion by cohort.

  2. 2

    Complete the task inside the article

    gpt-5.6 · within brief · 17/20 points (9 + 8)

    Embed a tiny invoice builder in “how to write a freelance invoice”: readers enter client, amount, due date, and payment terms, then see a finished preview. “Send or save this invoice” creates a trial with those details already loaded, eliminating the gap between learning and doing. Build it in weekly slices capped at three hours, then keep maintenance near zero.

  3. 3

    Turn the chase article into a recovery console

    gpt-5.6 · neighbor · 17/20 points (9 + 8)

    As a one-step substitution of the embedded invoice builder, let readers enter an overdue amount and due date to generate a dated three-message chase sequence. Starting a trial saves the debtor, schedules the messages, and opens the first draft ready to send. This preserves the strongest pattern—useful output before signup—while matching the second post’s intent.

  4. 4

    Put the conversion moment on the debtor’s calendar

    gpt-5.6 · within brief · 16/20 points (7 + 9)

    Offer a generated .ics file in the late-payment article with reminders for the due date and escalating follow-ups on days 1, 7, and 14. Each calendar event contains a deep link that opens the relevant chase workflow with the dates prefilled, bringing the reader back when the pain is real rather than while they are merely researching. It requires no email capture and can run unattended.

  5. 5

    Permanently free plan for one client instead of a trial period

    gemini-3.6-flash · rule breaker · 16/20 points (8 + 8)

    This idea breaks the soft constraint of the 14-day trial and replaces it with a freemium plan for exactly one active client. Freelancers use the product permanently free of charge for their first client and upgrade seamlessly to the 19-dollar flat rate as soon as a second client is added.

  6. 6

    Route readers by immediate problem

    gpt-5.6 · within brief · 14/20 points (8 + 6)

    Replace generic trial banners with three inline choices such as “I need my first invoice,” “I invoice repeatedly,” and “A client is already late.” Each choice opens a matching onboarding state rather than the same homepage, and article section IDs can preselect sensible defaults. Measure completed trial activation, not just CTA clicks, and test one route per week.

  7. 7

    Publish three forensic invoice makeovers

    gpt-5.6 · within brief · 14/20 points (8 + 6)

    With permission, turn three anonymized customer invoices into static before-and-after case studies showing exactly what changed and why. Insert each makeover beside the relevant advice in the ranking post, with a CTA that opens the same corrected structure as an editable trial template. Specific evidence from a small customer base can be more credible than broad testimonials.

  8. 8

    Let readers carry progress between both posts

    gpt-5.6 · within brief · 14/20 points (7 + 7)

    Store a reader’s chosen currency, invoice stage, and due date locally in the browser, then use that state when they move between the two articles. Someone who created an invoice plan can later see a contextual prompt such as “Your invoice is now 3 days late—open the prepared follow-up,” with trial onboarding prefilled. This creates a lightweight two-post journey without requiring an account or ongoing content production.

  9. 9

    Interactive reminder letter configurator

    gemini-3.6-flash · within brief · 14/20 points (7 + 7)

    Add a generator for escalating payment reminder letters to the article on following up on overdue payments. After the text is entered, the template is generated, combined with the CTA to set up automatic payment reminders for future invoices in the trial account.

  10. 10

    Instant-send magic link without prior registration

    gemini-3.6-flash · neighbor · 14/20 points (8 + 6)

    Mutation of the in-content generator: the reader enters invoice details directly in the blog article and clicks on Send invoice right now. In the background, the system seamlessly creates a trial account and sends the email directly; the password is only set afterwards.

  11. 11

    Live invoice generator directly in the blog article

    gemini-3.6-flash · within brief · 13/20 points (6 + 7)

    Embed a simple, interactive form tool directly in the article on writing invoices. Readers type in their invoice details and can download the finished PDF immediately and free of charge. A prominent button offers to send the invoice digitally with one click and to track the payment status in the 14-day trial account.

  12. 12

    One-time pay-per-use reminder instead of a monthly subscription

    gemini-3.6-flash · rule breaker · 13/20 points (6 + 7)

    This idea breaks the soft constraint of the pure SaaS subscription model at 19 dollars per month. For a one-time fee of 5 dollars, readers of the late-payment article can have a legally sound reminder letter including a tracking link sent, with the fee fully credited if they later take out a subscription.

  13. 13

    Template that opens in the tool

    claude · within brief · 11/20 points (6 + 5)

    Offer the invoice template from the post as a ready-to-use invoice in the tool: one click opens a pre-filled trial account instead of a file download.

  14. 14

    Problem-specific exit intent with an automated email sequence

    gemini-3.6-flash · within brief · 8/20 points (4 + 4)

    Implement an exit-intent popup on the late-payment article that offers an emergency email template for late-paying clients in exchange for an email address. An automated three-part email sequence then passively explains how automated workflows reduce late payments, and links to the trial account.

Brainstorm with Kirat: how do we turn this one-off shop rebuild into a care plan the client actually wants?

kirat_brainstormasked the council

The council came up with 15 ideas and rated each one anonymously. The top three:

  1. Budget break: operations before launch gloss (18/20 points)
  2. CSV Product Gatekeeper (17/20 points)
  3. Reliability Dividend (17/20 points)

Behind the scenes

kirat_brainstormWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_BRAINSTORM · EFFORT: STANDARD · 15 IDEAS · 1 ROUND · $0.10

Topic: Ideas for a small digital agency to turn a one-off shop rebuild into a recurring care retainer the client actually wants

Context sent: Agency of 4 people. The client sells about 1,800 furniture products in Germany, Austria and Switzerland, has 3 staff and no in-house developer, revenue about EUR 1.2 million a year. The old self-hosted WooCommerce shop had 31 plugins and two security incidents last year; the client wants lower maintenance and fewer emergencies. A local ERP exports product data as CSV. Rebuild budget: EUR 25,000. HARD: no lock-in; the client must be able to leave with all data and access at any time. HARD: no extra hires at the agency.

Result from the council

  1. 1

    Budget break: operations before launch gloss

    gpt-5.6 · rule breaker · 18/20 points (9 + 9)

    This idea deliberately breaks the soft constraint of the 25,000 EUR rebuild budget: the offer is, for example, 22,000 EUR for a deliberately lean launch plus 12,000 EUR for a binding first year of operation. In return, nice-to-have features are dropped from the initial project; instead, import hardening, restore drills, monitoring and monthly improvements are funded. The higher total volume pays off because the client is not once again buying a seemingly finished shop whose real operating costs only become visible after launch; all access credentials, data and work results remain transferable at any time.

  2. 2

    CSV Product Gatekeeper

    gpt-5.6 · within brief · 17/20 points (9 + 8)

    Before every ERP import, an automated pipeline checks the CSV for missing prices, duplicates, invalid variants, image errors, DACH tax logic and suspicious stock changes. The monthly retainer covers rule maintenance, import monitoring and an understandable error report for the three employees. This turns technical maintenance into a direct business benefit: fewer wrong products, follow-up questions and abandoned purchases.

  3. 3

    Reliability Dividend

    gpt-5.6 · within brief · 17/20 points (8 + 9)

    The client pays a moderate base fee for monitoring and maintenance; an additional quarterly amount only becomes due if agreed reliability targets such as successful imports, tested restoration and response times have been met. Avoidable outages caused by the agency generate service credits instead of billable emergency hours. This model aligns the economic incentives with prevention and takes away the client's fear that the agency profits from problems.

  4. 4

    Exit-ready Care Charter

    gpt-5.6 · within brief · 16/20 points (9 + 7)

    The retainer is deliberately sold as an anti-lock-in product: monitoring, updates, backups, security checks and two small changes per month for about 1,200–1,500 EUR. All accounts are held by the client, and code and import scripts live in the client's repository; every month the client also receives documentation, a data export and a handover pack that lets them cancel at any time. This way the client pays for demonstrable operability instead of dependency.

  5. 5

    Seasonal release train

    gpt-5.6 · within brief · 16/20 points (8 + 8)

    Instead of arbitrary support tickets, there are four plannable commerce releases per year, for example for garden furniture, end of summer, Black Week and Christmas. Included in the retainer for each release are a small UX or merchandising package, regression tests and the technical maintenance in between. This gives the client visible ongoing development and keeps the effort bundleable for the four-person agency.

  6. 6

    The quarterly escape test

    gpt-5.6 · within brief · 16/20 points (9 + 7)

    Once a quarter, the agency provides a complete export of product, customer, order and content data and carries out a documented restart in a neutral test environment. What the client pays for, of all things, is the regularly proven exit: the access list, restore log and handover manual belong to the client. The hard no-lock-in criterion thus turns from an objection into an unusual selling point for the retainer.

  7. 7

    Care Charter plus growth exchange

    gpt-5.6 · neighbor · 16/20 points (8 + 8)

    As a small mutation of the Exit-ready Care Charter, the included change hours are not fixed in advance but shifted monthly between operations, data quality and conversion improvements; unused volume carries over for at most one quarter. A joint 30-minute board decides how they are used, based on risks and revenue opportunities. The retainer stays exit-ready but feels less like insurance and more like a flexible external digital team.

  8. 8

    ERP sync & catalog safety retainer

    gemini-3.6-flash · within brief · 13/20 points (7 + 6)

    The agency takes over the continuous monitoring and maintenance of the interface between the local ERP CSV and the online shop. Faulty data imports, missing furniture variants or wrong prices are caught automatically before they go live. This completely takes the operational burden of data maintenance off the client's 3-person team.

  9. 9

    AI-powered product data enrichment flat rate

    gemini-3.6-flash · neighbor · 13/20 points (6 + 7)

    Mutation of the ERP interface idea: the agency not only maintains the CSV import but also uses AI scripts to automatically enrich the raw data with structured attributes, SEO copy and DACH-specific delivery time notes. This saves the client manual maintenance effort and increases visibility in the furniture market without additional agency staffing.

  10. 10

    CI/CD-based visual regression maintenance contract

    gemini-3.6-flash · within brief · 12/20 points (6 + 6)

    Instead of risky live updates, the agency sets up a staging pipeline that automatically checks monthly plugin updates visually and functionally. The client receives a monthly transparency report and guaranteed response times for security vulnerabilities. This guarantees absolute stability without the previous emergencies.

  11. 11

    Quarterly conversion & UX polishing

    gemini-3.6-flash · within brief · 11/20 points (6 + 5)

    In addition to basic maintenance, the retainer includes fixed hour quotas for optimizing checkout functions and furniture variant displays. The agency analyzes user behavior in the DACH region every month and implements high-return adjustments. This turns the retainer from a pure cost factor into a revenue driver.

  12. 12

    Safe update & instant rollback guarantee

    gemini-3.6-flash · neighbor · 11/20 points (5 + 6)

    Mutation of the CI/CD maintenance contract: the retainer focuses purely on a guaranteed zero-downtime SLA with automated snapshot restoration within 15 minutes in the event of incidents. This directly addresses the client's fear after the two security incidents, with minimal ongoing manual effort.

  13. 13

    Revenue-share growth package instead of a fixed budget

    gemini-3.6-flash · rule breaker · 9/20 points (4 + 5)

    Breaks the soft assumption of a rigid one-time rebuild budget of 25,000 EUR: the rebuild costs are reduced to 10,000 EUR, coupled with a monthly retainer with a small share of the additional revenue. This pays off because the client lowers its investment risk and the agency participates directly in the growth of the 1.2 million EUR shop.

  14. 14

    Headless-Architecture Care Service

    gemini-3.6-flash · rule breaker · 7/20 points (3 + 4)

    Breaks the soft constraint of a classic monolith setup (such as standard WooCommerce): the frontend is decoupled from the backend, so plugin security vulnerabilities can no longer attack the website directly. This pays off because emergencies are structurally eliminated and the client remains portable at any time thanks to an open-source stack and full Git access.

  15. 15

    Monthly one-page care report

    claude · within brief · 6/20 points (4 + 2)

    A one-page monthly report with uptime, page speed, updates applied and incidents prevented, so the client sees what the retainer pays for.

Our new ordering page goes live next month. Brainstorm with Kirat how we get more cake pre-orders without paid ads.

kirat_brainstormasked the council

The council came up with 15 ideas and rated each one anonymously. The top three:

  1. The annual birthday autopilot (18/20 points)
  2. Real cake slots instead of generic posts (17/20 points)
  3. The cake travels as its own advertising medium (16/20 points)

Behind the scenes

kirat_brainstormWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_BRAINSTORM · EFFORT: STANDARD · 15 IDEAS · 1 ROUND · $0.09

Topic: Ideas for a local bakery to get more custom-cake pre-orders through its new online ordering page, without paid ads

Context sent: Bakery with 6 staff in a German town of 40,000 people. Custom cakes and pre-orders have the best margin. A new online ordering page (cake choice, pick-up date, prepayment) goes live next month; until now orders came only by phone and email. The Google Business Profile has 4.7 stars from 120 reviews. The owner has little time, so ideas must run with at most 2 hours a week. HARD: no paid advertising this quarter. HARD: no extra staff.

Result from the council

  1. 1

    The annual birthday autopilot

    gpt-5.6 · within brief · 18/20 points (9 + 9)

    At checkout, customers can voluntarily leave the occasion and month for a reminder the following year. An automated email 21 days beforehand leads to the pre-filled order page; this way every order builds a future order, without ongoing customer acquisition and with clean consent.

  2. 2

    Real cake slots instead of generic posts

    gpt-5.6 · within brief · 17/20 points (9 + 8)

    The order page shows the actual remaining production slots for the next four weeks, such as “Still 2 custom cakes available for Saturday”. A weekly Google Business post links directly to this view; updating it and posting together take at most 20 minutes and create credible urgency without discounts.

  3. 3

    The cake travels as its own advertising medium

    gpt-5.6 · within brief · 16/20 points (8 + 8)

    Every picked-up cake gets a small card saying “Reorder or customize this cake” and a QR code for the matching variant. The card is displayed visibly when the cake is cut, so that precisely the birthday or wedding guests present discover the way to order; a card set created once causes almost no weekly effort.

  4. 4

    One-time cake consultation hour at launch

    gpt-5.6 · rule breaker · 16/20 points (8 + 8)

    On the first Saturday after launch there is an open cake consultation hour for four hours: guests choose flavor and style from sample cards and then place their order themselves via QR codes laid out for them. This deliberately breaks the soft constraint of at most two hours of effort in that week; the extra effort pays off because real orders, observed usability problems and reusable photos and customer questions are all produced at the same time — without additional staff or paid advertising.

  5. 5

    Occasion partners instead of influencers

    gpt-5.6 · within brief · 15/20 points (8 + 7)

    Children's play venues, photographers, florists, wedding venues and clubhouses each receive a small QR stand that leads to a cake selection preconfigured for their occasion. In return, the bakery names these partners on a local recommendations page; five targeted requests per month are enough, and commissions and paid reach are eliminated.

  6. 6

    Cake rota for offices and clubs

    gpt-5.6 · within brief · 15/20 points (8 + 7)

    Local offices, practices and clubs get a page where several birthdays or recurring dates can be collected and prepaid one after another. Quarterly rotas, once set up, turn individual occasions into plannable series orders; outreach can be limited to two organizations per week.

  7. 7

    Hybrid cake consultation at the counter tablet

    gemini-3.6-flash · rule breaker · 14/20 points (7 + 7)

    Deliberately breaks the soft constraint 'online ordering only' by offering 1 hour of in-store consultation on Fridays, during which orders are entered together on a tablet. It pays off because undecided and older customers are gradually introduced to the new online system.

  8. 8

    Reviews become a decision aid

    gpt-5.6 · neighbor · 13/20 points (7 + 6)

    As a small recombination of the strongest existing material, twelve meaningful sentences from the 120 Google reviews are paired with matching cake styles, each with a direct order link. This way the 4.7 stars are not just shown as a trust signal but help with product selection; after one-time setup the page is largely maintenance-free.

  9. 9

    Sample-cake displays with shop deep links

    gemini-3.6-flash · neighbor · 13/20 points (6 + 7)

    A physical photo gallery of the most beautiful cakes in the salesroom includes a specific QR code with each picture that opens exactly this cake model preselected in the online shop. Mutation of idea 1: linking the in-store display with a direct deep link in the shop.

  10. 10

    Google profile optimization & automated review links

    gemini-3.6-flash · within brief · 12/20 points (6 + 6)

    The strong Google profile (4.7 stars) is supplemented with the official 'Order online' button and updated weekly with a photo of current cakes. On pickup, customers receive a template by email with a link to the review and reorder page. Takes under 30 minutes per week.

  11. 11

    QR code teaser on receipts & bread bags

    gemini-3.6-flash · within brief · 11/20 points (6 + 5)

    An eye-catching QR code is printed on every receipt and on packaging, leading directly to the online cake configurator ('Plan your dream cake for your celebration online'). This converts daily walk-in customers into digital pre-orderers without extra effort at the counter.

  12. 12

    B2B partnership with local event venues

    gemini-3.6-flash · within brief · 11/20 points (6 + 5)

    Stands and flyers with a direct booking code for the website are placed at local restaurants, event barns and wedding planners. Celebrating customers book their cake directly online, while the venue receives a small expense allowance or a referral in return.

  13. 13

    Daycare & school birthday calendar

    gemini-3.6-flash · neighbor · 10/20 points (4 + 6)

    Cooperation with local kindergartens via info flyers for parent councils that contain a fixed discount code for children's themed cakes. Mutation of idea 3: instead of general B2B partners, the high-frequency occasion of children's birthdays is specifically addressed in an automated way.

  14. 14

    Monthly mini workshop for decorated cakes

    gemini-3.6-flash · rule breaker · 10/20 points (4 + 6)

    Deliberately breaks the soft constraint 'maximum 2 hours of time per week', since a 4-hour workshop takes place once a month. It pays off because participants act as brand ambassadors, create enthusiastic social media content and are guaranteed to place follow-up orders via the online shop.

  15. 15

    Order link on every cake box

    claude · within brief · 8/20 points (4 + 4)

    Print a QR code to the ordering page on the cake boxes and receipts, so every customer who already buys a cake can reorder for the next birthday without calling.

Kirat's note to Claude: Best rule_breaker idea only at rank 4: "One-time cake consultation hour at launch" — it deliberately breaks a soft constraint. Steelman it once before discarding it.

Brainstorm with Kirat how we cut billing incidents within two quarters without splitting billing out of the monolith.

kirat_brainstormasked the council

The council came up with 15 ideas and rated each one anonymously. The top three:

  1. Database firewall around billing tables (17/20 points)
  2. Executable financial invariants (17/20 points)
  3. Incident replay as a release gauntlet (17/20 points)

Behind the scenes

kirat_brainstormWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_BRAINSTORM · EFFORT: STANDARD · 15 IDEAS · 1 ROUND · $0.06

Topic: Ideas to cut production incidents caused by the billing module within two quarters, without extracting it into a separate service

Context sent: Team of 8 engineers. One TypeScript monolith, about 60,000 lines, one Postgres database, deployed several times a day. The billing module changes every week and caused 5 of the last 8 production incidents, mostly through other modules reading and writing billing tables directly. No one on the team has run a distributed system in production. Leadership wants fewer incidents within two quarters. HARD: no rewrite of the billing module. HARD: feature work on billing continues every week.

Result from the council

  1. 1

    Database firewall around billing tables

    gpt-5.6 · within brief · 17/20 points (9 + 8)

    Create separate Postgres roles for the monolith’s billing and non-billing code paths, then revoke direct writes to billing tables from the general application role. Route all mutations through a small set of reviewed stored procedures or transaction functions, adding temporary audit logging first to discover and migrate callers without stopping weekly feature work.

  2. 2

    Executable financial invariants

    gpt-5.6 · within brief · 17/20 points (9 + 8)

    Encode a short list of invariants—such as immutable finalized invoices, balanced ledger entries, idempotent charge creation, and valid state transitions—as database constraints where safe and scheduled production probes where not. Run the same probes against anonymized production-shaped fixtures in CI, turning incident knowledge into permanent tripwires rather than broad test expansion.

  3. 3

    Incident replay as a release gauntlet

    gpt-5.6 · within brief · 17/20 points (9 + 8)

    Convert the five billing incidents into deterministic replay scenarios using captured query shapes and sanitized rows, then require every billing change to survive them. Add generative tests that permute retries, duplicate events, transaction ordering, and partial failures around those exact scenarios, targeting the failure neighborhood instead of attempting exhaustive monolith coverage.

  4. 4

    Shadow-enforce the billing boundary

    gpt-5.6 · neighbor · 16/20 points (9 + 7)

    As a lower-risk mutation of the database firewall, keep current permissions initially but log every query touching billing tables with its module, call site, and transaction ID. After four weeks, turn unexpected writes into CI failures, then production errors module by module; this substitutes staged enforcement for an immediate permission cutover.

  5. 5

    Billing blast-radius switchboard

    gpt-5.6 · within brief · 16/20 points (9 + 7)

    Put risky billing behaviors—not the whole module—behind server-side kill switches and percentage rollouts, with dashboards keyed to invoice, payment, and reconciliation anomalies. Each weekly feature ships with a tested off-path so responders can disable the new behavior without reverting unrelated monolith deployments or undoing schema migrations.

  6. 6

    Postgres schema encapsulation and Row Level Security

    gemini-3.6-flash · within brief · 15/20 points (7 + 8)

    Isolate billing tables in a dedicated Postgres schema (billing.*) and revoke direct write and read access from other DB roles. Modules access them only via defined SQL views or stored interfaces. This eliminates the main cause of the incidents directly at the database level.

  7. 7

    Contract testing and shadow pipeline for billing releases

    gemini-3.6-flash · within brief · 15/20 points (8 + 7)

    Establish automated consumer-driven contract tests for all billing interfaces in the CI pipeline. In addition, billing changes to critical calculations run in shadow mode in production, without side effects and with automatic difference checking.

  8. 8

    A second database as a safety instrument

    gpt-5.6 · rule breaker · 14/20 points (7 + 7)

    Deliberately break the soft assumption of “one Postgres database” by adding a read-only shadow database fed through logical replication, while keeping billing inside the monolith and retaining the primary as the sole writer. Run new billing reads and reconciliation checks against both databases, compare results before exposure, and use the shadow for forensic queries so incident diagnosis cannot overload or accidentally mutate production.

  9. 9

    Strict module boundary linting and public API facade

    gemini-3.6-flash · within brief · 14/20 points (7 + 7)

    Introduce architecture linting via dependency-cruiser that forbids direct imports of billing internals in other modules at the build step. Communication may only take place via a single, type-safe BillingFacade interface, so that creeping coupling is blocked immediately.

  10. 10

    Billing change passports

    gpt-5.6 · within brief · 13/20 points (7 + 6)

    Require every billing-related pull request to carry a machine-checked passport: affected tables, invariants, migration compatibility, rollback path, and one production query proving post-deploy health. A CODEOWNERS gate plus a 15-minute rotating billing steward review keeps the process lightweight enough for weekly changes while concentrating scrutiny on cross-module effects.

  11. 11

    Auto-generated read-only Postgres views for external modules

    gemini-3.6-flash · neighbor · 13/20 points (7 + 6)

    A mutation of the schema encapsulation: instead of costly API refactorings, read-only Postgres views are automatically provided for external queries. External modules read only these stable views, while direct table access is blocked via DB permissions.

  12. 12

    Asynchronous in-process event bus for read models

    gemini-3.6-flash · within brief · 12/20 points (4 + 8)

    Instead of other modules querying billing tables directly, the billing module sends in-memory events on state changes. Receiving modules build their own local projections. This completely decouples read access from the billing tables without introducing distributed systems.

  13. 13

    Two-week feature freeze for billing encapsulation

    gemini-3.6-flash · rule breaker · 11/20 points (5 + 6)

    Breaks the soft constraint of continuous weekly feature output for exactly two weeks. The entire team concentrates on separating DB couplings. The one-time effort lays the foundation for sustainably reducing incident numbers over the remaining 5 months.

  14. 14

    Database role per module

    claude · within brief · 11/20 points (6 + 5)

    Give billing its own Postgres schema and role and revoke other modules' write access to billing tables, so direct writes fail in staging before they reach production.

  15. 15

    Physical DB partitioning into a second Postgres instance

    gemini-3.6-flash · rule breaker · 9/20 points (3 + 6)

    Breaks the soft constraint of the single-database architecture but keeps the monolithic code. Billing data moves into its own database instance, which makes cross-cutting SQL joins technically impossible. Operational complexity remains minimal because the code remains monolithic.

Kirat's note to Claude: Best rule_breaker idea only at rank 8: "A second database as a safety instrument" — it deliberately breaks a soft constraint. Steelman it once before discarding it.

Brainstorm with Kirat how we can cut screening time for about 3,000 records without weakening the review.

kirat_brainstormasked the council

The council came up with 14 ideas and rated each one anonymously. The top three:

  1. Two-human exclusion gate (18/20 points)
  2. Calibration sprint with an edge-case ledger (16/20 points)
  3. Fast binary console, not miniature data extraction (15/20 points)

Behind the scenes

kirat_brainstormWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_BRAINSTORM · EFFORT: STANDARD · 14 IDEAS · 1 ROUND · $0.18

Topic: Ideas to cut the staff time of title-and-abstract screening for about 3,000 records without weakening the rigor of a systematic review

Context sent: Systematic review in health services research, planned for publication. Current protocol: two independent human screeners, conflicts resolved by discussion. Staff time is short. Reviewers of the journal will ask how screening was done. Missing a relevant study (false exclusion) is worse than including an irrelevant one. HARD: the method must be reportable under PRISMA 2020. HARD: the rate of false exclusions must not increase.

Result from the council

  1. 1

    Two-human exclusion gate

    gpt-5.6 · rule breaker · 18/20 points (10 + 8)

    Have Reviewer A screen every record, but send A's includes and uncertain decisions directly forward; Reviewer B independently assesses only A's proposed exclusions. Exclude a record only when both humans independently exclude it, and automatically advance every disagreement, eliminating most conflict discussions. This deliberately breaks the soft current-protocol assumption that two humans must assess every record; it is worthwhile because it saves screening time while structurally allowing more false inclusions, but no additional false exclusions, and is straightforward to describe in the PRISMA selection-process section.

  2. 2

    Calibration sprint with an edge-case ledger

    gpt-5.6 · within brief · 16/20 points (9 + 7)

    Independently dual-screen a stratified first batch, resolve conflicts, and turn recurring ambiguities into short operational rules with positive and negative examples. Lock the rules before continuing; retain pilot decisions only if eligibility criteria did not change, otherwise rescreen them. This preserves dual independent screening while reducing later deliberation and conflict-resolution time, and the calibration can be reported under PRISMA.

  3. 3

    Fast binary console, not miniature data extraction

    gpt-5.6 · within brief · 15/20 points (8 + 7)

    Give both reviewers a blinded, keyboard-driven interface limited to include, exclude, or uncertain, with the complete title and abstract always visible; defer detailed coding and exclusion reasons to full-text review. PRISMA 2020 does not require record-level reasons at title-and-abstract stage. The decision process remains unchanged, but avoidable reading, clicking, and documentation time falls.

  4. 4

    Include-only machine release valve

    gpt-5.6 · neighbor · 15/20 points (9 + 6)

    As a one-step mutation of the two-human exclusion gate, run A's proposed exclusions through a validated classifier that may only release records to inclusion, never exclude them; Reviewer B independently screens everything the classifier does not release. Final exclusion still requires concordant decisions from two humans, so a machine error can add full texts but cannot create a false exclusion. Report the model, version, inputs, thresholds, validation, and its strictly include-only role under PRISMA.

  5. 5

    Asymmetric exclusion screening

    gemini-3.6-flash · within brief · 15/20 points (7 + 8)

    A first reviewer classifies all 3,000 records completely. The second reviewer checks only those records that the first reviewer excluded, in order to catch false negatives (inclusions are accepted directly). This nearly halves the second reviewer's effort, keeps the risk of false exclusions extremely low, and meets all PRISMA requirements.

  6. 6

    Bypass screening for high-yield strata

    gpt-5.6 · rule breaker · 13/20 points (8 + 5)

    Predeclare high-yield subsets—such as records from a highly specific search block, direct descendants of known eligible studies, or records already included in a closely aligned review—and send all of them directly to full-text retrieval without title-and-abstract decisions. This deliberately breaks the soft two-screener protocol for those records, but it cannot increase false exclusions because nothing in the subset is excluded; the trade-off is additional full-text work. Report the bypass rule and resulting counts explicitly in the PRISMA flow diagram and selection methods.

  7. 7

    Prioritized screening via active learning

    gemini-3.6-flash · within brief · 13/20 points (5 + 8)

    Both human screeners use an active learning tool (such as ASReview) that sorts relevant titles/abstracts to the top. As soon as a statistically validated stopping criterion is reached (e.g. 500 irrelevant hits in a row), screening is ended. The procedure saves up to 70% of the time, can be documented in a PRISMA 2020-compliant way, and maintains a minimal false exclusion rate through the algorithm calibration.

  8. 8

    Exact-only deduplication before screening

    gpt-5.6 · within brief · 12/20 points (8 + 4)

    Remove only records proven identical through DOI, database accession number, or exact normalized bibliographic matching; retain the metadata-richest copy and merely flag uncertain near-duplicates. Both reviewers then independently screen every remaining unique record, while PRISMA reports the duplicates removed before screening. This cuts volume without creating a pathway for excluding a unique study.

  9. 9

    Human-AI cascade with an AI safety net

    gemini-3.6-flash · neighbor · 12/20 points (5 + 7)

    A mutation of asymmetric exclusion screening: one human screener processes all records alone, while an AI model tuned for maximum sensitivity checks only the human exclusions. A second human checks only where there are discrepancies. This reduces human capacity by over 50% with complete coverage.

  10. 10

    Fully automated AI second reviewer

    gemini-3.6-flash · rule breaker · 11/20 points (3 + 8)

    Breaks the soft constraint that two human beings must necessarily do the screening. A large language model (LLM) takes on the role of the independent second reviewer with zero-false-negative prompting. It pays off because human working time is halved and LLMs have been shown to achieve high recall rates in abstract screening; PRISMA 2020 explicitly allows AI tools to be reported.

  11. 11

    Risk-adapted single screening with confidence triage

    gemini-3.6-flash · rule breaker · 11/20 points (5 + 6)

    Breaks the soft constraint of continuous double screening for the entire dataset. If the first reviewer states a high subjective confidence and clear exclusion reasons exist, the second reviewer is dropped; only uncertain cases move into double screening. This saves up to 60% of staff time, while the risk of missed studies remains minimal because resources are focused on gray areas.

  12. 12

    Calibration round first

    claude · within brief · 11/20 points (6 + 5)

    Both screeners screen the same 100 records, discuss every conflict and sharpen the eligibility criteria before the main round, so later conflicts and re-reads drop.

  13. 13

    Binarized rapid screening with AI triage

    gemini-3.6-flash · neighbor · 10/20 points (4 + 6)

    Mutation of the active learning prioritization: the team uses a simplified interface for quick rating (only clicks for 'Include/Unsure' vs. 'Exclude'). An AI model evaluates uncertainties in the background and sends only borderline candidates on to in-depth double checking. Drastically minimizes cognitive load and reading time per abstract.

  14. 14

    Deterministic pre-filtering via matching algorithms

    gemini-3.6-flash · within brief · 6/20 points (3 + 3)

    Conservative search filters and scripts sort out clearly unsuitable hits in advance (e.g. wrong study design or non-human population). Both screeners check these automated exclusions only via a representative sample (e.g. 10%). This reduces the total volume to be screened manually in a PRISMA-compliant way and without loss of sensitivity.

All ideas, complete and in ranked order. Claude's own idea takes part anonymously and on equal terms. Topic and context were sent in English; ideas the members wrote in German are translated here.

Five headlines and titles from different fields. Each member writes one variant, Claude's draft takes part, and both members rate all three anonymously. Pick one.

Let Kirat write headline variants for my pricing page. Max. 8 words, no superlatives.

kirat_createasked the council

The winning variant (17/20 points): "Get paid without Word—free for 14 days"

My own draft came in at #2; the members rated all three anonymously.

Behind the scenes

kirat_createWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_CREATE · MODE: VARIANTS · EFFORT: STANDARD · $0.03

Brief: Headline for the pricing page of a small invoicing tool for freelancers (USD 19 per month, 14-day free trial). Audience: freelancers who now write invoices in Word or Excel. Goal: make the trial feel risk-free and worth it. Format: one headline, in English.

Criteria: max. 8 words · concrete, no superlatives · mentions time saved or getting paid · no exclamation marks

Result from the council

  1. 1

    "Get paid without Word—free for 14 days"

    gpt-5.6 · 17/20 points (9 + 8)

    Speaks directly to Word users, puts getting paid front and center and makes the risk-free trial concrete.

  2. 2

    "Send invoices in minutes. Get paid on time."

    claude · 17/20 points (8 + 9)

    The orchestrator's own draft.

  3. 3

    "Replace Word and Excel. Get paid days faster."

    gemini-3.6-flash · 14/20 points (7 + 7)

    Addressing the current manual workflow directly offers an immediate contrast, framing the trial as a quick, risk-free upgrade to cash flow without using generic hype.

Let Kirat write headline variants for our landing page for furniture shops on WooCommerce. Max. 10 words, no jargon.

kirat_createasked the council

The winning variant (18/20 points): "Losing furniture buyers to a slow, frustrating WooCommerce store?"

My own draft came in at #3; the members rated all three anonymously.

Behind the scenes

kirat_createWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_CREATE · MODE: VARIANTS · EFFORT: STANDARD · $0.02

Brief: Headline for a small digital agency's landing page about shop rebuilds for furniture retailers that run WooCommerce. Audience: owners of mid-sized furniture shops without in-house developers. Goal: book a free shop check. Format: one headline, German market but write it in English.

Criteria: max. 10 words · names the reader's pain, not the agency · no jargon like "headless" or "omnichannel" · no superlatives

Result from the council

  1. 1

    "Losing furniture buyers to a slow, frustrating WooCommerce store?"

    gemini-3.6-flash · 18/20 points (8 + 10)

    Directly targets the owner's primary frustration—lost sales due to poor store performance—without using tech jargon or self-congratulatory agency language.

  2. 2

    "Is your WooCommerce shop turning furniture buyers away?"

    gpt-5.6 · 17/20 points (9 + 8)

    Names the core pain directly and speaks to furniture retailers without jargon.

  3. 3

    "Fewer shop emergencies, more time for your furniture."

    claude · 11/20 points (7 + 4)

    The orchestrator's own draft.

Let Kirat write headline variants for the bakery’s new cake ordering page. Short, local, not like a chain.

kirat_createasked the council

The winning variant (19/20 points): "Your celebration cake, baked here for pickup."

My own draft came in at #3; the members rated all three anonymously.

Behind the scenes

kirat_createWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_CREATE · MODE: VARIANTS · EFFORT: STANDARD · $0.02

Brief: Headline for the bakery's new online ordering page for custom cakes. Audience: local customers who until now ordered by phone. Goal: make ordering online feel easy and personal. Format: one headline, German market but write it in English.

Criteria: max. 8 words · concrete, no superlatives · mentions the pick-up or the occasion · sounds like a local bakery, not a chain

Result from the council

  1. 1

    "Your celebration cake, baked here for pickup."

    gpt-5.6 · 19/20 points (10 + 9)

    Warm, concrete and personal: “baked here” feels local, while “for pickup” makes the online process feel straightforward.

  2. 2

    "Order your custom birthday cake, pick up fresh."

    gemini-3.6-flash · 16/20 points (8 + 8)

    The headline specifically names the occasion as well as pickup and, through the freshness promise, conveys local craft quality without impersonal clichés.

  3. 3

    "Your cake, your date. Order in two minutes."

    claude · 9/20 points (5 + 4)

    The orchestrator's own draft.

Let Kirat find a title for my proposal to harden billing’s boundaries inside the monolith first.

kirat_createasked the council

My own draft won (19/20 points): "Fix billing's boundaries first, split it later if needed"

Behind the scenes

kirat_createWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_CREATE · MODE: VARIANTS · EFFORT: STANDARD · $0.02

Brief: Title for an internal engineering proposal: harden the billing module's boundaries inside the monolith before considering a separate service. Audience: 8 engineers and leadership who want fewer incidents. Goal: get the proposal read and approved. Format: one title, in English.

Criteria: max. 10 words · states the decision, not just the topic · no buzzwords · understandable for non-engineers

Result from the council

  1. 1

    "Fix billing's boundaries first, split it later if needed"

    claude · 19/20 points (10 + 9)

    The orchestrator's own draft.

  2. 2

    "Keep Billing Together, but Isolate It to Prevent Incidents"

    gpt-5.6 · 16/20 points (9 + 7)

    The title states the decision to retain billing in the monolith while strengthening its boundaries, and ties that choice to the shared goal of fewer incidents.

  3. 3

    "Strengthen Billing Boundaries in Current App Before Splitting Service"

    gemini-3.6-flash · 13/20 points (7 + 6)

    The title makes a clear decision on direction, avoids unnecessary jargon such as 'monolith' for management, and directly addresses the shared goal of stability.

Let Kirat find a title for our methods paper on an LLM as an additional screener. Accurate, no hype.

kirat_createasked the council

The winning variant (18/20 points): "Large Language Model–Assisted Study Selection in Health Services Research: A Method for Additional Screening in Systematic Reviews"

My own draft came in at #2; the members rated all three anonymously.

Behind the scenes

kirat_createWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_CREATE · MODE: VARIANTS · EFFORT: STANDARD · $0.02

Brief: Title for a methods paper about using an LLM as an additional screener in a systematic review in health services research. Audience: researchers and journal reviewers. Goal: accurate and citable, not hype. Format: one title, may include a subtitle after a colon, in English.

Criteria: max. 20 words · names the method and the setting · no claims beyond the data · no hype words like "revolutionize"

Result from the council

  1. 1

    "Large Language Model–Assisted Study Selection in Health Services Research: A Method for Additional Screening in Systematic Reviews"

    gpt-5.6 · 18/20 points (9 + 9)

    The title identifies the screening method, systematic review context, and health services research setting without implying performance or benefit.

  2. 2

    "An LLM as additional screener: a prospective comparison in a health services systematic review"

    claude · 16/20 points (9 + 7)

    The orchestrator's own draft.

  3. 3

    "Large Language Models as Auxiliary Screeners in Health Services Research Systematic Reviews: A Methodological Evaluation"

    gemini-3.6-flash · 15/20 points (7 + 8)

    The title names the field of application and the methodology precisely, avoids trigger words and chooses a factual, citable tone for a scientific publication context.

Headlines and titles are shown as written, in English, as the briefs asked. The reasoning in Claude's entry is Kirat's own label for it. Reasoning written in German is translated here.

Five image briefs from different fields. OpenAI and Google each generate one image, and both members rate both images anonymously. Pick one.

Let Kirat create a hero image for my invoicing tool’s landing page: a calm home-office desk, no readable screen.

kirat_imageasked the council

The jury picked the image by gpt-image-2 (18/20 points). Both members rated both images anonymously.

Behind the scenes

kirat_imageWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_IMAGE · MODE: VARIANTS · LANDSCAPE · ≈ $0.17

Brief: Hero image for the landing page of a small invoicing tool for freelancers: a tidy home-office desk in the morning with a laptop (screen turned away or blurred, no readable interface), a cup of coffee and a paper notebook. Natural daylight, calm documentary photo style, no text, no logos, no people's faces.

Criteria: feels like a real freelancer's workspace, not a stock-photo office · calm and uncluttered · leaves calm space for a headline · no text, logos or readable screens

Result from the council

Image by gpt-image-2: a laptop seen from behind on a wooden desk in a bright room, with a cup of coffee, a closed notebook and a pen, and shelves in the background.
1gpt-image-2 · 18/20 points (9 + 9)

gpt-5.6 · 9/10 Very calm, credible home office workspace with natural morning light, a screen turned away and plenty of free wall space for a headline. Looks somewhat staged, but fulfills the brief almost completely.

gemini-3.6-flash · 9/10 Very bright, natural morning-light atmosphere. The laptop turned away solves the screen problem perfectly without an artificial blur effect. The bright wall area offers ideal space for text.

Image by gemini-3.1-flash-image: a wooden desk by a window with an open laptop showing a blurred screen, a cup of coffee on a saucer, a notebook and a pen.
2gemini-3.1-flash-image · 13/20 points (6 + 7)

gpt-5.6 · 6/10 Cozy and authentic with a blurred screen, but clearly visible text on the notebook and handwritten notes appear in the image. In addition, the composition is fuller and offers less calm headline space.

gemini-3.6-flash · 7/10 Very cozy and realistic setup. However, the artificially softened screen looks somewhat conspicuous, and the overall composition offers somewhat less calm space for a headline.

Let Kirat create a product photo for the furniture shop: an oak dining table with four chairs in a real living room.

kirat_imageasked the council

The jury picked the image by gemini-3.1-flash-image (18/20 points). Both members rated both images anonymously.

Behind the scenes

kirat_imageWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_IMAGE · MODE: VARIANTS · LANDSCAPE · ≈ $0.17

Brief: Product photo for a furniture online shop: a solid oak dining table with four chairs in a bright, real-looking Central European living room. Natural daylight, editorial interior style, no text, no logos, no people.

Criteria: the table is the clear subject · true-to-life wood texture and colour · looks like a real home, not a 3D render · no text or logos

Result from the council

Image by gemini-3.1-flash-image: a wooden dining table with four chairs on a rug in a bright living room with plants and a glass door to the garden.
1gemini-3.1-flash-image · 18/20 points (9 + 9)

gpt-5.6 · 9/10 Very credible, bright Central European living ambience with natural daylight, four chairs and realistic oak texture; the somewhat extensive decoration distracts minimally from the table.

gemini-3.6-flash · 9/10 Very successful, homely atmosphere with authentic daylight and realistic wood grain. Fulfills all requirements excellently.

Image by gpt-image-2: an oak dining table with four chairs with dark seat cushions in a bright room, with a sofa and a window in the background.
2gpt-image-2 · 17/20 points (8 + 9)

gpt-5.6 · 8/10 The solid oak table is clearly staged, four chairs are present, and the wood color and grain look convincing; overall, however, somewhat too flawless and slightly render-like.

gemini-3.6-flash · 9/10 The dining table is clearly in focus; the oak wood and the textures look extremely natural and photorealistic. Perfect editorial style for the online shop.

Let Kirat create a hero image for the cake ordering page: a birthday cake in a box, ready for pick-up.

kirat_imageasked the council

The jury picked the image by gpt-image-2 (17/20 points). Both members rated both images anonymously.

Behind the scenes

kirat_imageWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_IMAGE · MODE: VARIANTS · LANDSCAPE · $0.17

Brief: Hero image for a small local bakery's new online ordering page for custom cakes: a finished birthday cake on a wooden counter in a bright, real-looking family bakery, ready for pick-up in a simple cardboard cake box. Natural daylight, documentary photo style, no text, no logos, no people's faces.

Criteria: looks like a real local bakery, not a chain or stock photo · the cake is the clear subject · leaves calm space for a headline · no text or logos in the image

Result from the council

Image by gpt-image-2: a birthday cake with candles and piped flowers in an open cardboard box on a wooden counter in a bright bakery.
1gpt-image-2 · 17/20 points (8 + 9)

gpt-5.6 · 8/10 Cake as the clear main subject, simple cardboard box, natural daylight and a plausible local bakery setting. No visible text or logo; the calm lid area is suitable for a headline, even though the image looks somewhat heavily staged.

gemini-3.6-flash · 9/10 Fulfills the brief optimally: completely free of text and logos, the cake is clearly in focus, bright natural light and a very authentic atmosphere. The opened cardboard lid offers an ideal calm area for headlines.

Image by gemini-3.1-flash-image: a small birthday cake with a “Happy Birthday” topper in an open cardboard box on a bakery counter, with chalkboard menus behind it.
2gemini-3.1-flash-image · 7/20 points (4 + 3)

gpt-5.6 · 4/10 Cake and pickup box are clearly staged, and the artisan bakery looks credible. However, it clearly violates “no text”: lettering on the cake topper, menu boards and a receipt; in addition, there is no calm headline area.

gemini-3.6-flash · 3/10 Violates the strict requirement 'no text in the image' through the 'HAPPY BIRTHDAY' topper and the labeled boards in the background. The background is also somewhat too busy.

Let Kirat create a cover image for our blog post about untangling billing from the monolith. Abstract and calm.

kirat_imageasked the council

The jury picked the image by gpt-image-2 (16/20 points). Both members rated both images anonymously.

Behind the scenes

kirat_imageWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_IMAGE · MODE: VARIANTS · LANDSCAPE · ≈ $0.17

Brief: Cover image for an internal engineering blog post about untangling a billing module from a monolith: an abstract, calm illustration of one clearly bounded block set apart from a dense cluster of interconnected blocks. Flat style, muted colours, no text, no logos.

Criteria: the idea of a clear boundary is readable at a glance · calm, not dramatic · works at small size · no text or logos

Result from the council

Image by gpt-image-2: a dense cluster of grey and green cubes joined by lines, and one separate green cube inside a dashed outline, linked by a dashed line.
1gpt-image-2 · 16/20 points (9 + 7)

gpt-5.6 · 9/10 The isolated unit with a dashed boundary is immediately recognizable and clearly contrasts with the dense, interconnected cluster of blocks. Calm, muted coloring; easy to read even at small size. Slight spatial shading instead of a consistently flat style.

gemini-3.6-flash · 7/10 Good depiction of the isolated block with a dashed boundary, calm style and clear legibility even at a small size.

Image by gemini-3.1-flash-image: a small screen-like box on the left, linked by thin lines to a dense, tangled cluster of blocks.
2gemini-3.1-flash-image · 10/20 points (6 + 4)

gpt-5.6 · 6/10 The set-apart element and the complex tangle basically convey the decoupling, but the boundary looks more like a screen frame than a clearly defined module boundary. The cluster is very fine-grained and loses legibility when displayed small; overall, though, still calm and without logos or readable text.

gemini-3.6-flash · 4/10 The focus is on a tablet screen instead of a separated building block; the jumble looks less structured.

Let Kirat create a cover image for my conference talk on AI-assisted screening. Serious, no robots.

kirat_imageasked the council

The jury picked the image by gpt-image-2 (18/20 points). Both members rated both images anonymously.

Behind the scenes

kirat_imageWhat Claude sends to Kirat

RECORDED 2026-10-13 · KIRAT_IMAGE · MODE: VARIANTS · LANDSCAPE · ≈ $0.17

Brief: Cover image for a conference talk on AI-assisted screening in systematic reviews: a neat stack of printed research abstracts on a desk, some sorted into two trays, soft daylight, documentary photo style. No readable text, no logos, no people's faces.

Criteria: serious and scientific, not hype · no robots or glowing brains · the sorting idea is visible · no readable text or logos

Result from the council

Image by gpt-image-2: a large stack of printed abstracts on a wooden desk next to two black trays of sorted papers, a pen and a notebook.
1gpt-image-2 · 18/20 points (9 + 9)

gpt-5.6 · 9/10 Serious, documentary desk scene with soft daylight; two trays and colored tabs clearly convey the sorting. No logos or clearly readable text, no people.

gemini-3.6-flash · 9/10 Very well executed. High photographic quality in a documentary style; the sorting concept with stacks and trays is clearly understandable, without readable text or faces.

Image by gemini-3.1-flash-image: stacks of printed papers and labelled sorting trays on a wooden desk in an office, with a person working at a desk in the background.
2gemini-3.1-flash-image · 9/20 points (5 + 4)

gpt-5.6 · 5/10 The scientific work context and the sorting are clearly recognizable. However, the readable tray labels violate the requirement “no readable text”; in addition, a person with a recognizable, if blurred, face can be seen in the background.

gemini-3.6-flash · 4/10 The motif fits in principle, but a person/face is visible in the background and the trays contain garbled, partly readable text (INCLVDED/EACLVDED).

AI-generated images, scaled down and otherwise unedited. Costs marked ≈ come from runs that ran in parallel: each run's own image cost plus an even share of the rating calls. The ranking is a pre-selection, and the final choice stays with you. Ratings written in German are translated here.

02 — The problem

One model, one blind spot.

Self-review flatters

A model checking its own work finds itself convincing. A second pass by the same model is not an independent check.

More rounds aren't the fix

Kirat caps debate at two rounds, in code, not in a prompt. A model can't talk its way past the limit. If there is still no majority, you are told so.

Different families fail differently

Kirat puts Claude, ChatGPT and Gemini on the same question and shows you the split — including who disagreed, and why.

03 — How it works

Ask once. Get three positions and a vote.

Step 1

You ask in Claude

In plain language, as always: Ask the Kirat council: Shopify or WooCommerce for my shop? Give your own position too. Claude calls Kirat for you.

Step 2

Three independent positions

ChatGPT and Gemini each answer without seeing the other's answer. Claude takes its own position as the third member.

Step 3

A vote, with the dissent kept

If two of the three agree, that is the majority view. You see every position with its reasons, and who disagreed. Without a majority, Kirat says so, and the call is yours.

Kirat also reviews code (each finding is checked by the other model family), ranks ideas, critiques your copy and compares images. The replay above shows all of it.

No coding required. You install a Claude extension and create one API key at OpenAI and one at Google; the install steps are in the details below.

The nine tools and a recorded example call →

04 — Pricing

One purchase for Claude Desktop and Claude Code.

No subscription, no seats, no account with us. Check where Kirat runs before you buy:

Where Kirat runs

Works in

  • Claude Desktop chats on macOS and Windows
  • Claude Code in a terminal, in VS Code or in Claude Desktop's Code tab
  • Claude Code cloud sessions, after a one-time setup per cloud environment With limits: keys stored as network secrets stay unreadable (on Team and Enterprise plans, an admin may have to add them), keys in environment variables are readable by everyone who uses the environment, and the daily budget counts per session.

Does not work in

  • Chat in the browser (claude.ai) or in the Claude mobile apps
  • Cowork tasks that run in the cloud
  • Some company setups: proxies that sign in with your Windows account (NTLM/Kerberos), and organizations that restrict Desktop extensions to an allowlist Ask your IT team first.

Where it runs, in full · All cloud limits

Build your own instead
Blueprint
$49
Documents only — for building or adapting your own council server with a coding agent. Not needed to use Kirat.
  • 01The specification: structured requirements for the tools
  • 02The architecture decisions, with the reasoning behind each
  • 03The acceptance checklist an agent can verify itself against
  • 04The benchmark data behind the numbers on this site

No code, no installable extension.

Get the Blueprint

One-time purchase · Payment via Lemon Squeezy (merchant of record), VAT handled at checkout · Refunds: see Terms

API usage is paid to OpenAI and Google directly, under your accounts — $0.02–$0.15 per council decision in our measurements.

Kirat is not for you if…

  • —you use Claude only as a chat in the browser or on your phone. Kirat runs in Claude Desktop (macOS/Windows) and Claude Code, and in Claude Code cloud sessions with a one-time setup — not in those chats.
  • —you need a hosted service or any kind of support.
  • —you don't want API accounts and billing at two providers.
  • —you make a handful of decisions a month and are happy to compare answers in separate chats by hand.
  • —you want an answer that sounds certain. A council's job is to show you the split, and sometimes the split is the answer.
  • —your data may not go to OpenAI or Google. Everything you give Kirat goes to both, under your accounts and their terms.
05 — Questions

Before you buy.

How is this different from llm-council or PAL MCP?

Look at both first. llm-council is an open-source web app; its author describes it as unsupported by design. PAL MCP is a free, open-source MCP server you install via the terminal; it supports many providers and has its own consensus tool. Check their current state. If one of them covers what you need, use it.

Kirat's difference is the package: it installs through Claude Desktop's own extension dialog with your keys in the operating system's secure storage, and it brings a budget guard with a daily ceiling, a two-round cap, a domain tie-break, background tickets, failure handling, 345 tests, English result fields, and plain-language use.

Full answer →

Do I need to be a developer?

No. If you can install a Claude extension and create two API keys, you can use Kirat. You ask Claude in plain language — Ask the Kirat council: Postgres or SQLite? Give your own position too. — and Claude calls the tools.

What do I need?

Claude Desktop on macOS or Windows. It ships its own Node, so you install nothing else. Or Claude Code with Node.js 20 or later. For Claude Code cloud sessions, a one-time setup of your cloud environment (see below).

Plus one OpenAI API key and one Google Gemini API key, both with billing enabled. Kirat also runs with one key: the council then has one external member, and every result names the missing key.

What does it cost to run, and what stops a runaway bill?

You pay OpenAI and Google directly for what you use. In our measurements one council decision costs $0.02–$0.15, depending on effort tier and input size, and takes 8 seconds to 3 minutes. Image generation is about $0.05–$0.20 per call.

The budget guard reserves the worst-case cost before every call and blocks calls that could exceed your daily budget — $5 per UTC day by default, adjustable. It is best-effort, so also set spending limits at the providers. kirat_status shows budget and spend, and costs nothing.

Full answer →

Where do my data and keys go?

Your data: everything you give Kirat (questions, context, code, images) goes directly to OpenAI and Google, under your accounts and their terms — from your computer, or in Claude Code cloud sessions from your own cloud environment through Anthropic's network proxy for that environment. There is no Kirat server, no account with us and no telemetry. We never see your keys or your data.

Your keys: you enter them in Claude's own install or settings dialog. Claude Desktop stores them in your operating system's secure storage (macOS Keychain, Windows Credential Manager). Claude Code stores them in the macOS Keychain; on Windows and Linux in ~/.claude/.credentials.json, readable only by your user. We recommend a separate provider project with a spending limit.

In Claude Code cloud sessions: Kirat runs in your cloud environment. You store the keys there as network secrets: Anthropic's proxy adds them to Kirat's requests on the way out, so nobody in a session can read them, not even Claude. On Team and Enterprise plans, depending on your role, an organization admin may have to add them. As a fallback, the keys can be environment variables of that environment, readable by everyone who uses it.

On your computer: Kirat keeps a folder .kirat in your home folder with the daily cost counter, the cost log, the last 20 results (they contain your questions and answers), the log of delegated decisions and generated images. You can delete it any time. All Kirat sessions on the computer share it, Desktop and Code.

Full answer →

How does Kirat work in Claude Code cloud sessions, and what are the limits?

Cloud sessions — Code tab cloud sessions, Claude Code on the web or in the mobile app — run on Anthropic's servers in a cloud environment. The extension on your computer can't reach them. Instead, you set up the cloud environment once:

  • paste the block from the download (cloud/setup-script.txt) at the top of the environment's setup script;
  • add your two keys — as network secrets for api.openai.com and generativelanguage.googleapis.com (on Team and Enterprise plans, an admin may have to add them; the guide in the download has the details); otherwise as environment variables, ideally named KIRAT_OPENAI_API_KEY and KIRAT_GEMINI_API_KEY, which don't collide with a project's own OPENAI_API_KEY (Kirat also accepts OPENAI_API_KEY and GEMINI_API_KEY);
  • network access: if it is Full, there is nothing to change; otherwise set it to Custom (in newer apps: Limited) with the package-manager default list, plus the Kirat download host (with keys in environment variables, also api.openai.com).

The script downloads exactly your version of Kirat, verifies its SHA-256 checksum and installs it. It is a one-time setup, not one click. We tested it in a cloud container.

The limits: keys in environment variables are readable by everyone who uses the environment (network secrets keep them unreadable). Every cloud session starts fresh, so Kirat's daily budget counts per session — set spending limits at OpenAI and Google; in the cloud they are your real ceiling. Background jobs and recent results end with the session. The environment's network access must allow the Kirat download host, and api.openai.com too if your keys are environment variables (Gemini is covered by the default list). If the setup fails, the session still starts, just without Kirat — and the failed state can stay cached for new sessions until you edit the setup script (any change makes new sessions run it again).

The download address in the setup script is part of your purchase, like the ZIP; don't publish it. The license covers your own cloud environments. A cloud environment shared with others needs a license for each person.

Full answer →

Which models does it use? What if a provider retires one?

By default gpt-5.6 from OpenAI and gemini-3.6-flash from Google, with Claude as the third voter.

Model names and prices are settings. If a provider retires a model, you enter the new name and its two prices. No update needed.

Claude Desktop says the extension is not verified by Anthropic. Is that a problem?

That warning is expected. Claude Desktop shows it for extensions installed from a file, and Kirat is installed from a file — it is not verified or signed by Anthropic.

How do updates work?

In Claude Desktop, install the new .mcpb the same way as the first one. Your keys and settings are kept.

Compatibility updates are free when possible, but there is no guarantee. Larger new versions may be sold separately.

Do I get support?

No. Kirat comes without support, installation help or consulting. Payment and receipts are handled by Lemon Squeezy. If Kirat does not run in a supported setup, you get your money back; see the Terms.

What does the license allow?

One person, on any number of your own devices and in your own cloud environments. A cloud environment shared with others needs a license for each person. No resale and no redistribution. Kirat is proprietary software, not open source.

Using what the council produces in your own work, including commercial work, is fine. The full terms are in the Terms.

What is the Blueprint for? Do I need it?

You don't need it to use Kirat. The Blueprint is for people who want to build or adapt their own council server with a coding agent.

It is documents only — no code, no installable extension: the specification (structured requirements for the tools), the architecture decisions with the reasoning behind each, the acceptance checklist an agent can verify itself against, and the benchmark data behind the numbers on this site. There is no bundle price.

06 — Details

The details, for the record.

Installation, everywhere Kirat runs and the cloud limits, the nine tools, and the evidence behind the numbers. Open what you need.

Install Kirat and connect your API keys

Kirat is not a service you sign up for. It runs on your computer (or in your own Claude Code cloud environment), inside Claude, with your own API keys. There is no Kirat server and no account with us. Everything you give Kirat goes directly to OpenAI and Google, under your accounts — from your computer, or in Claude Code cloud sessions from your own cloud environment through Anthropic's network proxy for that environment. We never see your keys or your questions.

Just bought Kirat? Follow the step-by-step setup guide: first which Claude you use, then only the steps for it.

Step 1 · the slow part

Two API keys

One OpenAI API key and one Google Gemini API key, both with billing enabled. What takes time here is the providers' signup and billing forms. A separate provider project with a spending limit is a good idea.

Minimal permissions (optional): at OpenAI, a restricted key is enough, with “List models” on Read and “Model capabilities” on Request, everything else on None. A Gemini key from Google AI Studio is already restricted to the Gemini API; restrict a key from the Google Cloud console to the Generative Language API.

Already have both keys? Go to step 2.

Step 2

Install

Claude Desktop: unzip the download. Open Settings → Extensions → Advanced settings → Install Extension… and pick the .mcpb file. Enter both keys in the dialog. Desktop ships its own Node, so there is nothing else to install.

Claude Code: unzip the download and move the extracted kirat folder into your home folder, so that ~/kirat/claude-code exists. Then run the commands below. Needs Node.js 20 or later.

Claude Code cloud sessions: a one-time setup of your cloud environment, with limits — see below.

Step 3

Ask

Check the install: Use the Kirat extension and call kirat_status. It also checks both API keys with OpenAI and Google, free of charge.

Then ask a real question: Ask the Kirat council: Postgres or SQLite? Give your own position too.

Or start from a template: in Claude Desktop from the + button in the message box, in Claude Code with the plugin as /kirat:decide, /kirat:review, /kirat:critique or /kirat:brainstorm. In Claude Code cloud sessions, they are called /mcp__kirat__decide, /mcp__kirat__review, /mcp__kirat__critique and /mcp__kirat__brainstorm.

# in Claude Code, once ~/kirat/claude-code exists
/plugin marketplace add ~/kirat/claude-code
/plugin install kirat@kirat
# enter both keys when asked; to change them later:
/plugin configure kirat@kirat

Claude Desktop will warn that the extension is not verified by Anthropic. That warning is expected for every extension installed from a file — see the FAQ.

Where it runs, in full, with the cloud limits
Fig. 6.2 — Where it runs

Check this before you buy.

Kirat is a program, not a service. It works only where Claude runs tools on a machine that has Kirat installed: your computer, a remote machine over SSH, or a Claude Code cloud environment you set up once.

Works in

  • Claude Desktop chats on macOS and Windows Uses the .mcpb extension.
  • Claude Code in a terminal or VS Code Uses the Claude Code plugin. Needs Node.js 20 or later; installing it needs the claude command-line tool once.
  • Local sessions in Claude Desktop's Code tab Also the Claude Code plugin. The .mcpb extension is made for chats, not for Code tab sessions.
  • SSH sessions The plugin, installed on the remote machine.
  • Claude Code cloud sessions — limited, with a one-time cloud environment setup Code tab cloud sessions, Claude Code on the web or in the mobile app. Once per cloud environment:
    1. Paste the block from the download (cloud/setup-script.txt) at the top of the environment's setup script.
    2. Add your two keys, preferably as network secrets: one for api.openai.com (header Authorization, prefix Bearer), one for generativelanguage.googleapis.com (header x-goog-api-key, no prefix). Nobody in a session can read them, not even Claude. On Team and Enterprise plans, depending on your role, an organization admin may have to add them; the guide in the download explains each case. Otherwise, as environment variables; we recommend the names KIRAT_OPENAI_API_KEY and KIRAT_GEMINI_API_KEY: they don't collide with a project's own OPENAI_API_KEY. Kirat also accepts OPENAI_API_KEY and GEMINI_API_KEY.
    3. Network access: if it is Full, there is nothing to change. Otherwise set it to Custom (in newer apps: Limited) with the package-manager default list, plus the Kirat download host (with keys in environment variables, also api.openai.com).
    Read the cloud limits below first.

Does not work in

  • Chat in the browser (claude.ai)
  • Chat in the Claude mobile apps Claude Code in the mobile app runs as a cloud session; that works with the cloud setup.
  • Cowork tasks that run in the cloud
  • Company proxies that sign in with your Windows account (NTLM/Kerberos) Other company proxies work: enter yours in Kirat's settings.
  • Organizations that restrict Desktop extensions to an allowlist Manual installs are blocked; ask your admin.

Cloud limits — check before you buy

  • Keys in environment variables are readable by everyone who uses the environment, Claude included. Store them as network secrets instead (on Team and Enterprise plans, an admin may have to add them): unreadable, but usable by every session in the environment. Either way, don't share the environment with people who should not use your keys.
  • The daily budget counts per session. Every cloud session starts fresh, so Kirat's daily budget counts per session, not across all your sessions that day. Set spending limits at OpenAI and Google: in the cloud, they are your real ceiling.
  • Background jobs and recent results end with the session. They are lost when the session's machine ends.
  • Allow the download host. The environment's network access must allow the Kirat download host, and api.openai.com too if your keys are environment variables (Gemini is covered by the default list).
  • A failed setup can stay cached. If the setup fails, the session still starts, just without Kirat — and the failed state can stay cached for new sessions until you edit the setup script (any change makes new sessions run it again). The session that runs the setup usually shows Kirat only from the next new session on.

Why the extension never reaches a cloud session: cloud sessions run on Anthropic's servers, in a cloud environment, and cannot reach a program on your computer — even if Claude Desktop lists Kirat as switched on under "+ → Connectors" in such a session. A cloud session has Kirat only if its cloud environment has the Kirat setup.

Which kind of Code tab session is it? The environment picker in the prompt box shows it: Local, SSH, WSL or the name of a cloud environment. Local and SSH sessions use the plugin; a cloud environment needs the cloud setup.

Not tested: WSL sessions and local Cowork tasks.

This box exists because the council asked for it. When it voted on 8 October 2026 to ship Kirat as a desktop extension, one of its conditions was that these limits be clearly visible before purchase. See the decision. When it later voted to support Claude Code cloud sessions, it set the same condition for the cloud limits.

The nine tools and a recorded example call

You ask in plain language. Claude makes the call:

// a real call and a real answer — nothing staged
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

Other outcomes: needs_human (no majority — you decide), domain_decision, limited, budget_exhausted. Confidence values are each model's own self-report.

Fig. 6.3 — Parts list

Nine tools Claude calls

7 with API costs · 2 without
Pos.ToolWhat it doesAPI costs
01kirat_voteDecision by vote: each member takes a position, then a two-thirds majority, the domain owner, or needs_human.API costs
02kirat_reviewCode review. Every finding is verified by the other model family.API costs
03kirat_createCritique your draft, let a member draft, or rank short variants.API costs
04kirat_brainstormDivergent ideas in three tracks — within brief, neighbor, rule breaker — ranked anonymously.API costs
05kirat_decideDelegated decision for reversible work choices, with veto and a daily limit.API costs
06kirat_askAsk exactly one member. No council.API costs
07kirat_imageImage generation by both providers, rated by an anonymous jury.API costs
08kirat_resultFetch background jobs and recent results.none
09kirat_statusBudget, spend, available members, settings, free key check.none
“API costs” means the tool calls OpenAI and Google with your own keys, and you pay those providers directly. The replay above shows what each run cost. Kirat itself charges nothing per use: you buy it once. kirat_image and image input work with files on your computer, so they suit Claude Code best.
Evidence: recorded decisions, measured costs, documented failures

Anyone can claim a council works. These are real council sessions about Kirat itself, measurements from production runs, and the failures that changed the design.

Historic decision, August 2026. This vote was about the earlier plan: selling Kirat as a build manual. That plan later changed, and the dissent below shaped what came next.

"Should we sell the Kirat build manual — and if so, how?"
2026-08-24 · ROUND 1 OF 2 · OUTCOME: MAJORITY, NOT UNANIMOUS · $0.033
gemini-3.6-flashconfidence 85
For: hybrid — free core, paid operations tierWithout an existing audience a paywalled launch fails on distribution. The defensible substance isn't the core code, it's the operational experience.
claude (third voter)confidence 65
For: hybrid — free core, paid operations tierThe one proven success factor we lack is an audience; the one defensible asset is the operations layer. The free core builds the first, the paid tier sells the second.
gpt-5.6confidence 88
Against: don't sell it at allTwo to four weeks plus ongoing maintenance is a poor use of time without a developer audience; free alternatives already cover the visible core. Even the base case assumes an uncertain launch and continuous marketing.Dissent, recorded

One member voted against selling the product at all. Its reasoning stayed on the record, and the dissent shaped what came next: Kirat is now a ready-to-install extension, not a build manual. That is the point of a council — you get the objection, not just the verdict.

Kirat — $99 for the first 50 buyers (then $149) Get Kirat