Uma segunda e uma terceira opinião, dentro do Claude.
O Kirat permite que o Claude reúna um conselho com o ChatGPT e o Gemini. Três famílias de modelos assumem posições de forma independente e depois votam. A maioria decide, e a divergência fica registrada. Se não houver maioria, o Kirat diz isso em vez de forçar um consenso.
Claude Desktop (macOS/Windows) e Claude Code; sessões na nuvem do Claude Code com uma configuração única — não no chat do navegador nem no do celular (onde funciona)
Suas próprias chaves da OpenAI e do Gemini — sem servidor, sem conta conosco
Compra única — sem assinatura, 256 testes automatizados
Um modelo, um ponto cego.
Autoavaliação é complacente
Um modelo que revisa o próprio trabalho acha a si mesmo convincente. Uma segunda passada do mesmo modelo não é uma verificação independente.
Mais rodadas não resolvem
O Kirat limita o debate a duas rodadas, no código, não em um prompt. Um modelo não consegue argumentar para passar do limite. Se ainda não houver maioria, você fica sabendo.
Famílias diferentes erram de formas diferentes
O Kirat coloca o Claude, o ChatGPT e o Gemini diante da mesma pergunta e mostra a divisão — inclusive quem discordou e por quê.
Três posições. Uma votação. Toda objeção registrada.
Posições independentes
O ChatGPT e o Gemini assumem cada um uma posição sem ver as dos outros. O Claude apresenta a sua própria posição como terceiro votante. Sem ancoragem, sem teatro de consenso.
Uma votação registrada
Uma maioria de dois terços decide. Se membros saírem e os demais se dividirem, um responsável de domínio designado desempata. Sem maioria, o resultado diz needs_human. A divergência volta junto com o resultado.
Feito para resistir às APIs
Controle de orçamento, limite de duas rodadas, disjuntor (circuit breaker), timeouts por provedor derivados da vazão medida, tickets em segundo plano para execuções longas. Tudo no código, não em prompts.
Você pergunta em linguagem natural. O Claude faz a chamada:
// uma chamada real e uma resposta real — nada encenado 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
Outros resultados: needs_human (sem maioria — você decide), domain_decision, limited, budget_exhausted. Os valores de confiança são a autoavaliação de cada modelo.
Nove ferramentas que o Claude chama
7 pagas · 2 grátis| Pos. | Ferramenta | O que faz | Custo |
|---|---|---|---|
| 01 | kirat_vote | Decisão por votação: cada membro assume uma posição; decide uma maioria de dois terços, o responsável de domínio ou needs_human. | pago |
| 02 | kirat_review | Revisão de código. Cada achado é verificado pela outra família de modelos. | pago |
| 03 | kirat_create | Critica o seu rascunho, deixa um membro redigir ou classifica variantes curtas. | pago |
| 04 | kirat_brainstorm | Ideias divergentes em três linhas — dentro do briefing, vizinha, quebra de regras — classificadas anonimamente. | pago |
| 05 | kirat_decide | Decisão delegada para escolhas de trabalho reversíveis, com veto e limite diário. | pago |
| 06 | kirat_ask | Pergunta a exatamente um membro. Sem conselho. | pago |
| 07 | kirat_image | Geração de imagens pelos dois provedores, avaliadas por um júri anônimo. | pago |
| 08 | kirat_result | Busca tarefas em segundo plano e resultados recentes. | grátis |
| 09 | kirat_status | Orçamento, gastos, membros disponíveis, configurações. | grátis |
kirat_image e a entrada de imagens funcionam com arquivos no seu computador, por isso são mais indicados para o Claude Code.Veja o conselho trabalhar.
Gravações reais das ferramentas do Kirat, feitas em 13 de outubro de 2026 com a versão que você compra. Escolha uma ferramenta e veja o conselho trabalhar: posições independentes, verificações cruzadas, classificações anônimas e a divergência. Isto é um replay: nada do que você clicar aqui chama um modelo, e nada sai desta página.
Escolha uma ferramenta
Cinco perguntas de áreas diferentes. Escolha uma.
Contexto enviado: Desenvolvedor solo. Ferramenta de faturamento para freelancers, USD 19 por mês, período de teste gratuito de 14 dias, 30 clientes pagantes depois de 5 meses. Os cadastros vêm principalmente de dois posts de blog bem ranqueados no Google. Cerca de 12% dos testes convertem. O suporte já toma cerca de 5 horas por semana. O desenvolvedor tem um emprego fixo e cerca de 10 horas por semana para o produto.
Opções: Criar um plano gratuito · Manter só o pago, estender o teste para 30 dias · Manter só o pago, sem mudar nada
Contexto enviado: Somos uma pequena agência digital. O cliente vende cerca de 1.800 produtos de móveis na Alemanha, na Áustria e na Suíça, tem 3 funcionários e nenhum desenvolvedor interno. A loja atual é uma instalação de WooCommerce auto-hospedada, com 6 anos, 31 plugins, páginas lentas e dois incidentes de segurança no último ano. O faturamento é de cerca de EUR 1,2 milhão por ano. O cliente quer menos manutenção e menos emergências; usa um ERP local que exporta os dados de produtos em CSV. Orçamento para a reconstrução: EUR 25.000.
Opções: Reconstruir em WooCommerce · Migrar para o Shopify
Contexto enviado: Padaria com 6 funcionários em uma cidade alemã de 40.000 habitantes. Bolos personalizados e encomendas têm a melhor margem. Hoje, os pedidos chegam apenas por telefone e e-mail; o site tem o horário de funcionamento e um formulário de contato, nada para fazer pedidos. O Perfil da Empresa no Google tem 4,7 estrelas com 120 avaliações. Nenhuma publicidade paga até agora. Orçamento: EUR 3.000 para o próximo trimestre; o dono tem pouco tempo.
Opções: Google Ads · Uma página de pedidos on-line de verdade · Dividir igualmente entre os dois
Contexto enviado: Equipe de 8 engenheiros. Um monólito em TypeScript, cerca de 60.000 linhas, um banco de dados Postgres, com deploys várias vezes por dia. O módulo de cobrança muda toda semana e causou 5 dos últimos 8 incidentes em produção, principalmente porque outros módulos leem e gravam diretamente nas tabelas de cobrança. Ninguém na equipe já operou um sistema distribuído em produção. A liderança quer menos incidentes em até dois trimestres.
Opções: Extrair a cobrança para um serviço agora · Reforçar primeiro as fronteiras dentro do monólito
Contexto enviado: Triagem por título e resumo de cerca de 3.000 registros para uma revisão sistemática em pesquisa em serviços de saúde, com publicação planejada. Protocolo atual: dois revisores humanos independentes, com conflitos resolvidos por discussão. O tempo da equipe é curto. A revisão segue o PRISMA, e os pareceristas da revista vão perguntar como a triagem foi feita. Deixar de fora um estudo relevante (falsa exclusão) é pior do que incluir um irrelevante.
Opções: Sim, substituir o segundo revisor humano · Usar o LLM como revisor adicional; humanos resolvem os conflitos · Não, manter dois revisores humanos e nenhum LLM
Gravado em 13 de outubro de 2026 com kirat_vote no nível de esforço padrão; cada sessão levou menos de 20 segundos e custou menos de dois centavos. Perguntas, opções e contexto foram enviados em inglês e aparecem aqui traduzidos; o raciocínio aparece na íntegra. Todo o raciocínio exibido aqui está traduzido: os modelos responderam em inglês e, em parte, em alemão (o Gemini quatro vezes, o ChatGPT uma vez). Na pergunta sobre o plano gratuito, o Claude perdeu a votação por 2:1, e sua objeção ficou registrada. Os valores de confiança são a autoavaliação de cada modelo.
Cinco trechos de código de áreas diferentes, cada um enviado exatamente como mostrado. O ChatGPT e o Gemini revisam em paralelo, o Claude acrescenta dois achados próprios, e cada achado é verificado pela outra família de modelos. Só contam os achados confirmados. Escolha um.
Foco: segurança e correção de um webhook de pagamento
Código enviado:
// 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;
- crítico
O webhook processa o corpo da requisição sem verificar a assinatura do Stripe. Com isso, qualquer chamador externo pode enviar eventos `invoice.paid` ou `customer.subscription.deleted` falsificados e liberar ou rebaixar contas de usuário. Além disso, o parser JSON descarta o raw body inalterado, necessário para a verificação da assinatura do Stripe.
Correção: Para esta rota, usar `express.raw({ type: 'application/json' })` e, antes de qualquer processamento, chamar `stripe.webhooks.constructEvent(req.body, req.headers['stripe-signature'], webhookSecret)`. Garantir que nenhum parser JSON global já seja aplicado antes a esta rota; rejeitar assinaturas inválidas com 400.
- crítico
Falta a validação da assinatura do webhook do Stripe. Um invasor pode enviar a este endpoint quaisquer eventos de webhook falsificados para colocar contas no Pro sem autorização ou manipular registros do banco de dados.
Correção: Use stripe.webhooks.constructEvent() com o webhook secret do Stripe para verificar a autenticidade e a integridade de cada evento.
- crítico
Vulnerabilidade de SQL injection pela concatenação direta de entradas do usuário (event.data.object.customer) na string da consulta SQL.
Correção: Use consultas parametrizadas, como nas instruções anteriores: db.query('UPDATE users SET plan = $1 WHERE stripe_customer = $2', ['free', event.data.object.customer]).
- crítico
O webhook nunca verifica a assinatura do Stripe, e express.json() descarta o raw body necessário para isso. Qualquer pessoa pode fazer POST de um evento invoice.paid falso e fazer o upgrade de qualquer conta para pro de graça.
Correção: Use express.raw({ type: 'application/json' }) nesta rota e construa o evento com stripe.webhooks.constructEvent(req.body, req.headers['stripe-signature'], endpointSecret); rejeite a requisição em caso de falha.
- alto
O ID do cliente é inserido diretamente em uma instrução SQL. Um valor como `' OR 1=1 --` pode manipular a cláusula WHERE e colocar todos os usuários no plano gratuito; dependendo da configuração do banco de dados, SQL injections mais amplas são possíveis.
Correção: Parametrizar a consulta por completo: `UPDATE users SET plan = 'free' WHERE stripe_customer = $1` com `[event.data.object.customer]`. Além disso, autenticar o evento pela assinatura do Stripe.
- alto
Não há controle de idempotência. O Stripe entrega webhooks pelo menos uma vez e os repete em caso de timeouts ou erros. Por isso, o mesmo evento `invoice.paid` pode gerar várias vezes registros de pagamento idênticos.
Correção: Armazenar o ID do evento do Stripe ou o ID da fatura no registro de pagamento, protegê-lo com uma UNIQUE constraint e executar o processamento do evento junto com o pagamento de forma atômica, como insert/upsert. Confirmar com 200 os eventos já processados, sem repetir a operação de negócio.
- alto
O handler `async` não tem encaminhamento de erros. O Express 4 não captura automaticamente promises rejeitadas de route handlers assíncronos. Um erro de banco de dados ou um objeto `invoice.paid` incompleto leva, por isso, a uma rejeição de promise não tratada e, no Node 20, pode encerrar o processo, em vez de devolver de forma controlada uma resposta de erro.
Correção: Envolver o handler em `try/catch` e repassar os erros a `next(err)` ou usar um wrapper assíncrono. Validar a estrutura da entrada antes do acesso e, em erros temporários de processamento, devolver de forma controlada um status 5xx, para que o Stripe faça a entrega de novo.
- alto
O uso de express.json() para o endpoint do webhook faz o parse prévio do corpo como JSON. Para a verificação de assinatura do Stripe, porém, é necessário o raw body inalterado.
Correção: Use express.raw({ type: 'application/json' }) em vez de express.json() para o route handler do webhook do Stripe.
- médio
A atualização do usuário e o registro do pagamento são duas operações de banco de dados confirmadas de forma independente. Se o INSERT falhar depois de um UPDATE bem-sucedido, o usuário recebe o plano Pro, embora não exista um registro de pagamento correspondente.
Correção: Executar as duas operações, junto com a marcação de idempotência, em uma transação de banco de dados no mesmo client e fazer rollback completo em qualquer erro.
- médio
O processamento não leva em conta que o Stripe pode entregar eventos fora da ordem em que foram criados. Um `invoice.paid` mais antigo e atrasado pode fazer `paid_until` retroceder; um `customer.subscription.deleted` atrasado pode colocar de novo em `free` um usuário que, nesse meio-tempo, foi reativado.
Correção: Conferir o estado atual da assinatura com base em IDs estáveis do Stripe, por exemplo consultando o Stripe, e persistir as transições de estado ou o momento do último evento processado. No mínimo, atualizar `paid_until` apenas para a frente e não aplicar cegamente eventos de exclusão ao estado atual do usuário.
- médio
`amount_paid / 100` pressupõe, sem verificação, que a moeda tem exatamente duas casas decimais. Isso está errado, por exemplo, para JPY. Além disso, a moeda não é armazenada junto, de modo que o valor no registro de pagamento fica sem unidade inequívoca.
Correção: De preferência, armazenar os valores inalterados na menor unidade da moeda, junto com `invoice.currency`. Se forem necessárias unidades principais da moeda, fazer a conversão com base no expoente de cada moeda.
- médio
Falta tratamento de exceções em uma rota assíncrona do Express 4. Em caso de erro de banco de dados ou de campos ausentes, isso leva a uma unhandled promise rejection, que pode derrubar a aplicação.
Correção: Adicione um bloco try-catch e repasse os erros a next(err) ou use um utilitário como express-async-handler.
- médio
Não há validação da presença de invoice.metadata.userId. Se o campo metadata ou userId estiver ausente ou for undefined, as consultas SQL falham ou trabalham com valores inválidos.
Correção: Antes de executar as consultas ao banco de dados, verifique explicitamente se invoice.metadata e invoice.metadata.userId existem e são válidos.
- médio
O Stripe repete webhooks e pode entregar o mesmo evento mais de uma vez. Cada entrega insere outra linha de pagamento, então os relatórios de receita contam em dobro.
Correção: Armazene event.id (ou o ID da fatura) com uma unique constraint e pule os eventos que já foram processados.
Foco: segurança e correção de um plugin de importação para WooCommerce
Código enviado:
<?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();
}
- crítico
A importação é acessível publicamente via `wp_ajax_nopriv_erp_import`; também no hook autenticado faltam verificações de capability e de nonce. Com isso, usuários anônimos ou ataques CSRF podem alterar nomes de produtos, preços e estoques.
Correção: Remover o hook `nopriv`, verificar antes de qualquer processamento uma capability adequada, como `manage_woocommerce`, e proteger a requisição com `check_ajax_referer()`.
- crítico
O hook wp_ajax_nopriv_erp_import dá a visitantes não autenticados acesso à função de importação.
Correção: Remover o hook nopriv e verificar a permissão com current_user_can('manage_options').
- crítico
O caminho de arquivo de $_POST['file'] é passado sem verificação para file(), o que permite path traversal e leitura arbitrária de arquivos (LFI).
Correção: Processar uploads de arquivos via $_FILES ou validar estritamente o caminho de entrada contra diretórios permitidos (p. ex. wp_upload_dir()).
- crítico
Vulnerabilidade de SQL injection, porque $sku é inserido diretamente na consulta SQL sem sanitização.
Correção: Usar prepared statements com $wpdb->prepare().
- crítico
A importação está registrada para wp_ajax_nopriv, e não há verificação de capability nem nonce. Qualquer visitante pode acioná-la e sobrescrever preços, estoque e nomes de produtos.
Correção: Remova o hook nopriv, verifique current_user_can('manage_woocommerce') e valide um nonce com check_ajax_referer() antes de fazer qualquer coisa.
- alto
O caminho fornecido pelo cliente é passado sem verificação para `file()`. Com isso, podem ser processados quaisquer arquivos locais legíveis e — dependendo de `allow_url_fopen` — URLs externas ou internas, o que permite acessos indesejados a arquivos e blind SSRF.
Correção: Não aceitar caminhos de livre escolha. Usar apenas IDs de upload conhecidos no servidor, verificar o caminho canônico contra um diretório de importação fixo e permitir exclusivamente arquivos CSV locais regulares.
- alto
`$sku` vem do CSV e é interpolado diretamente no SQL. Um valor de SKU com metacaracteres SQL pode manipular a consulta e, entre outras coisas, selecionar um post ID arbitrário como alvo da atualização.
Correção: Parametrizar a consulta com `$wpdb->prepare()`, por exemplo com `meta_value = %s`, ou usar a função do WooCommerce para buscar produtos pela SKU.
- alto
`file()` carrega toda a entrada na memória, e `array_map()` cria adicionalmente o array completo já parseado. Sem limite de tamanho, um recurso remoto grande ou interminável pode esgotar a memória, o tempo de execução e os workers PHP; o acesso público agrava isso.
Correção: Limitar o tamanho do arquivo e o número de linhas, abrir o arquivo localmente com `fopen()` e processar os registros em streaming via `fgetcsv()`. Além disso, usar rate limits ou um job em segundo plano controlado.
- alto
Falta proteção contra CSRF (validação de nonce).
Correção: Chamar check_ajax_referer() no início da função.
- alto
O caminho do arquivo vem direto da requisição e é passado para file(). Um invasor pode ler qualquer arquivo que o servidor web consiga ler, ou uma URL remota se allow_url_fopen estiver ativado.
Correção: Aceite um arquivo enviado por meio de wp_handle_upload() ou leia apenas de um diretório de importação fixo; nunca tire um caminho da requisição.
- médio
Pressupõe-se que cada linha tenha exatamente quatro colunas utilizáveis. Linhas vazias ou corrompidas fornecem valores ausentes, o que gera avisos e pode fazer com que nome, preço ou estoque sejam definidos involuntariamente com valores vazios.
Correção: Antes da desestruturação, verificar o número de colunas e os campos obrigatórios, pular linhas vazias e rejeitar registros defeituosos com uma mensagem de erro clara.
- médio
A combinação de `file()` e `str_getcsv()` faz o parse de cada linha física separadamente. Campos CSV válidos com quebras de linha embutidas são, com isso, divididos em vários registros defeituosos.
Correção: Ler o CSV como stream com `fgetcsv()`; essa função processa campos de várias linhas corretamente entre aspas, atravessando os limites dos registros.
- médio
Preço e estoque são armazenados sem verificação como strings arbitrárias. Valores não numéricos, formatos decimais errados ou estoques inadmissíveis podem corromper os dados dos produtos e levar a cálculos inconsistentes.
Correção: Validar preço e estoque antes de gravar e normalizá-los com helpers do WooCommerce como `wc_format_decimal()` e `wc_stock_amount()`; rejeitar valores inválidos ou inadmissíveis do ponto de vista de negócio.
- médio
Os dados do WooCommerce são alterados diretamente como post meta. Com isso, estados relacionados, como `_stock_status`, as tabelas de lookup de produtos e, eventualmente, caches, não são sincronizados de forma confiável com os novos preços e estoques.
Correção: Carregar o produto via `wc_get_product()`, usar os métodos CRUD como `set_regular_price()`, `set_price()` e `set_stock_quantity()`, definir o status de estoque ou `manage_stock` conforme as regras de negócio e, em seguida, chamar `save()`.
- médio
A busca por SKU considera todos os metadados de posts e não verifica nem o tipo de post nem se o ID encontrado é de fato um produto ou uma variação do WooCommerce. Além disso, com metadados `_sku` duplicados ou usados para outra finalidade, é atualizado um resultado não determinístico.
Correção: Usar `wc_get_product_id_by_sku()` e, em seguida, validar o resultado com `wc_get_product()` e com o tipo de produto esperado; tratar SKUs duplicadas como erros de importação.
- médio
Os valores de retorno de `update_post_meta()` e `wp_update_post()` são ignorados. A importação pode falhar ou ser interrompida em parte, mas mesmo assim informa o número total de linhas lidas como importadas com sucesso.
Correção: Registrar sucesso e erro por produto, usar `wp_update_post(..., true)`, contar apenas os registros de fato atualizados e devolver uma resposta de erro estruturada. Para importações grandes, prever um job em segundo plano que possa ser retomado.
- médio
Para cada linha do CSV, são executadas de forma síncrona pelo menos uma consulta de busca e várias operações de gravação individuais. Com isso, importações grandes causam muitos roundtrips ao banco de dados, podem estourar o timeout da requisição e deixar um catálogo atualizado só em parte.
Correção: Executar a importação em lotes limitados como processo em segundo plano, resolver as SKUs em conjunto e salvar o progresso e o estado para retomada.
- médio
file() lê o arquivo inteiro de uma vez para a memória, o que, com arquivos CSV grandes, leva a erros de esgotamento de memória.
Correção: Fazer streaming do arquivo linha por linha com fopen() e fgetcsv().
- médio
A desestruturação do array pressupõe que cada linha contenha pelo menos 4 elementos; caso contrário, ocorrem PHP warnings ou erros de índice não inicializado.
Correção: Antes de desempacotar, verificar com count($row) se há colunas suficientes.
- médio
Consultas ao banco de dados e atualizações de posts são feitas uma a uma em um loop (problema N+1), o que deixa o tempo de execução muito mais lento.
Correção: Dividir a importação em lotes e agrupar consultas/atualizações.
- baixo
Erros de `file()` não são verificados. Com um caminho ausente, ilegível ou não suportado, `file()` retorna `false`, e então `array_map()` pode lançar um `TypeError` nas versões atuais do PHP.
Correção: Verificar explicitamente a abertura e a leitura, não usar avisos do PHP como fluxo de controle e, em caso de erro, devolver uma resposta HTTP ou `wp_send_json_error()` adequada.
Foco: segurança e correção de um fluxo de pedido e pagamento
Código enviado:
// 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;
- crítico
cakeId é interpolado diretamente na string SQL. Um invasor pode injetar expressões SQL ou instruções adicionais e, com isso, ler ou alterar dados ou sobrecarregar o banco de dados.
Correção: Parametrizar também esta consulta, p. ex. `SELECT ... FROM cakes WHERE id = $1` com `[cakeId]`, e verificar adicionalmente se cakeId tem o tipo esperado.
- crítico
Vulnerabilidade de SQL injection pela interpolação direta de cakeId via template string na consulta SQL.
Correção: Use uma consulta SQL parametrizada: pool.query('SELECT * FROM cakes WHERE id = $1', [cakeId]).
- crítico
Manipulação de preço pelo lado do cliente é possível. O preço é tirado de req.body e armazenado e processado diretamente.
Correção: Leia o preço no servidor a partir do banco de dados (cake.rows[0].price) e não confie no valor enviado pelo cliente.
- crítico
cakeId do corpo da requisição é interpolado na string SQL: SQL injection.
Correção: Use uma consulta parametrizada: SELECT * FROM cakes WHERE id = $1.
- alto
O valor a ser armazenado e repassado ao fluxo de pagamento vem inteiramente de `req.body.price`. Um cliente pode informar, para qualquer bolo, um valor manipulado, negativo ou muito pequeno.
Correção: Determinar o preço exclusivamente no servidor, a partir do bolo selecionado ou de uma versão de preço imutável. Criar no provedor de pagamento uma sessão de pagamento no servidor com esse valor e, na confirmação do pagamento, verificar novamente no servidor o valor esperado.
- alto
O pedido é criado e uma confirmação é enviada antes que qualquer pagamento bem-sucedido tenha sido comprovado. Com isso, processos cancelados ou propositalmente não pagos aparecem como pedidos confirmados e podem ser gerados à vontade.
Correção: Criar os pedidos primeiro com um status como `pending_payment`. Só mudar para `paid` após uma notificação autenticada do provedor de pagamento, processada de forma idempotente, e então enviar a confirmação ou acionar a produção ou a reserva.
- alto
Falta tratamento de erros na rota assíncrona do Express 4. Erros de banco de dados ou de execução levam a promise rejections não tratadas.
Correção: Use um bloco try/catch e repasse os erros com next(err), ou use um pacote como express-async-errors.
- alto
O valor vem do cliente (price no corpo da requisição), então um cliente pode definir o próprio preço.
Correção: Leia o preço da linha de cakes no servidor e ignore qualquer valor vindo do cliente.
- médio
O handler assíncrono não tem encaminhamento de erros. O Express 4 não processa automaticamente promises rejeitadas de handlers `async`; por isso, erros de banco de dados ou erros síncronos de e-mail podem levar a requisições sem resposta e a unhandled rejections.
Correção: Envolver o handler em `try/catch` e repassar os erros a `next(err)` ou usar um wrapper assíncrono consagrado. Além disso, configurar um tratamento de erros central.
- médio
O resultado de `sendConfirmation` não recebe await nem tem seus erros tratados de outra forma. Uma rejeição da promise pode ficar sem tratamento; ao mesmo tempo, o cliente já recebe uma resposta de sucesso, embora o envio do e-mail possa ter falhado.
Correção: Executar o envio após o pagamento confirmado por meio de uma outbox persistente ou de uma fila de jobs com novas tentativas. No mínimo, fazer await da promise e registrar ou tratar os erros de forma controlada.
- médio
Não há proteção de idempotência. Repetições do navegador, cliques duplos ou retries de rede geram, cada um, um novo pedido e, eventualmente, várias confirmações ou tentativas de pagamento.
Correção: Aceitar uma idempotency key ou um ID de sessão de checkout, protegê-lo com uma unique constraint e, em repetições, devolver o pedido já existente.
- médio
pickupDate, name, email, price e note são processados sem validação de negócio nem sintática. Assim, podem ser armazenados, por exemplo, datas de retirada passadas ou inválidas, dados de cliente faltando e valores de campo inadequados; além disso, erros de banco de dados só aparecem tarde e de forma descontrolada.
Correção: Usar um schema de requisição com tipos, campos obrigatórios, limites de tamanho e formatos normalizados. Verificar as datas de retirada quanto a fuso horário, antecedência e regras admissíveis de horário de funcionamento ou de capacidade; não aceitar o preço como entrada do cliente.
- médio
A chamada assíncrona de sendConfirmation não recebe await nem tem seus erros capturados.
Correção: Coloque await antes de sendConfirmation e trate possíveis erros no envio do e-mail.
- baixo
Validação de entrada incompleta para campos como email, pickupDate, name e note.
Correção: Implemente uma validação por schema (p. ex. com Zod ou express-validator) antes de processar os dados da requisição.
Foco: correção e integridade de dados de uma função de cobrança
Código enviado:
// 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;
}
- crítico
Faltam transação de banco de dados e bloqueio de linhas. Com requisições paralelas, podem ocorrer race conditions (p. ex. double spending de crédito) e atualizações incompletas em caso de erro.
Correção: Use um client do pool com BEGIN/COMMIT e use SELECT FOR UPDATE para bloquear e atualizar linhas de forma atômica.
- alto
As três atualizações relacionadas não são executadas em uma transação de banco de dados. Se o débito do crédito do cliente ou a mudança de status falhar, a fatura já pode ter sido reduzida sem que o crédito tenha sido debitado corretamente ou o status tenha sido definido.
Correção: Obter um client dedicado do pool e executar todas as verificações e atualizações entre BEGIN e COMMIT; em qualquer erro, usar ROLLBACK.
- alto
A fatura é lida primeiro e depois sobrescrita com um valor calculado de forma absoluta. Duas chamadas paralelas podem ler o mesmo valor inicial e depois sobrescrever uma à outra; os dois débitos de crédito acontecem mesmo assim, enquanto só um dos abatimentos fica visível por completo na fatura.
Correção: Bloquear a fatura afetada dentro da mesma transação com SELECT ... FOR UPDATE ou alterar o valor de forma atômica via UPDATE ... SET total_cents = total_cents - $1 com condições adequadas.
- alto
A verificação e o débito do crédito do cliente não são atômicos. Chamadas paralelas podem ver a mesma cobertura disponível e depois reduzir o crédito para abaixo de zero.
Correção: Bloquear o registro do cliente de forma transacional ou usar um UPDATE condicional, como UPDATE customers SET credit_cents = credit_cents - $1 WHERE id = $2 AND credit_cents >= $1 RETURNING credit_cents, e exigir exatamente uma linha retornada.
- alto
Não se verifica se a fatura pertence ao cliente informado. Com isso, o crédito de um cliente pode ser aplicado a qualquer fatura indicada por invoiceId.
Correção: Consultar e atualizar fatura e cliente pela relação de propriedade, por exemplo com WHERE invoices.id = $1 AND invoices.customer_id = $2; interromper se não houver correspondência.
- alto
O crédito a ser aplicado não é limitado ao valor em aberto da fatura. Se creditCents for maior que total_cents, um valor de fatura negativo é armazenado e o crédito excedente do cliente é consumido.
Correção: Permitir apenas valores até o valor em aberto da fatura ou determinar o valor efetivamente usado como min(creditCents, total_cents) e debitar somente esse valor do crédito do cliente.
- alto
Valores negativos, não inteiros ou não representáveis com segurança não são rejeitados. Em particular, um valor negativo de creditCents aumenta o valor da fatura e, ao mesmo tempo, pela subtração de um valor negativo, o crédito do cliente.
Correção: Antes dos acessos ao banco de dados, exigir Number.isSafeInteger(creditCents) && creditCents > 0; tratar valores monetários sempre como centavos inteiros.
- alto
O status da fatura lido é totalmente ignorado. Assim, o crédito pode ser aplicado também a faturas já pagas, canceladas ou que, por outro motivo, não podem mais ser alteradas; com isso, um documento já pago pode ficar negativo.
Correção: Definir explicitamente os status de partida admissíveis e verificá-los de forma atômica na condição do UPDATE, por exemplo AND status = 'open'. Se não houver correspondência, interromper a operação.
- alto
Acesso a balance.rows[0] e inv.rows[0] sem verificação prévia. Se um cliente ou uma fatura não for encontrado, a aplicação cai com um TypeError não tratado.
Correção: Verifique inv.rows.length e balance.rows.length antes do acesso e lance uma mensagem de erro explícita.
- alto
Falta validação de valores negativos para creditCents. Um valor negativo burla a verificação (creditCents > available) e leva a ajustes errados no crédito ou na fatura.
Correção: Garanta que creditCents seja um inteiro positivo maior que 0.
- alto
As leituras e as três atualizações rodam fora de uma transação e sem bloqueio de linhas. Duas chamadas simultâneas podem ambas passar pela verificação de crédito e gastar o mesmo crédito duas vezes, e uma queda entre as atualizações deixa a fatura e o saldo de crédito inconsistentes.
Correção: Execute tudo em uma transação em um único client, bloqueie as linhas com SELECT ... FOR UPDATE e faça commit só depois que todas as atualizações tiverem sucesso.
- alto
A função nunca verifica se a fatura pertence ao cliente nem se ela ainda está em aberto. O crédito de um cliente pode ser aplicado à fatura de outro cliente, ou a uma fatura que já foi paga.
Correção: Selecione a fatura com WHERE id = $1 AND customer_id = $2 AND status = 'open' e falhe se nenhuma linha voltar.
- médio
A existência da fatura e do cliente não é verificada. Com IDs desconhecidos, os acessos a rows[0] levam a erros de execução em vez de um erro de negócio controlado; além disso, as duas consultas são executadas desnecessariamente antes que isso seja percebido.
Correção: Verificar rowCount ou rows.length nas duas consultas e lançar um erro not-found definido; integrar a verificação à transação e, se possível, a uma consulta relacional.
- médio
O valor de retorno não corresponde nem ao valor em centavos armazenado nem a uma simples conversão para a unidade principal da moeda: ele soma 19 por cento de forma genérica e usa aritmética de ponto flutuante. Com isso, quem chama pode receber um valor diferente, do ponto de vista fiscal e de arredondamento, do saldo da fatura efetivamente armazenado.
Correção: Retornar inalterado o valor restante em centavos ou definir um valor de retorno com tipo claro. Se o cálculo de impostos for necessário do ponto de vista de negócio, obter a alíquota e a regra de arredondamento dos dados da fatura e calcular com aritmética de inteiros ou decimal.
- médio
Uso de aritmética de ponto flutuante IEEE 754 (newTotal * 1.19 / 100) para cálculos financeiros. Isso leva a erros de precisão e de arredondamento.
Correção: Calcule sempre em centavos com inteiros (BigInt/Math.round) ou use uma biblioteca de aritmética decimal exata.
- baixo
Um comando UPDATE separado para o status da fatura gera roundtrips desnecessários ao banco de dados.
Correção: Junte a atualização de total_cents e de status em uma única consulta UPDATE.
Foco: correção de uma análise de triagem para uma revisão sistemática
Código enviado:
# 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)
- alto
O inner join padrão remove todos os valores de record_id que aparecem em apenas um dos dois arquivos. Com isso, o kappa e os conflitos são calculados só para a interseção, sem tornar visíveis as triagens ausentes. Ao mesmo tempo, “Records screened” na linha 18 informa o tamanho de a em vez da interseção efetivamente analisada.
Correção: Usar um outer join com indicador de merge, comparar explicitamente os conjuntos de IDs e informar separadamente as decisões ausentes ou tratá-las como erro de dados. Para cada métrica, exibir o denominador efetivamente usado.
- alto
A unicidade de record_id não é verificada. IDs duplicados levam, no merge, a um produto cartesiano many-to-many e dão peso múltiplo a estudos individuais, o que distorce a concordância, as prevalências, o kappa e os arquivos de saída.
Correção: Antes do merge, verificar nos dois arquivos se record_id é não nulo e único e interromper em caso de duplicatas. Além disso, usar merge(..., validate='one_to_one').
- alto
Os valores de decisão não são validados. Valores ausentes, erros de digitação, maiúsculas/minúsculas ou categorias adicionais são tratados implicitamente como “exclude” no cálculo da prevalência de inclusão, enquanto a concordância observada compara valores exatos. Com isso, o cálculo deixa de corresponder a um kappa de Cohen binário e pode produzir resultados contraditórios.
Correção: Normalizar decision de forma controlada antes da análise e garantir que cada valor seja exatamente 'include' ou 'exclude'. Tratar separadamente valores ausentes ou desconhecidos como erro de dados ou triagem incompleta.
- alto
excluded contém todos os registros excluídos pelo revisor A, inclusive conflitos em que o revisor B decidiu “include”. Assim, esses registros são gravados ao mesmo tempo em excluded.csv e em conflicts.csv. Se excluded.csv deve representar os registros definitivamente excluídos, conflitos não resolvidos podem ser removidos indevidamente da revisão.
Correção: Sem uma regra de precedência documentada, selecionar apenas exclusões concordantes, ou seja, (decision_a == 'exclude') & (decision_b == 'exclude'). Manter os conflitos exclusivamente em conflicts.csv até a decisão por consenso.
- alto
Filtragem errada dos estudos excluídos: 'excluded' considera exclusivamente a decisão do revisor A ('merged.decision_a == "exclude"'). Havendo um conflito (o revisor A exclui, o revisor B inclui), o estudo é indevidamente considerado excluído.
Correção: Exportar exclusões apenas quando os dois revisores tiverem escolhido 'exclude' de forma concordante (p. ex. '(merged.decision_a == "exclude") & (merged.decision_b == "exclude")'), ou aguardar a resolução do conflito.
- alto
excluded.csv contém todo registro que o revisor A excluiu, inclusive conflitos em que o revisor B o incluiu. Esses registros são descartados antes da discussão dos conflitos, o que é exatamente a falsa exclusão que o protocolo precisa evitar.
Correção: Exclua apenas os registros que os dois revisores excluíram: merged[(merged.decision_a == 'exclude') & (merged.decision_b == 'exclude')]; mande primeiro todo conflito para resolução.
- médio
Se os dois revisores usarem exclusivamente a mesma categoria, expected é igual a 1 e o denominador do kappa é igual a 0. O resultado vira NaN ou pode gerar um aviso de divisão por zero; a saída formatada “nan” não explica que o kappa não está matematicamente definido. Também uma interseção analisada vazia leva a métricas NaN sem significado.
Correção: Antes da divisão, verificar se existem de fato decisões válidas pareadas e se 1 - expected é maior que 0. Em casos degenerados, indicar explicitamente o kappa como “não definido” e relatar as frequências subjacentes.
- médio
Possível divisão por zero no kappa de Cohen quando o valor esperado ao acaso 'expected' é igual a 1 (p. ex. quando os dois revisores escolhem a mesma categoria para 100% dos registros).
Correção: Antes do cálculo, interceptar o caso em que '1 - expected == 0' e, nesse caso, atribuir um valor definido (p. ex. 1.0 ou NaN).
- médio
Descarte silencioso de registros pelo inner join padrão. Se o revisor A e o revisor B avaliaram conjuntos diferentes de 'record_id's, as discrepâncias nos estudos processados não são informadas. Além disso, 'len(a)' na saída do console deixa então de corresponder ao número de estudos de fato pareados.
Correção: Verificar se 'len(a) == len(b) == len(merged)' é válido, ou fazer um outer join para mostrar explicitamente os registros avaliados de forma incompleta.
- médio
O inner merge descarta silenciosamente registros que só um revisor decidiu, e a contagem impressa usa len(a). Registros não triados desaparecem tanto da concordância quanto dos números do PRISMA.
Correção: Faça o merge com how='outer', indicator=True, e falhe ou informe quando algum registro não tiver decisão de um dos revisores.
- baixo
Faltam sanitização da entrada e tratamento de valores ausentes na coluna 'decision'. Maiúsculas/minúsculas, espaços em branco ou valores NaN levam a comparações erradas.
Correção: Limpar os valores da coluna antes da comparação (p. ex. com '.str.strip().str.lower()') e garantir a segurança dos tipos de dados.
Exibido: cada achado confirmado com sua correção, como os membros os escreveram; o raciocínio dos verificadores foi reduzido ao veredito. Duplicatas não são mescladas, então um mesmo problema pode aparecer mais de uma vez quando vários membros o relatam. O código, o foco e os achados do próprio Claude foram enviados em inglês, e os membros escreveram seus achados em alemão; aqui, todos esses textos aparecem traduzidos, exceto o código.
Cinco briefings de ideias de áreas diferentes. O ChatGPT e o Gemini trabalham em três linhas, o Claude acrescenta uma ideia, e os dois membros avaliam cada ideia anonimamente (de 1 a 10 cada, até 20 pontos). Escolha um.
Tema: Ideias para um desenvolvedor solo transformar mais leitores de dois posts de blog bem ranqueados no Google em cadastros de teste de uma ferramenta de faturamento para freelancers
Contexto enviado: Ferramenta de faturamento para freelancers, USD 19 por mês, período de teste gratuito de 14 dias, 30 clientes pagantes depois de 5 meses. Os cadastros vêm principalmente de dois posts de blog bem ranqueados no Google (como escrever uma fatura de freelancer; como cobrar pagamentos atrasados). Cerca de 12% dos testes convertem. O desenvolvedor tem um emprego fixo e cerca de 10 horas por semana para o produto. RESTRIÇÃO RÍGIDA: nenhuma publicidade paga. RESTRIÇÃO RÍGIDA: no máximo 3 horas por semana para isso.
- 1
Trocar o relógio de 14 dias por três envios reais
Testar um período de teste que termina após três faturas ou cobranças de pagamento enviadas, em vez de após 14 dias corridos. Isso quebra deliberadamente a premissa flexível de que um teste com limite de tempo é adequado: freelancers podem não faturar durante uma janela arbitrária de duas semanas, então o teste atual pode expirar antes que o produto prove seu valor. Manter o plano mensal de $19 inalterado e comparar a conversão de ativação para pago por coorte.
- 2
Concluir a tarefa dentro do artigo
Incorporar um pequeno gerador de faturas em “como escrever uma fatura de freelancer”: os leitores informam cliente, valor, data de vencimento e condições de pagamento e veem uma prévia pronta. “Enviar ou salvar esta fatura” cria um teste com esses dados já carregados, eliminando a distância entre aprender e fazer. Construí-lo em partes semanais limitadas a três horas e depois manter a manutenção perto de zero.
- 3
Transformar o artigo sobre cobrança em um console de recuperação
Como substituição de um passo do gerador de faturas incorporado, deixar os leitores informarem um valor em atraso e uma data de vencimento para gerar uma sequência datada de cobrança em três mensagens. Iniciar um teste salva o devedor, agenda as mensagens e abre o primeiro rascunho pronto para enviar. Isso preserva o padrão mais forte — um resultado útil antes do cadastro — e ao mesmo tempo corresponde à intenção do segundo post.
- 4
Colocar o momento da conversão no calendário do devedor
Oferecer, no artigo sobre pagamentos atrasados, um arquivo .ics gerado com lembretes para a data de vencimento e cobranças cada vez mais firmes nos dias 1, 7 e 14. Cada evento do calendário contém um deep link que abre o fluxo de cobrança correspondente com as datas já preenchidas, trazendo o leitor de volta quando a dor é real, e não enquanto ele está apenas pesquisando. Não exige coleta de e-mail e pode rodar sem supervisão.
- 5
Plano gratuito permanente para um cliente em vez de período de teste
Esta ideia quebra a restrição flexível do período de teste de 14 dias e o substitui por um plano freemium para exatamente um cliente ativo. Os freelancers usam o produto gratuitamente e de forma permanente para o seu primeiro cliente e fazem o upgrade sem atrito para a tarifa fixa de 19 dólares assim que entra um segundo cliente.
- 6
Encaminhar os leitores pelo problema imediato
Substituir banners genéricos de teste por três opções no próprio texto, como “Preciso da minha primeira fatura”, “Faturo com frequência” e “Um cliente já está atrasado”. Cada opção abre um estado de onboarding correspondente, em vez da mesma página inicial, e os IDs das seções do artigo podem pré-selecionar padrões sensatos. Medir a ativação concluída do teste, não só os cliques no CTA, e testar uma rota por semana.
- 7
Publicar três transformações forenses de faturas
Com permissão, transformar três faturas anonimizadas de clientes em estudos de caso estáticos de antes e depois, mostrando exatamente o que mudou e por quê. Inserir cada transformação ao lado do conselho correspondente no post bem ranqueado, com um CTA que abre a mesma estrutura corrigida como modelo editável no teste. Evidências específicas de uma pequena base de clientes podem ser mais críveis do que depoimentos genéricos.
- 8
Deixar os leitores levarem o progresso de um post para o outro
Armazenar localmente no navegador a moeda escolhida pelo leitor, a etapa da fatura e a data de vencimento, e usar esse estado quando ele passar de um artigo para o outro. Quem criou um plano de fatura pode ver depois um aviso contextual como “Sua fatura está agora 3 dias atrasada — abra a cobrança preparada”, com o onboarding do teste já preenchido. Isso cria uma jornada leve entre os dois posts, sem exigir conta nem produção contínua de conteúdo.
- 9
Configurador interativo de cartas de cobrança
Complemente o artigo sobre cobrança de pagamentos atrasados com um gerador de cartas de cobrança escalonadas. Depois da digitação do texto, o modelo é gerado, combinado com o CTA para configurar no acesso de teste lembretes automáticos de pagamento para faturas futuras.
- 10
Magic link de envio imediato sem cadastro prévio
Mutação do gerador dentro do conteúdo: o leitor digita os dados da fatura diretamente no artigo do blog e clica em Enviar fatura agora mesmo. O sistema cria em segundo plano, sem atrito, uma conta de teste e envia o e-mail diretamente; a definição da senha acontece só depois.
- 11
Gerador de faturas ao vivo direto no artigo do blog
Incorpore uma ferramenta de formulário simples e interativa diretamente no artigo sobre como escrever faturas. Os leitores digitam os dados da fatura e podem baixar na hora, gratuitamente, o PDF pronto. Um botão em destaque oferece enviar a fatura digitalmente com um clique e acompanhar o status do pagamento no acesso de teste de 14 dias.
- 12
Cobrança avulsa pay-per-use em vez de assinatura mensal
Esta ideia quebra a restrição flexível do modelo puro de assinatura SaaS de 19 dólares por mês. Leitores do artigo sobre pagamentos atrasados podem, por uma taxa única de 5 dólares, mandar enviar uma carta de cobrança juridicamente segura com link de rastreamento, sendo a taxa integralmente abatida na contratação posterior da assinatura.
- 13
Modelo que abre na ferramenta
Oferecer o modelo de fatura do post como uma fatura pronta para usar na ferramenta: um clique abre uma conta de teste já preenchida em vez de baixar um arquivo.
- 14
Exit intent ligado ao problema com sequência automatizada de e-mails
Implemente no artigo sobre pagamentos atrasados um pop-up de exit intent que oferece, em troca do endereço de e-mail, um modelo de e-mail de emergência para clientes inadimplentes. Em seguida, uma sequência automatizada de três e-mails explica de forma passiva como workflows automatizados reduzem atrasos de pagamento e leva ao acesso de teste.
Tema: Ideias para uma pequena agência digital transformar a reconstrução pontual de uma loja em um contrato recorrente de manutenção que o cliente realmente queira
Contexto enviado: Agência de 4 pessoas. O cliente vende cerca de 1.800 produtos de móveis na Alemanha, na Áustria e na Suíça, tem 3 funcionários e nenhum desenvolvedor interno, faturamento de cerca de EUR 1,2 milhão por ano. A antiga loja WooCommerce auto-hospedada tinha 31 plugins e teve dois incidentes de segurança no ano passado; o cliente quer menos manutenção e menos emergências. Um ERP local exporta os dados de produtos em CSV. Orçamento para a reconstrução: EUR 25.000. RESTRIÇÃO RÍGIDA: nenhum lock-in; o cliente precisa poder sair a qualquer momento com todos os dados e acessos. RESTRIÇÃO RÍGIDA: nenhuma contratação a mais na agência.
- 1
Quebra de orçamento: operação antes do brilho do lançamento
Esta ideia quebra deliberadamente a restrição flexível do orçamento de reconstrução de EUR 25.000: oferecem-se, por exemplo, EUR 22.000 para um lançamento propositalmente enxuto mais EUR 12.000 para um primeiro ano de operação com compromisso firme. Em troca, as funcionalidades dispensáveis saem do projeto inicial; em vez delas, são financiados o reforço da importação, testes de restauração, monitoramento e melhorias mensais. O volume total maior compensa porque o cliente não compra de novo uma loja aparentemente pronta cujos custos reais de operação só aparecem depois do lançamento; todos os acessos, dados e entregáveis continuam transferíveis a qualquer momento.
- 2
Guardião de produtos CSV
Antes de cada importação do ERP, um pipeline automatizado verifica no CSV preços ausentes, duplicatas, variantes inválidas, erros de imagem, a lógica fiscal DACH e mudanças suspeitas de estoque. O contrato mensal de manutenção inclui a manutenção das regras, o monitoramento das importações e um relatório de erros compreensível para os três funcionários. Isso transforma a manutenção técnica em um benefício de negócio imediato: menos produtos errados, menos dúvidas e menos compras abandonadas.
- 3
Dividendo de confiabilidade
O cliente paga uma taxa básica moderada por monitoramento e manutenção; um valor trimestral adicional só é devido se metas de confiabilidade acordadas, como importações bem-sucedidas, restauração testada e tempos de resposta, tiverem sido atingidas. Falhas evitáveis causadas pela agência geram créditos de serviço em vez de horas de emergência faturáveis. Esse modelo alinha os incentivos econômicos à prevenção e tira do cliente o medo de que a agência lucre com problemas.
- 4
Carta de manutenção pronta para a saída
O contrato de manutenção é vendido deliberadamente como produto anti-lock-in: monitoramento, atualizações, backups, verificações de segurança e duas pequenas alterações por mês por cerca de EUR 1.200–1.500. Todas as contas ficam com o cliente, e o código e os scripts de importação ficam no repositório dele; além disso, todo mês ele recebe documentação, exportação de dados e uma pasta de transição pronta para uma rescisão. Assim, o cliente paga por capacidade operacional comprovável, e não por dependência.
- 5
Trem de releases sazonal
Em vez de tickets de suporte avulsos, há quatro releases de comércio planejáveis por ano, por exemplo para móveis de jardim, liquidação de verão, Black Week e Natal. Estão incluídos no contrato de manutenção, por release, um pequeno pacote de UX ou merchandising, testes de regressão e a manutenção técnica entre um release e outro. Isso dá ao cliente uma evolução visível e mantém o esforço agrupável para a agência de quatro pessoas.
- 6
O teste de fuga trimestral
Uma vez por trimestre, a agência disponibiliza uma exportação completa dos dados de produtos, clientes, pedidos e conteúdo e realiza, em um ambiente de teste neutro, uma retomada documentada. Paga-se, assim, justamente pela saída comprovada regularmente: a lista de acessos, o protocolo de restauração e o manual de transição pertencem ao cliente. Desse modo, o critério rígido de nenhum lock-in deixa de ser uma objeção e vira um argumento de venda incomum para o contrato de manutenção.
- 7
Carta de manutenção mais bolsa de crescimento
Como pequena mutação da Carta de manutenção pronta para a saída, as horas de alteração incluídas não são planejadas de forma fixa, mas remanejadas todo mês entre operação, qualidade dos dados e melhorias de conversão; o volume não usado passa adiante por no máximo um trimestre. Um board conjunto de 30 minutos decide sobre o uso com base em riscos e oportunidades de faturamento. O contrato de manutenção continua pronto para a saída, mas parece menos um seguro e mais uma equipe digital externa flexível.
- 8
Contrato de manutenção para sincronização do ERP e segurança do catálogo
A agência assume o monitoramento e a manutenção contínuos da interface entre o CSV do ERP local e a loja on-line. Importações de dados com erro, variantes de móveis ausentes ou preços errados são interceptados automaticamente antes de entrarem no ar. Isso tira por completo da equipe de 3 pessoas do cliente o peso operacional da manutenção dos dados.
- 9
Tarifa fixa de enriquecimento de dados de produtos com IA
Mutação da ideia da interface do ERP: a agência não só mantém a importação do CSV, mas também enriquece automaticamente os dados brutos, por meio de scripts de IA, com atributos estruturados, textos de SEO e indicações de prazo de entrega específicas da região DACH. Isso poupa ao cliente o esforço manual de manutenção e aumenta a visibilidade no mercado de móveis sem novas contratações na agência.
- 10
Contrato de manutenção com regressão visual baseada em CI/CD
Em vez de atualizações arriscadas em produção, a agência monta um pipeline de staging que verifica de forma automatizada, visual e funcionalmente, as atualizações mensais de plugins. O cliente recebe um relatório mensal de transparência e tempos de resposta garantidos em caso de falhas de segurança. Isso garante estabilidade absoluta sem as emergências de antes.
- 11
Polimento trimestral de conversão e UX
Além da manutenção básica, o contrato de manutenção inclui pacotes fixos de horas para otimizar funções do checkout e a exibição das variantes de móveis. A agência analisa todo mês o comportamento dos usuários na região DACH e implementa ajustes de alto retorno. Assim, o contrato deixa de ser um mero fator de custo e passa a impulsionar o faturamento.
- 12
Garantia de atualização segura e rollback instantâneo
Mutação do contrato de manutenção com CI/CD: o contrato se concentra exclusivamente em um SLA garantido de zero downtime, com restauração automatizada por snapshot em até 15 minutos em caso de incidentes. Isso responde diretamente ao medo do cliente depois dos dois incidentes de segurança, com esforço manual contínuo mínimo.
- 13
Pacote de crescimento com participação no faturamento em vez de orçamento fixo
Quebra a premissa flexível de um orçamento rígido de reconstrução única de EUR 25.000: os custos da reconstrução caem para EUR 10.000, atrelados a um contrato mensal de manutenção com uma pequena participação no faturamento adicional. Isso compensa porque o cliente reduz o risco do investimento e a agência participa diretamente do crescimento da loja de EUR 1,2 milhão.
- 14
Serviço de manutenção com arquitetura headless
Quebra a restrição flexível de uma configuração monolítica clássica (como o WooCommerce padrão): o front-end é desacoplado do back-end, de modo que falhas de segurança de plugins não podem mais atacar o site diretamente. Isso compensa porque as emergências são eliminadas estruturalmente e o cliente, graças à stack open source e ao acesso total ao Git, continua portátil a qualquer momento.
- 15
Relatório mensal de manutenção em uma página
Um relatório mensal de uma página com uptime, velocidade da página, atualizações aplicadas e incidentes evitados, para que o cliente veja pelo que o contrato de manutenção paga.
Tema: Ideias para uma padaria local conseguir mais encomendas de bolos personalizados pela sua nova página de pedidos on-line, sem anúncios pagos
Contexto enviado: Padaria com 6 funcionários em uma cidade alemã de 40.000 habitantes. Bolos personalizados e encomendas têm a melhor margem. Uma nova página de pedidos on-line (escolha do bolo, data de retirada, pagamento antecipado) entra no ar no mês que vem; até agora, os pedidos chegavam apenas por telefone e e-mail. O Perfil da Empresa no Google tem 4,7 estrelas com 120 avaliações. O dono tem pouco tempo, então as ideias precisam funcionar com no máximo 2 horas por semana. RESTRIÇÃO RÍGIDA: nenhuma publicidade paga neste trimestre. RESTRIÇÃO RÍGIDA: nenhum funcionário a mais.
- 1
O piloto automático anual de aniversários
No checkout, os clientes podem informar voluntariamente a ocasião e o mês para receber um lembrete no ano seguinte. Um e-mail automático 21 dias antes leva à página de pedidos já preenchida; assim, cada pedido gera um pedido futuro, sem prospecção contínua e com consentimento limpo.
- 2
Vagas reais para bolos em vez de posts genéricos
A página de pedidos mostra as vagas de produção que realmente restam nas próximas quatro semanas, por exemplo “Ainda é possível encomendar 2 bolos personalizados para sábado”. Um post semanal no Perfil da Empresa no Google leva diretamente a essa visualização; a atualização e o post levam juntos no máximo 20 minutos e criam uma urgência crível sem desconto.
- 3
O bolo viaja como seu próprio meio de divulgação
Cada bolo retirado recebe um pequeno cartão com “Encomende este bolo de novo ou personalize-o” e um QR code para a variante correspondente. O cartão fica à vista na hora de cortar o bolo, de modo que justamente os convidados presentes no aniversário ou no casamento descobrem o caminho para encomendar; um conjunto de cartões criado uma única vez quase não gera esforço semanal.
- 4
Consultoria de bolos única no lançamento
No primeiro sábado após a estreia, há durante quatro horas uma consultoria aberta de bolos: os visitantes escolhem sabor e estilo em cartões de amostra e depois fazem o pedido eles mesmos pelos QR codes disponíveis. Isso quebra deliberadamente a restrição flexível de no máximo duas horas de esforço nesta semana; o esforço extra compensa porque surgem ao mesmo tempo pedidos reais, problemas de uso observados e fotos e perguntas de clientes reutilizáveis — sem pessoal extra nem publicidade paga.
- 5
Parceiros de ocasião em vez de influenciadores
Espaços de recreação infantil, fotógrafos, floriculturas, locais de casamento e sedes de associações recebem cada um um pequeno display com QR code que leva a uma seleção de bolos pré-configurada para a sua ocasião. Em troca, a padaria cita esses parceiros em uma página local de recomendações; cinco contatos direcionados por mês bastam, sem comissões nem alcance pago.
- 6
Escala de bolos para escritórios e associações
Escritórios, consultórios e associações locais recebem uma página em que vários aniversários ou datas recorrentes podem ser reunidos e pagos antecipadamente, um após o outro. Escalas trimestrais configuradas uma vez transformam ocasiões avulsas em pedidos em série planejáveis; a abordagem pode ser limitada a duas organizações por semana.
- 7
Consultoria híbrida de bolos no tablet da loja
Quebra deliberadamente a restrição flexível 'Pedidos exclusivamente on-line', oferecendo às sextas-feiras 1 hora de consultoria na loja, em que os pedidos são digitados juntos no tablet. Compensa porque clientes indecisos e mais velhos são levados aos poucos ao novo sistema on-line.
- 8
As avaliações viram ajuda para decidir
Como pequena recombinação do material mais forte que já existe, doze frases marcantes das 120 avaliações no Google são associadas a estilos de bolo correspondentes, cada uma com um link direto para o pedido. Assim, as 4,7 estrelas não aparecem só como sinal de confiança, mas ajudam na escolha do produto; depois de configurada uma vez, a página quase não exige manutenção.
- 9
Displays com bolos de amostra e deep links para a loja on-line
Uma galeria física com fotos dos bolos mais bonitos na área de vendas traz em cada imagem um QR code específico que abre exatamente esse modelo de bolo já pré-selecionado na loja on-line. Mutação da ideia 1: ligação entre a exposição na loja física e um deep link direto na loja on-line.
- 10
Otimização do Perfil no Google e links de avaliação automatizados
O forte Perfil no Google (4,7 estrelas) ganha o botão oficial 'Pedir on-line' e recebe toda semana uma foto de bolos recentes. Na retirada, os clientes recebem por e-mail um modelo com link para a página de avaliação e de novo pedido. Leva menos de 30 minutos por semana.
- 11
Teaser com QR code em cupons fiscais e sacos de pão
Em todo cupom fiscal e nas embalagens é impresso um QR code chamativo que leva direto ao configurador de bolos on-line ('Planeje on-line o bolo dos sonhos para a sua festa'). Isso transforma a clientela de passagem do dia a dia em clientes de encomenda digital, sem esforço extra no balcão.
- 12
Parceria B2B com espaços de eventos locais
Displays e folhetos com um código de reserva direto para o site são colocados em restaurantes locais, celeiros para eventos e com organizadores de casamento. Os clientes que vão comemorar reservam o bolo direto on-line, enquanto o local recebe uma pequena compensação ou uma recomendação em troca.
- 13
Calendário de aniversários para creches e escolas
Cooperação com jardins de infância locais por meio de folhetos informativos para os conselhos de pais, com um código de desconto fixo para bolos temáticos infantis. Mutação da ideia 3: em vez de parceiros B2B genéricos, a ocasião de alta frequência aniversário infantil é abordada de forma direcionada e automatizada.
- 14
Mini-workshop mensal de bolos temáticos
Quebra deliberadamente a restrição flexível 'no máximo 2 horas de esforço por semana', já que uma vez por mês acontece um workshop de 4 horas. Compensa porque os participantes atuam como embaixadores da marca, produzem conteúdo entusiasmado para as redes sociais e, com certeza, fazem novos pedidos pela loja on-line.
- 15
Link de pedido em cada caixa de bolo
Imprimir nas caixas de bolo e nos cupons fiscais um QR code para a página de pedidos, para que todo cliente que já compra um bolo possa encomendar de novo para o próximo aniversário sem precisar ligar.
Nota do Kirat para o Claude: A melhor ideia de quebra de regras só ficou em 4º lugar: "Consultoria de bolos única no lançamento" — ela quebra deliberadamente uma restrição flexível. Construa uma vez a versão mais forte dela antes de descartá-la.
Tema: Ideias para reduzir em até dois trimestres os incidentes em produção causados pelo módulo de cobrança, sem extraí-lo para um serviço separado
Contexto enviado: Equipe de 8 engenheiros. Um monólito em TypeScript, cerca de 60.000 linhas, um banco de dados Postgres, com deploys várias vezes por dia. O módulo de cobrança muda toda semana e causou 5 dos últimos 8 incidentes em produção, principalmente porque outros módulos leem e gravam diretamente nas tabelas de cobrança. Ninguém na equipe já operou um sistema distribuído em produção. A liderança quer menos incidentes em até dois trimestres. RESTRIÇÃO RÍGIDA: nenhuma reescrita do módulo de cobrança. RESTRIÇÃO RÍGIDA: o trabalho em funcionalidades da cobrança continua toda semana.
- 1
Firewall de banco de dados em torno das tabelas de cobrança
Criar roles separadas do Postgres para os caminhos de código de cobrança e de não cobrança do monólito e, em seguida, revogar da role geral da aplicação as gravações diretas nas tabelas de cobrança. Encaminhar todas as mutações por um pequeno conjunto de stored procedures ou funções de transação revisadas, adicionando primeiro um log de auditoria temporário para descobrir e migrar os chamadores sem parar o trabalho semanal em funcionalidades.
- 2
Invariantes financeiras executáveis
Codificar uma lista curta de invariantes — como faturas finalizadas imutáveis, lançamentos contábeis balanceados, criação idempotente de cobranças e transições de estado válidas — como constraints do banco de dados onde for seguro, e como sondas agendadas em produção onde não for. Rodar as mesmas sondas no CI contra fixtures anonimizadas com o formato da produção, transformando o conhecimento dos incidentes em alarmes permanentes em vez de uma ampliação ampla dos testes.
- 3
Replay de incidentes como prova de fogo do release
Converter os cinco incidentes de cobrança em cenários determinísticos de replay, usando formatos de consulta capturados e linhas sanitizadas, e então exigir que toda mudança na cobrança sobreviva a eles. Adicionar testes generativos que permutam retries, eventos duplicados, ordem das transações e falhas parciais em torno exatamente desses cenários, mirando a vizinhança das falhas em vez de tentar uma cobertura exaustiva do monólito.
- 4
Impor a fronteira da cobrança em modo sombra
Como mutação de menor risco do firewall de banco de dados, manter inicialmente as permissões atuais, mas registrar em log toda consulta que toca tabelas de cobrança, com seu módulo, ponto de chamada e ID da transação. Após quatro semanas, transformar gravações inesperadas em falhas no CI e depois em erros em produção, módulo a módulo; isso substitui uma troca imediata de permissões por uma imposição em etapas.
- 5
Painel de controle do raio de impacto da cobrança
Colocar os comportamentos arriscados da cobrança — não o módulo inteiro — atrás de kill switches no servidor e de rollouts percentuais, com dashboards ligados a anomalias de faturas, pagamentos e conciliação. Cada funcionalidade semanal é entregue com um caminho de desligamento testado, para que quem responde aos incidentes possa desativar o novo comportamento sem reverter deploys não relacionados do monólito nem desfazer migrações de schema.
- 6
Encapsulamento em schema do Postgres e Row Level Security
Isole as tabelas de cobrança em um schema próprio do Postgres (billing.*) e retire das outras roles do banco de dados o acesso direto de escrita e de leitura. Os módulos só as acessam por meio de views SQL definidas ou de interfaces armazenadas. Isso elimina a principal causa dos incidentes diretamente no nível do banco de dados.
- 7
Contract testing e pipeline sombra para releases da cobrança
Estabeleça consumer-driven contract tests automatizados para todas as interfaces da cobrança no pipeline de CI. Complementarmente, as mudanças na cobrança em cálculos críticos rodam em produção em modo sombra, sem efeitos colaterais, com verificação automática de diferenças.
- 8
Um segundo banco de dados como instrumento de segurança
Quebrar deliberadamente a premissa flexível de “um banco de dados Postgres” adicionando um banco de dados sombra somente leitura, alimentado por replicação lógica, mantendo a cobrança dentro do monólito e o primário como único escritor. Rodar as novas leituras da cobrança e as verificações de conciliação nos dois bancos de dados, comparar os resultados antes da exposição e usar o banco sombra para consultas forenses, de modo que o diagnóstico de incidentes não possa sobrecarregar nem alterar acidentalmente a produção.
- 9
Linting estrito de fronteiras de módulos e fachada de API pública
Introduza um linting de arquitetura via dependency-cruiser que proíba, na etapa de build, imports diretos de partes internas da cobrança em outros módulos. A comunicação só pode acontecer por uma única interface BillingFacade com tipagem segura, para bloquear de imediato acoplamentos que se infiltram aos poucos.
- 10
Passaportes de mudança da cobrança
Exigir que todo pull request relacionado à cobrança traga um passaporte verificado por máquina: tabelas afetadas, invariantes, compatibilidade de migração, caminho de rollback e uma consulta em produção que comprove a saúde após o deploy. Um gate de CODEOWNERS mais uma revisão de 15 minutos por um responsável de cobrança em rodízio mantém o processo leve o bastante para mudanças semanais, concentrando o escrutínio nos efeitos entre módulos.
- 11
Views somente leitura do Postgres geradas automaticamente para módulos externos
Uma mutação do encapsulamento em schema: em vez de refatorações trabalhosas de API, são disponibilizadas automaticamente views do Postgres protegidas contra escrita para consultas externas. Os módulos externos leem apenas essas views estáveis, enquanto os acessos diretos às tabelas são bloqueados por permissões do banco de dados.
- 12
Event bus assíncrono in-process para read models
Em vez de os módulos externos consultarem diretamente as tabelas de cobrança, o módulo de cobrança envia eventos em memória quando há mudanças de estado. Os módulos receptores constroem suas próprias projeções locais. Isso desacopla totalmente os acessos de leitura das tabelas de cobrança sem introduzir sistemas distribuídos.
- 13
Congelamento de funcionalidades de duas semanas para encapsular a cobrança
Quebra, por exatamente duas semanas, a restrição flexível da entrega contínua e semanal de funcionalidades. A equipe inteira se concentra em desfazer os acoplamentos no banco de dados. O esforço único cria a base para reduzir de forma duradoura o número de incidentes nos 5 meses restantes.
- 14
Uma role de banco de dados por módulo
Dar à cobrança um schema e uma role próprios no Postgres e revogar o acesso de escrita dos outros módulos às tabelas de cobrança, para que gravações diretas falhem no staging antes de chegarem à produção.
- 15
Particionamento físico do banco de dados em uma segunda instância do Postgres
Quebra a restrição flexível da arquitetura de um único banco de dados, mas mantém o código monolítico. Os dados de cobrança migram para uma instância de banco de dados própria, o que torna tecnicamente impossíveis os joins SQL entre os domínios. A complexidade operacional continua mínima, já que o código continua monolítico.
Nota do Kirat para o Claude: A melhor ideia de quebra de regras só ficou em 8º lugar: "Um segundo banco de dados como instrumento de segurança" — ela quebra deliberadamente uma restrição flexível. Construa uma vez a versão mais forte dela antes de descartá-la.
Tema: Ideias para reduzir o tempo de equipe da triagem por título e resumo de cerca de 3.000 registros sem enfraquecer o rigor de uma revisão sistemática
Contexto enviado: Revisão sistemática em pesquisa em serviços de saúde, com publicação planejada. Protocolo atual: dois revisores humanos independentes, com conflitos resolvidos por discussão. O tempo da equipe é curto. Os pareceristas da revista vão perguntar como a triagem foi feita. Deixar de fora um estudo relevante (falsa exclusão) é pior do que incluir um irrelevante. RESTRIÇÃO RÍGIDA: o método precisa poder ser relatado conforme o PRISMA 2020. RESTRIÇÃO RÍGIDA: a taxa de falsas exclusões não pode aumentar.
- 1
Barreira de exclusão com dois humanos
O revisor A faz a triagem de todos os registros, mas as inclusões e as decisões incertas de A seguem diretamente adiante; o revisor B avalia de forma independente apenas as exclusões propostas por A. Um registro só é excluído quando os dois humanos o excluem de forma independente, e toda discordância avança automaticamente, eliminando a maior parte das discussões de conflitos. Isso quebra deliberadamente a premissa flexível do protocolo atual de que dois humanos precisam avaliar todos os registros; compensa porque poupa tempo de triagem e, estruturalmente, permite mais falsas inclusões, mas nenhuma falsa exclusão adicional, e é simples de descrever na seção do processo de seleção do PRISMA.
- 2
Sprint de calibração com um registro de casos-limite
Fazer a triagem dupla independente de um primeiro lote estratificado, resolver os conflitos e transformar ambiguidades recorrentes em regras operacionais curtas, com exemplos positivos e negativos. Travar as regras antes de continuar; manter as decisões do piloto apenas se os critérios de elegibilidade não tiverem mudado, caso contrário refazer a triagem delas. Isso preserva a triagem dupla independente e reduz o tempo posterior de deliberação e de resolução de conflitos, e a calibração pode ser relatada conforme o PRISMA.
- 3
Console binário rápido, não uma extração de dados em miniatura
Dar aos dois revisores uma interface cega, operada pelo teclado, limitada a incluir, excluir ou incerto, com o título e o resumo completos sempre visíveis; deixar a codificação detalhada e os motivos de exclusão para a revisão do texto completo. O PRISMA 2020 não exige motivos por registro na etapa de título e resumo. O processo de decisão continua inalterado, mas cai o tempo evitável de leitura, cliques e documentação.
- 4
Válvula de liberação por máquina, só para inclusão
Como mutação de um passo da barreira de exclusão com dois humanos, passar as exclusões propostas por A por um classificador validado que só pode liberar registros para inclusão, nunca excluí-los; o revisor B faz de forma independente a triagem de tudo o que o classificador não libera. A exclusão final continua exigindo decisões concordantes de dois humanos, então um erro da máquina pode acrescentar textos completos, mas não pode criar uma falsa exclusão. Relatar conforme o PRISMA o modelo, a versão, as entradas, os limiares, a validação e seu papel estritamente restrito à inclusão.
- 5
Triagem assimétrica das exclusões
Um primeiro revisor classifica por completo todos os 3.000 registros. O segundo revisor verifica exclusivamente os registros que o primeiro excluiu, para interceptar falsos negativos (as inclusões são aceitas diretamente). Isso quase reduz à metade o esforço do segundo revisor, mantém extremamente baixo o risco de falsas exclusões e cumpre todas as exigências do PRISMA.
- 6
Pular a triagem para estratos de alto rendimento
Declarar previamente subconjuntos de alto rendimento — como registros de um bloco de busca altamente específico, descendentes diretos de estudos sabidamente elegíveis ou registros já incluídos em uma revisão muito próxima — e enviá-los todos diretamente para a obtenção do texto completo, sem decisões de título e resumo. Isso quebra deliberadamente o protocolo flexível de dois revisores para esses registros, mas não pode aumentar as falsas exclusões, porque nada no subconjunto é excluído; a contrapartida é trabalho adicional com textos completos. Relatar explicitamente a regra de desvio e as contagens resultantes no fluxograma PRISMA e nos métodos de seleção.
- 7
Triagem priorizada via active learning
Os dois revisores humanos usam uma ferramenta de active learning (como o ASReview) que coloca os títulos/resumos relevantes no início. Assim que um critério de parada estatisticamente validado é atingido (p. ex. 500 registros irrelevantes seguidos), a triagem é encerrada. O procedimento poupa até 70% do tempo, pode ser documentado conforme o PRISMA 2020 e, pela calibração do algoritmo, mantém uma taxa mínima de falsas exclusões.
- 8
Deduplicação apenas exata antes da triagem
Remover apenas registros comprovadamente idênticos por DOI, número de acesso na base de dados ou correspondência bibliográfica normalizada exata; manter a cópia com os metadados mais ricos e apenas sinalizar quase duplicatas incertas. Em seguida, os dois revisores fazem de forma independente a triagem de todos os registros únicos restantes, enquanto o PRISMA relata as duplicatas removidas antes da triagem. Isso reduz o volume sem criar um caminho para excluir um estudo único.
- 9
Cascata humano-IA com rede de segurança de IA
Uma mutação da triagem assimétrica das exclusões: um revisor humano processa sozinho todos os registros, enquanto um modelo de IA ajustado para sensibilidade máxima verifica exclusivamente as exclusões humanas. Só em caso de discrepâncias um segundo humano revisa. Isso reduz a capacidade humana em mais de 50%, com cobertura completa.
- 10
Segundo revisor de IA totalmente automático
Quebra a restrição flexível de que obrigatoriamente duas pessoas humanas façam a triagem. Um large language model (LLM) assume o papel do segundo revisor independente, com prompting de zero falsos negativos. Compensa porque o tempo de trabalho humano cai pela metade e os LLMs comprovadamente alcançam altas taxas de recall na triagem de resumos; o PRISMA 2020 permite explicitamente a indicação de ferramentas de IA.
- 11
Triagem simples adaptada ao risco com classificação por confiança
Quebra a restrição flexível da triagem dupla contínua para todo o conjunto de dados. Quando o primeiro revisor indica uma alta confiança subjetiva e há motivos claros de exclusão, dispensa-se o segundo revisor; só os casos incertos vão para a triagem dupla. Isso poupa até 60% do tempo da equipe, enquanto o risco de estudos perdidos continua mínimo graças à concentração dos recursos nas zonas cinzentas.
- 12
Primeiro uma rodada de calibração
Os dois revisores fazem a triagem dos mesmos 100 registros, discutem cada conflito e afinam os critérios de elegibilidade antes da rodada principal, para que os conflitos e as releituras posteriores diminuam.
- 13
Triagem-relâmpago binarizada com pré-classificação por IA
Mutação da priorização por active learning: a equipe usa uma interface simplificada para avaliação rápida (apenas cliques para 'Inclusão/Incerto' vs. 'Exclusão'). Um modelo de IA avalia as incertezas em segundo plano e manda apenas os casos duvidosos para a verificação dupla aprofundada. Minimiza drasticamente a carga cognitiva e o tempo de leitura por resumo.
- 14
Pré-filtragem determinística via algoritmos de correspondência
Filtros de busca e scripts conservadores separam previamente os registros claramente inadequados (p. ex. desenho de estudo errado ou população não humana). Os dois revisores verificam essas exclusões automatizadas apenas por meio de uma amostra representativa (p. ex. 10%). Isso reduz o volume total a ser triado manualmente em conformidade com o PRISMA e sem perda de sensibilidade.
Todas as ideias, completas e em ordem de classificação. A ideia do próprio Claude participa anonimamente e em pé de igualdade. Tema e contexto foram enviados em inglês, e as ideias foram escritas em inglês ou alemão; todos esses textos aparecem aqui traduzidos.
Cinco títulos de áreas diferentes. Cada membro escreve uma variante, o rascunho do Claude participa, e os dois membros avaliam as três anonimamente. Escolha um.
Briefing: Título para a página de preços de uma pequena ferramenta de faturamento para freelancers (USD 19 por mês, período de teste gratuito de 14 dias). Público: freelancers que hoje fazem suas faturas no Word ou no Excel. Objetivo: fazer o período de teste parecer sem risco e valer a pena. Formato: um título, em inglês.
Critérios: no máx. 8 palavras · concreto, sem superlativos · menciona o tempo poupado ou o recebimento do pagamento · sem pontos de exclamação
- 1
"Get paid without Word—free for 14 days"
Fala diretamente com quem usa o Word, destaca o recebimento do pagamento e torna concreto o teste sem risco.
- 2
"Send invoices in minutes. Get paid on time."
O rascunho do próprio orquestrador.
- 3
"Replace Word and Excel. Get paid days faster."
Falar diretamente do fluxo de trabalho manual atual oferece um contraste imediato e apresenta o teste como um upgrade rápido e sem risco para o fluxo de caixa, sem usar exageros genéricos.
Briefing: Título para a landing page de uma pequena agência digital sobre reconstruções de lojas para varejistas de móveis que usam WooCommerce. Público: donos de lojas de móveis de médio porte sem desenvolvedores internos. Objetivo: agendar uma verificação gratuita da loja. Formato: um título, mercado alemão, mas escreva em inglês.
Critérios: no máx. 10 palavras · nomeia a dor do leitor, não a agência · sem jargão como "headless" ou "omnichannel" · sem superlativos
- 1
"Losing furniture buyers to a slow, frustrating WooCommerce store?"
Mira diretamente a principal frustração do dono — vendas perdidas por causa do mau desempenho da loja — sem usar jargão técnico nem uma linguagem de agência autoelogiosa.
- 2
"Is your WooCommerce shop turning furniture buyers away?"
Nomeia diretamente a dor central e fala com varejistas de móveis sem jargão.
- 3
"Fewer shop emergencies, more time for your furniture."
O rascunho do próprio orquestrador.
Briefing: Título para a nova página de pedidos on-line de bolos personalizados da padaria. Público: clientes locais que até agora encomendavam por telefone. Objetivo: fazer o pedido on-line parecer fácil e pessoal. Formato: um título, mercado alemão, mas escreva em inglês.
Critérios: no máx. 8 palavras · concreto, sem superlativos · menciona a retirada ou a ocasião · soa como uma padaria local, não como uma rede
- 1
"Your celebration cake, baked here for pickup."
Caloroso, concreto e pessoal: “baked here” soa local, enquanto “for pickup” faz o processo on-line parecer simples.
- 2
"Order your custom birthday cake, pick up fresh."
O título cita concretamente a ocasião e a retirada e, com a promessa de frescor, transmite qualidade artesanal local sem frases feitas impessoais.
- 3
"Your cake, your date. Order in two minutes."
O rascunho do próprio orquestrador.
Briefing: Título para uma proposta interna de engenharia: reforçar as fronteiras do módulo de cobrança dentro do monólito antes de considerar um serviço separado. Público: 8 engenheiros e a liderança, que quer menos incidentes. Objetivo: fazer a proposta ser lida e aprovada. Formato: um título, em inglês.
Critérios: no máx. 10 palavras · declara a decisão, não só o tema · sem chavões · compreensível para quem não é engenheiro
- 1
"Fix billing's boundaries first, split it later if needed"
O rascunho do próprio orquestrador.
- 2
"Keep Billing Together, but Isolate It to Prevent Incidents"
O título declara a decisão de manter a cobrança no monólito enquanto suas fronteiras são reforçadas, e liga essa escolha ao objetivo comum de ter menos incidentes.
- 3
"Strengthen Billing Boundaries in Current App Before Splitting Service"
O título toma uma decisão de direção inequívoca, evita jargão técnico desnecessário como 'monólito' para a gestão e aborda diretamente o objetivo comum da estabilidade.
Briefing: Título para um artigo de métodos sobre o uso de um LLM como revisor adicional em uma revisão sistemática em pesquisa em serviços de saúde. Público: pesquisadores e pareceristas de revistas. Objetivo: preciso e citável, sem exageros. Formato: um título, que pode incluir um subtítulo depois de dois-pontos, em inglês.
Critérios: no máx. 20 palavras · nomeia o método e o contexto · nenhuma afirmação além dos dados · sem palavras exageradas como "revolucionar"
- 1
"Large Language Model–Assisted Study Selection in Health Services Research: A Method for Additional Screening in Systematic Reviews"
O título identifica o método de triagem, o contexto de revisão sistemática e o campo da pesquisa em serviços de saúde, sem sugerir desempenho ou benefício.
- 2
"An LLM as additional screener: a prospective comparison in a health services systematic review"
O rascunho do próprio orquestrador.
- 3
"Large Language Models as Auxiliary Screeners in Health Services Research Systematic Reviews: A Methodological Evaluation"
O título nomeia com precisão a área de aplicação e a metodologia, dispensa palavras de efeito e escolhe um tom objetivo e citável para um ambiente de publicação científica.
Os títulos aparecem como foram escritos, em inglês, como os briefings pediam. O raciocínio na entrada do Claude é o rótulo que o próprio Kirat lhe dá. Briefings e critérios foram enviados em inglês, e as justificativas foram escritas em inglês ou alemão; todos esses textos aparecem aqui traduzidos.
Cinco briefings de imagem de áreas diferentes. A OpenAI e o Google geram uma imagem cada, e os dois membros avaliam as duas imagens anonimamente. Escolha um.
Briefing: Imagem de destaque para a landing page de uma pequena ferramenta de faturamento para freelancers: uma mesa de home office arrumada pela manhã, com um laptop (tela virada para o outro lado ou desfocada, nenhuma interface legível), uma xícara de café e um caderno de papel. Luz natural do dia, estilo de foto documental tranquilo, sem texto, sem logotipos, sem rostos de pessoas.
Critérios: parece o espaço de trabalho real de um freelancer, não um escritório de banco de imagens · tranquila e sem bagunça · deixa um espaço tranquilo para um título · nenhum texto, logotipo ou tela legível
gpt-5.6 · 9/10 Espaço de trabalho de home office muito tranquilo e crível, com luz natural da manhã, tela virada para o outro lado e muita parede livre para um título. Parece um pouco encenado, mas cumpre o briefing quase por completo.
gemini-3.6-flash · 9/10 Atmosfera muito clara, com luz natural da manhã. O laptop virado para o outro lado resolve perfeitamente o problema da tela, sem efeito artificial de desfoque. A parede clara oferece um espaço ideal para texto.
gpt-5.6 · 6/10 Aconchegante e autêntico, com a tela desfocada, mas há texto claramente visível no caderno e anotações à mão na imagem. Além disso, a composição é mais cheia e oferece menos espaço tranquilo para o título.
gemini-3.6-flash · 7/10 Montagem muito aconchegante e realista. Porém, a tela suavizada artificialmente chama um pouco a atenção, e a composição como um todo oferece um pouco menos de espaço tranquilo para um título.
Briefing: Foto de produto para uma loja on-line de móveis: uma mesa de jantar de carvalho maciço com quatro cadeiras em uma sala de estar centro-europeia clara e com aparência real. Luz natural do dia, estilo editorial de interiores, sem texto, sem logotipos, sem pessoas.
Critérios: a mesa é claramente o tema principal · textura e cor da madeira fiéis à realidade · parece uma casa real, não um render 3D · nenhum texto ou logotipo
gpt-5.6 · 9/10 Ambiente residencial centro-europeu claro e muito crível, com luz natural do dia, quatro cadeiras e estrutura de carvalho realista; a decoração um tanto abundante desvia minimamente a atenção da mesa.
gemini-3.6-flash · 9/10 Atmosfera aconchegante muito bem-sucedida, com luz do dia autêntica e veios de madeira realistas. Cumpre todas as exigências de forma excelente.
gpt-5.6 · 8/10 A mesa de carvalho maciço está claramente em destaque, há quatro cadeiras, e a cor e os veios da madeira são convincentes; no conjunto, porém, a imagem é um pouco impecável demais e lembra levemente um render.
gemini-3.6-flash · 9/10 A mesa de jantar está claramente em foco, o carvalho e as texturas parecem extremamente naturais e fotorrealistas. Estilo editorial perfeito para a loja on-line.
Briefing: Imagem de destaque para a nova página de pedidos on-line de bolos personalizados de uma pequena padaria local: um bolo de aniversário pronto sobre um balcão de madeira, em uma padaria familiar clara e com aparência real, pronto para a retirada em uma caixa de papelão simples para bolo. Luz natural do dia, estilo de foto documental, sem texto, sem logotipos, sem rostos de pessoas.
Critérios: parece uma padaria local real, não uma rede nem uma foto de banco de imagens · o bolo é claramente o tema principal · deixa um espaço tranquilo para um título · nenhum texto ou logotipo na imagem
gpt-5.6 · 8/10 Bolo como tema principal inequívoco, caixa de papelão simples, luz natural do dia e um ambiente plausível de padaria local. Nenhum texto ou logotipo visível; a superfície tranquila da tampa serve para um título, ainda que a imagem pareça um tanto encenada demais.
gemini-3.6-flash · 9/10 Cumpre o briefing de forma ideal: totalmente livre de texto e logotipos, o bolo está claramente em foco, luz natural clara e uma atmosfera muito autêntica. A tampa aberta da caixa de papelão oferece uma superfície tranquila ideal para títulos.
gpt-5.6 · 4/10 Bolo e caixa de retirada estão claramente encenados, a padaria artesanal parece crível. Viola, porém, claramente o “no text”: inscrição no topper do bolo, quadros de cardápio e cupom fiscal; além disso, falta uma superfície tranquila para o título.
gemini-3.6-flash · 3/10 Viola a exigência rígida 'nenhum texto na imagem' com o topper 'HAPPY BIRTHDAY' e os quadros com inscrições ao fundo. O fundo também está um pouco agitado demais.
Briefing: Imagem de capa para um post interno do blog de engenharia sobre desembaraçar um módulo de cobrança de um monólito: uma ilustração abstrata e tranquila de um bloco claramente delimitado, separado de um aglomerado denso de blocos interligados. Estilo flat, cores suaves, sem texto, sem logotipos.
Critérios: a ideia de uma fronteira clara é legível à primeira vista · tranquila, não dramática · funciona em tamanho pequeno · nenhum texto ou logotipo
gpt-5.6 · 9/10 A unidade isolada com contorno tracejado é reconhecível de imediato e se contrapõe claramente ao aglomerado denso e interligado de blocos. Paleta de cores tranquila e suave; boa legibilidade também em tamanho pequeno. Leve sombreamento espacial em vez de um estilo flat consistente.
gemini-3.6-flash · 7/10 Boa representação do bloco isolado com fronteira tracejada, estilo tranquilo e legibilidade clara também em visualização pequena.
gpt-5.6 · 6/10 O elemento separado e a trama complexa transmitem, em princípio, o desacoplamento, mas a fronteira parece mais a moldura de uma tela do que uma fronteira de módulo claramente definida. O aglomerado é muito fragmentado e perde legibilidade em tamanho pequeno; no conjunto, ainda assim, tranquila e sem logotipos nem texto legível.
gemini-3.6-flash · 4/10 O foco está na tela de um tablet em vez de em um bloco separado, e o emaranhado parece menos estruturado.
Briefing: Imagem de capa para uma palestra em congresso sobre triagem assistida por IA em revisões sistemáticas: uma pilha arrumada de resumos de pesquisa impressos sobre uma mesa, alguns separados em duas bandejas, luz do dia suave, estilo de foto documental. Nenhum texto legível, sem logotipos, sem rostos de pessoas.
Critérios: séria e científica, sem exageros · sem robôs nem cérebros brilhando · a ideia de separação é visível · nenhum texto legível ou logotipo
gpt-5.6 · 9/10 Cena de mesa de trabalho séria e documental, com luz do dia suave; duas bandejas e abas coloridas transmitem claramente a separação. Nenhum logotipo nem texto claramente legível, nenhuma pessoa.
gemini-3.6-flash · 9/10 Muito bem executado. Alta qualidade fotográfica em estilo documental, o conceito de separação com pilhas e bandejas é claramente compreensível, sem texto legível nem rostos.
gpt-5.6 · 5/10 O contexto de trabalho científico e a separação são bem reconhecíveis. Os rótulos legíveis das bandejas violam, porém, a exigência “nenhum texto legível”; além disso, ao fundo aparece uma pessoa com o rosto reconhecível, ainda que desfocado.
gemini-3.6-flash · 4/10 O motivo serve em princípio, mas ao fundo há uma pessoa/um rosto visível, e as bandejas contêm texto com erros, em parte legível (INCLVDED/EACLVDED).
Imagens geradas por IA, reduzidas e sem nenhuma outra edição. Os custos marcados com ≈ vêm de execuções que rodaram em paralelo: o custo de imagem de cada execução mais uma parte igual das chamadas de avaliação. A classificação é uma pré-seleção, e a escolha final continua sendo sua. Briefings e critérios foram enviados em inglês, e as avaliações foram escritas em alemão; todos esses textos aparecem aqui traduzidos.
Duas chaves, uma instalação, uma pergunta.
O Kirat não é um serviço em que você se cadastra. Ele roda no seu computador (ou no seu próprio ambiente de nuvem do Claude Code), dentro do Claude, com as suas próprias chaves de API. Não existe servidor do Kirat nem conta conosco. Tudo o que você fornece ao Kirat vai diretamente para a OpenAI e o Google, nas suas contas — a partir do seu computador ou, nas sessões na nuvem do Claude Code, a partir do seu próprio ambiente de nuvem, pelo proxy de rede da Anthropic para esse ambiente. Nunca vemos as suas chaves nem as suas perguntas.
Duas chaves de API
Uma chave de API da OpenAI e uma chave de API do Google Gemini, ambas com faturamento ativado. O que leva tempo aqui são os formulários de cadastro e de faturamento dos provedores. Um projeto separado no provedor, com limite de gastos, é uma boa ideia.
Já tem as duas chaves? Vá para o passo 2.
Instalar
Claude Desktop: descompacte o download. Abra Settings → Extensions → Advanced settings → Install Extension… e escolha o arquivo .mcpb. Informe as duas chaves na caixa de diálogo. O Desktop traz seu próprio Node, então não há mais nada a instalar.
Claude Code: descompacte o download e mova a pasta extraída kirat para a sua pasta pessoal, de modo que ~/kirat/claude-code exista. Depois execute os comandos abaixo. Requer Node.js 20 ou superior.
Sessões na nuvem do Claude Code: uma configuração única do seu ambiente de nuvem, com limitações — veja abaixo.
Perguntar
Verifique a instalação: Use a extensão Kirat e chame kirat_status.
Depois faça uma pergunta real: Pergunte ao conselho do Kirat: Postgres ou SQLite? Dê também a sua própria posição.
# no Claude Code, depois que ~/kirat/claude-code existir /plugin marketplace add ~/kirat/claude-code /plugin install kirat@kirat # informe as duas chaves quando solicitado; para alterá-las depois: /plugin configure kirat@kirat
O Claude Desktop avisará que a extensão não é verificada pela Anthropic. Esse aviso é esperado para toda extensão instalada a partir de um arquivo — veja as perguntas frequentes.
Verifique isto antes de comprar.
O Kirat é um programa, não um serviço. Ele só funciona onde o Claude executa ferramentas em uma máquina que tenha o Kirat instalado: o seu computador, uma máquina remota via SSH ou um ambiente de nuvem do Claude Code que você configura uma vez.
Funciona em
- Chats do Claude Desktop no macOS e no Windows Usa a extensão
.mcpb. - Claude Code em um terminal ou no VS Code Usa o plugin do Claude Code. Requer Node.js 20 ou superior; para instalá-lo, é preciso usar uma vez a ferramenta de linha de comando
claude. - Sessões locais na aba Code do Claude Desktop Também com o plugin do Claude Code. A extensão
.mcpbfoi feita para chats, não para sessões da aba Code. - Sessões SSH O plugin, instalado na máquina remota.
- Sessões na nuvem do Claude Code — com limitações, com uma configuração única do ambiente de nuvem Sessões na nuvem da aba Code, Claude Code na web ou no app para celular. Uma vez por ambiente de nuvem:
- Cole o bloco do download (
cloud/setup.sh) no início do script de configuração do ambiente. - Adicione suas duas chaves como variáveis de ambiente. Recomendamos os nomes
KIRAT_OPENAI_API_KEYeKIRAT_GEMINI_API_KEY: eles não conflitam com aOPENAI_API_KEYdo próprio projeto. O Kirat também aceitaOPENAI_API_KEYeGEMINI_API_KEY. - Acesso à rede: se estiver em Full, não há nada a mudar. Caso contrário, defina como Custom (em apps mais recentes: Limited) com a lista padrão de gerenciadores de pacotes, mais
api.openai.come o host de download do Kirat.
- Cole o bloco do download (
Não funciona em
- Chat no navegador (claude.ai)
- Chat nos apps do Claude para celular O Claude Code no app para celular roda como sessão na nuvem; isso funciona com a configuração para a nuvem.
- Tarefas do Cowork executadas na nuvem
- Redes no seu próprio computador que exigem um proxy HTTP Os ambientes de nuvem do Claude Code funcionam.
- Organizações que restringem as extensões do Desktop a uma lista de permissões Instalações manuais ficam bloqueadas; fale com o seu administrador.
Limitações da nuvem — verifique antes de comprar
- Todos que usam o ambiente podem ler suas variáveis de ambiente — inclusive as suas duas chaves. Não compartilhe o ambiente com pessoas que não devem usá-las.
- O orçamento diário é contado por sessão. Cada sessão na nuvem começa do zero, então o orçamento diário do Kirat é contado por sessão, e não somando todas as suas sessões do dia. Defina limites de gastos na OpenAI e no Google: na nuvem, eles são o seu teto real.
- Tarefas em segundo plano e resultados recentes terminam com a sessão. Eles se perdem quando a máquina da sessão é encerrada.
- Dois hosts a liberar. Além de
api.openai.com, o acesso à rede do ambiente precisa permitir o host de download do Kirat (o Gemini já está coberto pela lista padrão). - Uma configuração que falhou pode ficar em cache. Se a configuração falhar, a sessão ainda inicia, só que sem o Kirat — e o estado de falha pode ficar em cache para novas sessões até você editar o script de configuração (qualquer alteração faz com que novas sessões o executem de novo).
Por que a extensão nunca chega a uma sessão na nuvem: as sessões na nuvem rodam nos servidores da Anthropic, em um ambiente de nuvem, e não conseguem acessar um programa no seu computador — mesmo que o Claude Desktop mostre o Kirat como ativado em “+ → Connectors” nessa sessão. Uma sessão na nuvem só tem o Kirat se o seu ambiente de nuvem tiver a configuração do Kirat.
Que tipo de sessão da aba Code é essa? O seletor de ambiente na caixa de prompt mostra isso: Local, SSH, WSL ou o nome de um ambiente de nuvem. Sessões Local e SSH usam o plugin; um ambiente de nuvem precisa da configuração para a nuvem.
Não testado: sessões WSL e tarefas locais do Cowork.
Este quadro existe porque o conselho pediu. Quando votou, em 8 de outubro de 2026, para lançar o Kirat como extensão para desktop, uma de suas condições foi que essas limitações ficassem claramente visíveis antes da compra. Veja a decisão. Quando, mais tarde, votou para dar suporte às sessões na nuvem do Claude Code, impôs a mesma condição para as limitações da nuvem.
Guarde os comprovantes.
Qualquer um pode afirmar que um conselho funciona. Estas são sessões reais do conselho sobre o próprio Kirat, medições de execuções em produção e as falhas que mudaram o design.
Decisão histórica, agosto de 2026. Esta votação tratava do plano anterior: vender o Kirat como manual de construção. Esse plano mudou depois, e a divergência abaixo moldou o que veio a seguir.
Um membro votou contra vender o produto de qualquer forma. Seu raciocínio ficou registrado, e a divergência moldou o que veio a seguir: o Kirat agora é uma extensão pronta para instalar, não um manual de construção. É para isso que serve um conselho — você recebe a objeção, não só o veredito.
| Medição | Valor |
|---|---|
| Vazão mediana de saída | gpt-5.6 ≈ 48 tok/s gemini-3.6-flash ≈ 196 tok/s |
| Parcela de raciocínio em uma chamada generativa do gpt-5.6 | ≈ 90% |
| Custo de uma decisão do conselho | $0.02–$0.15 |
| Tempo real de uma decisão | 8 s – 3 min |
Geração de imagens (kirat_image) | cerca de $0.05–$0.15 por chamada |
| Todas as sessões documentadas de decisões sobre o produto | menos de $0.70 no total |
| Testes automatizados | 256, executados sem acesso à rede |
MÉTODO — vazão medida em ago. de 2026 contra as APIs em produção a partir de um único contêiner na UE: mediana de tokens de saída por segundo em execuções de produção, não um benchmark sintético. O custo por decisão depende do nível de esforço e do tamanho da entrada. Os seus números vão variar conforme a combinação de modelos, o tamanho do prompt e os preços dos provedores. Os dados de benchmark por trás desses números fazem parte do Blueprint.
Uma diferença de vazão de 4× é o motivo pelo qual um único timeout compartilhado não servia para os dois provedores. Essa medição moldou o design — veja a aba de falhas.
Publicamos as falhas que mudaram o design, com sintomas e correções. As duas últimas vieram dos release candidates da extensão em outubro de 2026.
“A limitação deve estar claramente visível antes da compra: somente Claude Desktop no macOS/Windows, não no navegador, não no celular.”
É por isso que o quadro Onde funciona fica acima do preço. Votações posteriores estenderam o suporte ao Claude Code e, com uma configuração única, às sessões na nuvem do Claude Code, com a mesma condição para as limitações delas.
Esta votação corrigiu uma condição anterior. Aquela condição se baseava em fatos incompletos que o Claude havia passado ao conselho.
O formato que você está comprando também foi submetido ao conselho. Todas as sessões documentadas de decisões sobre o produto custaram, juntas, menos de $0.70. Os valores de confiança são a autoavaliação de cada modelo.
Uma compra. Os dois formatos.
Sem assinatura, sem licenças por usuário, sem conta conosco. O Kirat roda no seu computador ou no seu próprio ambiente de nuvem; você não aluga nenhum serviço nosso.
- 01Extensão para o Claude Desktop (
.mcpb) para macOS e Windows - 02Plugin para o Claude Code — mesmo servidor, mesmos recursos
- 03Script de configuração para sessões na nuvem do Claude Code
- 04Nove ferramentas: votar, revisar, criar, brainstorm, decidir, perguntar, imagem — mais resultado e status
- 05Controle de orçamento com teto diário, limite de duas rodadas, disjuntor, tickets em segundo plano
- 06Licença para uma pessoa, nos seus próprios dispositivos e ambientes de nuvem
- 07Atualizações de compatibilidade quando possível — gratuitas, mas sem garantia
Funciona no Claude Desktop (macOS/Windows) e no Claude Code; sessões na nuvem do Claude Code com uma configuração única — não no chat do navegador nem no do celular. Onde funciona · Limitações da nuvem
Comprar o Kirat- 01A especificação: requisitos estruturados para as ferramentas
- 02As decisões de arquitetura, com a justificativa de cada uma
- 03A lista de verificação de aceitação contra a qual um agente pode verificar a si mesmo
- 04Os dados de benchmark por trás dos números deste site
Sem código, sem extensão instalável.
Comprar o BlueprintCompra única · Pagamento via Lemon Squeezy (merchant of record), IVA tratado no checkout · Reembolsos: veja os Termos
O uso das APIs é pago diretamente à OpenAI e ao Google, nas suas contas — $0.02–$0.15 por decisão do conselho em nossas medições.
O Kirat não é para você se…
- —você usa o Claude apenas como chat no navegador ou no celular. O Kirat roda no Claude Desktop (macOS/Windows) e no Claude Code, e em sessões na nuvem do Claude Code com uma configuração única — não nesses chats.
- —você quer um SaaS com linha de suporte por telefone.
- —você não quer contas de API e faturamento em dois provedores.
- —você toma um punhado de decisões por mês. Duas abas do navegador são gratuitas e servem igualmente bem.
- —você espera que três modelos custem como um. As execuções do conselho usam tokens reais de API — de $0.02 a $0.15 por decisão em nossas medições.
- —você quer uma resposta que soe certa. O trabalho de um conselho é mostrar a divisão, e às vezes a divisão é a resposta.
- —os seus dados não podem ir para a OpenAI ou o Google. Tudo o que você fornece ao Kirat vai para os dois, nas suas contas e sob os termos deles.
- —a sua organização bloqueia extensões ou exige um proxy HTTP.
Você não precisa ser desenvolvedor.
Se você consegue instalar uma extensão do Claude e criar duas chaves de API, consegue usar o Kirat. Você pergunta em linguagem natural; o Claude chama as ferramentas.
Quanto ao que agentes conseguem construir: o próprio Kirat tem 11.351 linhas de TypeScript, entre código-fonte e testes, em 38 commits — todos os commits escritos por um agente de IA (Claude), nenhum à mão.
Antes de comprar.
Qual é a diferença em relação ao llm-council ou ao PAL MCP?
Confira os dois primeiro. O llm-council é um app web de código aberto; o autor o descreve como sem suporte por definição. O PAL MCP é um servidor MCP gratuito e de código aberto que você instala pelo terminal; ele suporta muitos provedores e tem sua própria ferramenta de consenso. Verifique a situação atual deles. Se um deles atender ao que você precisa, use-o.
A diferença do Kirat é o pacote: ele é instalado pela própria caixa de diálogo de extensões do Claude Desktop, com as suas chaves no armazenamento seguro do sistema operacional, e traz um controle de orçamento com teto diário, um limite de duas rodadas, desempate por domínio, tickets em segundo plano, tratamento de falhas, 256 testes, campos de resultado em inglês e uso em linguagem natural.
Preciso ser desenvolvedor?
Não. Se você consegue instalar uma extensão do Claude e criar duas chaves de API, consegue usar o Kirat. Você pergunta ao Claude em linguagem natural — Pergunte ao conselho do Kirat: Postgres ou SQLite? Dê também a sua própria posição.
— e o Claude chama as ferramentas.
Do que eu preciso?
Claude Desktop no macOS ou no Windows. Ele traz seu próprio Node, então você não instala mais nada. Ou o Claude Code com Node.js 20 ou superior. Para sessões na nuvem do Claude Code, uma configuração única do seu ambiente de nuvem (veja abaixo).
Além disso, uma chave de API da OpenAI e uma chave de API do Google Gemini, ambas com faturamento ativado. O Kirat também funciona com uma só chave: o conselho passa a ter então um único membro externo, e cada resultado indica a chave que falta.
Quanto custa para usar, e o que impede uma conta descontrolada?
Você paga diretamente à OpenAI e ao Google pelo que usar. Em nossas medições, uma decisão do conselho custa $0.02–$0.15, dependendo do nível de esforço e do tamanho da entrada, e leva de 8 segundos a 3 minutos. A geração de imagens custa cerca de $0.05–$0.15 por chamada.
O controle de orçamento reserva o custo no pior caso antes de cada chamada e bloqueia chamadas que possam ultrapassar o seu orçamento diário — $5 por dia UTC por padrão, ajustável. Ele funciona na base do melhor esforço, por isso defina também limites de gastos nos provedores. kirat_status mostra orçamento e gastos, e não custa nada.
Para onde vão os meus dados e as minhas chaves?
Seus dados: tudo o que você fornece ao Kirat (perguntas, contexto, código, imagens) vai diretamente para a OpenAI e o Google, nas suas contas e sob os termos deles — a partir do seu computador ou, nas sessões na nuvem do Claude Code, a partir do seu próprio ambiente de nuvem, pelo proxy de rede da Anthropic para esse ambiente. Não existe servidor do Kirat, conta conosco nem telemetria. Nunca vemos as suas chaves nem os seus dados.
Suas chaves: você as informa na própria caixa de diálogo de instalação ou de configurações do Claude. O Claude Desktop as guarda no armazenamento seguro do seu sistema operacional (Keychain do macOS, Gerenciador de Credenciais do Windows). O Claude Code as guarda no Keychain do macOS; no Windows e no Linux, em ~/.claude/.credentials.json, legível apenas pelo seu usuário. Recomendamos um projeto separado no provedor, com limite de gastos.
Nas sessões na nuvem do Claude Code: o Kirat roda no seu ambiente de nuvem, e as chaves são variáveis de ambiente desse ambiente, legíveis por todos que o usam.
No seu computador: o Kirat mantém uma pasta .kirat na sua pasta pessoal, com o contador de custos diários, o registro de custos, os últimos 20 resultados (eles contêm as suas perguntas e respostas), o registro de decisões delegadas e as imagens geradas. Você pode excluí-la a qualquer momento. Todas as sessões do Kirat no computador a compartilham, Desktop e Code.
Onde funciona? Chats do Desktop, a aba Code, o navegador, o celular, a nuvem?
Em resumo: Claude Desktop (macOS/Windows) e Claude Code; sessões na nuvem do Claude Code com uma configuração única — não no chat do navegador nem no do celular. O Kirat é um programa, não um serviço. Ele só funciona onde o Claude executa ferramentas em uma máquina que tenha o Kirat instalado:
- Chats do Claude Desktop no macOS e no Windows — com a extensão
.mcpb. - Claude Code em um terminal ou no VS Code, e sessões locais na aba Code do Claude Desktop — com o plugin do Claude Code. Ele requer Node.js 20 ou superior, e para instalá-lo é preciso usar uma vez a ferramenta de linha de comando
claude. A extensão.mcpbfoi feita para chats, não para sessões da aba Code. - Sessões SSH — com o plugin instalado na máquina remota.
- Sessões na nuvem do Claude Code (sessões na nuvem da aba Code, Claude Code na web ou no app para celular) — com uma configuração única do seu ambiente de nuvem, e com limitações (veja a próxima pergunta).
Sem suporte: chat no navegador (claude.ai) ou nos apps para celular, e tarefas do Cowork executadas na nuvem. A extensão no seu computador nunca chega a uma sessão na nuvem, mesmo que o Claude Desktop mostre o Kirat como ativado em “+ → Connectors” ali. Para saber em que tipo de sessão da aba Code você está, confira o seletor de ambiente na caixa de prompt: Local, SSH, WSL ou o nome de um ambiente de nuvem.
Não testado: sessões WSL e tarefas locais do Cowork.
Redes no seu próprio computador que exigem um proxy HTTP não são suportadas; os ambientes de nuvem do Claude Code funcionam. Se a sua organização restringe as extensões do Desktop a uma lista de permissões, as instalações manuais ficam bloqueadas; fale com o seu administrador.
Como o Kirat funciona nas sessões na nuvem do Claude Code, e quais são as limitações?
As sessões na nuvem — sessões na nuvem da aba Code, Claude Code na web ou no app para celular — rodam nos servidores da Anthropic, em um ambiente de nuvem. A extensão no seu computador não consegue alcançá-las. Em vez disso, você configura o ambiente de nuvem uma vez:
- cole o bloco do download (
cloud/setup.sh) no início do script de configuração do ambiente; - adicione suas duas chaves como variáveis de ambiente — recomendamos os nomes
KIRAT_OPENAI_API_KEYeKIRAT_GEMINI_API_KEY, que não conflitam com aOPENAI_API_KEYdo próprio projeto (o Kirat também aceitaOPENAI_API_KEYeGEMINI_API_KEY); - acesso à rede: se estiver em Full, não há nada a mudar; caso contrário, defina como Custom (em apps mais recentes: Limited) com a lista padrão de gerenciadores de pacotes, mais
api.openai.come o host de download do Kirat.
O script baixa exatamente a sua versão do Kirat, verifica a soma de verificação SHA-256 e a instala. É uma configuração única, não um clique. Nós a testamos em um contêiner na nuvem.
As limitações: todos que usam o ambiente podem ler suas variáveis de ambiente, inclusive as suas chaves. Cada sessão na nuvem começa do zero, então o orçamento diário do Kirat é contado por sessão — defina limites de gastos na OpenAI e no Google; na nuvem, eles são o seu teto real. Tarefas em segundo plano e resultados recentes terminam com a sessão. Além de api.openai.com, o acesso à rede do ambiente precisa permitir o host de download do Kirat (o Gemini já está coberto pela lista padrão). Se a configuração falhar, a sessão ainda inicia, só que sem o Kirat — e o estado de falha pode ficar em cache para novas sessões até você editar o script de configuração (qualquer alteração faz com que novas sessões o executem de novo).
O endereço de download no script de configuração faz parte da sua compra, assim como o ZIP; não o publique. A licença abrange os seus próprios ambientes de nuvem. Um ambiente de nuvem compartilhado com outras pessoas exige uma licença para cada pessoa.
Quais modelos ele usa? E se um provedor descontinuar um deles?
Por padrão, gpt-5.6 da OpenAI e gemini-3.6-flash do Google, com o Claude como terceiro votante.
Nomes e preços de modelos são configurações. Se um provedor descontinuar um modelo, você informa o novo nome e seus dois preços. Nenhuma atualização é necessária.
O Claude Desktop diz que a extensão não é verificada pela Anthropic. Isso é um problema?
Esse aviso é esperado. O Claude Desktop o exibe para extensões instaladas a partir de um arquivo, e o Kirat é instalado a partir de um arquivo — ele não é verificado nem assinado pela Anthropic.
Como funcionam as atualizações?
No Claude Desktop, instale o novo .mcpb da mesma forma que o primeiro. Suas chaves e configurações são mantidas.
As atualizações de compatibilidade são gratuitas quando possível, mas não há garantia. Novas versões maiores podem ser vendidas separadamente.
Eu recebo suporte?
Para problemas de compra, download e instalação: sim, por e-mail — os dados de contato estão no Aviso legal. Não há consultoria de implementação nem prazo de resposta garantido.
O que a licença permite?
Uma pessoa, em qualquer número de dispositivos próprios e nos seus próprios ambientes de nuvem. Um ambiente de nuvem compartilhado com outras pessoas exige uma licença para cada pessoa. Sem revenda e sem redistribuição. O Kirat é software proprietário, não de código aberto.
Usar o que o conselho produz no seu próprio trabalho, inclusive em trabalho comercial, é permitido. Os termos completos estão nos Termos.
Para que serve o Blueprint? Eu preciso dele?
Você não precisa dele para usar o Kirat. O Blueprint é para quem quer construir ou adaptar o próprio servidor de conselho com um agente de programação.
São apenas documentos — sem código, sem extensão instalável: a especificação (requisitos estruturados para as ferramentas), as decisões de arquitetura com a justificativa de cada uma, a lista de verificação de aceitação contra a qual um agente pode verificar a si mesmo e os dados de benchmark por trás dos números deste site. Não há preço de pacote.