Live webinarWebinar with Jason Lee, Tue, Oct 13Your newest insider is an AI agent.Jason LeeFormer CISO, Zoom & SplunkRegister

Your coding agents' security, in one command.

Rules followed, dangerous actions blocked, code fixed before the commit, and every agent visible to your team.

npx -y @cybedefend/vibedefend@latest install

EU or US region, chosen at install. The guard decides on your machine.

One command. Five agents. The installer wires Claude Code, Cursor, Windsurf, GitHub Copilot and OpenAI Codex on the developer's machine, in one run.

8 times fewer broken rules.

Rules broken per ticket, same agent, same tasks.
  • No tool2.28
  • A rules file, kept by hand2.27
  • VibeDefend0.28

Controlled study, 24 August 2026. Read the study
A rules file against VibeDefend

  1. Your rules, served before each edit.

    Business rules learned from your code and security rules for your stack, picked for the file it edits.

    Claude Code is writingbilling/refund.ts

    async function refund(order, amount) {
      if (amount > 500)
        await approvals.second(order);
      await payments.refund(order, amount);
      return receipt(order);
    }
    

    Refunds above €500 need a second approver.

    Approved once by Sofia M.

    Written with your rule, before the edit lands.

  2. Dangerous commands never run.

    Schema drops, sudo, secret reads and force pushes are refused; the agent is told why and takes another way.

    OpenAI Codex wants to run

    rm -rf ./storage/uploads

    1. Read
    2. Checked against your guards
    3. Refused
    4. Run

    Blocked: protected path, user uploads

  3. Fixed before the commit.

    When the agent finishes, its changes are scanned and it fixes each finding. Your project's findings are in its session.

    SQL injection, reachable

    CWE-89, src/db/users.repo.ts:42
    "SELECT * FROM users WHERE id = $1", [id]

    Fixed by the agent before the commit

  4. Then proved, not assumed.

    After the commit, BLSA checks its business logic and proves each verdict: the rule, the path, the line.

    1. Refunds above €500 need a second approver.

      BLSA, proof mode

    2. POST /refunds

      Entry point

    3. approvals.second(order)

      The rule's check

    4. payments.refund(order)

      Runs after the check

    Holds: approved before it is paid

  5. Everything it does, on one map.

    Every rule served, every refusal and every fix, traced to its agent and its developer in the Brain.

    Cursor

    1. src/billing/cart-checkout.ts

      3 rules served

    2. DROP TABLE invoices;

      Blocked

    3. CWE-89, src/db/users.repo.ts:42

      Finding fixed

    Traced to Sofia M., in the Brain

Nobody told your agent. Now it knows.

One command. Every agent. No card.

npx -y @cybedefend/vibedefend@latest install

In detail

Then proved, not assumed.

After the commit, BLSA (Business Logic Security Analysis, built with the CNRS and the CRIStAL laboratory) checks the business logic of the change, and its proof mode shows why each verdict holds or breaks: the rule, the path through the code, the line. BLSA is open to design partners today.

The eight business-logic flaws it prevents
43%

of API vulnerabilities exploit business logic, not a known CVE.

Wallarm, API ThreatStats 2026

Multi-tenant leaktenant scoping on queriesCWE-639

Lookup by id with no tenant filter: any signed-in customer can read this order.

before

// GET /api/orders/:id
const order = await db.order.findUnique({
  where: { id: req.params.id },
});
return res.json(order);

after

// GET /api/orders/:id
const order = await db.order.findUnique({
  where: { id: req.params.id, tenantId: req.user.tenantId },
});
if (!order) return res.status(404).end();
return res.json(order);

Rule: tenant scoping on queries

Refund bypassauthorization ceiling on refundsCWE-840

Refund created with no role check and no ceiling: any amount goes out on any intent.

before

router.post('/refund', async (req, res) => {
  await stripe.refunds.create({
    payment_intent: req.body.intent,
    amount: req.body.amount,
  });
  return res.json({ ok: true });
});

after

router.post('/refund', requireRole('finance'), async (req, res) => {
  const intent = await getOwnedIntent(req.user, req.body.intent);
  const amount = clampRefund(intent, req.body.amount);
  await stripe.refunds.create({ payment_intent: intent.id, amount });
  return res.json({ ok: true });
});

Rule: authorization ceiling on refunds

Missing idempotencyidempotency key on webhooksCWE-837

No idempotency key: the same Stripe event replayed credits the order twice.

before

app.post('/webhook/stripe', async (req, res) => {
  await orders.markPaid(req.body.id);
  await ledger.append({ type: 'charge', ... });
  res.send('ok');
});

after

app.post('/webhook/stripe', async (req, res) => {
  const key = req.headers['idempotency-key'];
  if (await seen.has(key)) return res.send('dup');
  await orders.markPaid(req.body.id);
  await ledger.append({ type: 'charge', key, ... });
  await seen.add(key, '24h');
  res.send('ok');
});

Rule: idempotency key on webhooks

PII in logsPII policy in logsCWE-532

The whole req.body goes to the logs: email and password in cleartext at your log vendor.

before

logger.info('signup', { user: req.body });

after

logger.info('signup', {
  userId: hash(req.body.email),
  region: req.body.region,
});

Rule: PII policy in logs

Auth middleware skippedmandatory auth middleware on routesCWE-306

Route mounted without the auth middleware: /admin/users is reachable with no session.

before

// public.routes.ts
router.get('/admin/users', listAllUsers);

after

// admin.routes.ts (auth + rbac applied at mount)
router.use(requireSession, requireRole('admin'));
router.get('/users', listAllUsers);

Rule: mandatory auth middleware on routes

Feature flag rolloutsecure feature-flag defaultsCWE-1188

Missing flag defaults to true: the export switches itself on in production.

before

if (flags.allow_anyone_to_export ?? true) {
  return exportAll();
}

after

if (flags.allow_anyone_to_export === true && req.user.role === 'admin') {
  audit.log('export.all', req.user);
  return exportAll();
}

Rule: secure feature-flag defaults

Rate limit absentrate limiting on loginCWE-307

No attempt limit on /login: credential bruteforce is unlimited.

before

router.post('/login', loginHandler);

after

router.post('/login',
  rateLimit({ windowMs: 60_000, max: 8, keyGenerator: ipAndEmail }),
  loginHandler);

Rule: rate limiting on login

Tenant-wide exporttenant scoping on admin exportsCWE-285

findMany with no tenant scope: the CSV export returns every customer's users.

before

router.get('/admin/export', requireAdmin, async (_req, res) => {
  const rows = await db.user.findMany({});
  res.csv(rows);
});

after

router.get('/admin/export', requireAdmin, async (req, res) => {
  const rows = await db.user.findMany({
    where: { tenantId: req.user.tenantId },
  });
  audit.log('export', req.user);
  res.csv(rows);
});

Rule: tenant scoping on admin exports

Four layers, one install.

Rules served

Business rules mined from your code, plus your security rules, served before each edit.

Claude Code is writingsrc/billing/cart-checkout.ts

const total = new Decimal128(cart.sum);
const rows = await db.query(
  "SELECT * FROM carts WHERE id = $1", [id]
);

Monetary amounts use Decimal128, never Number.

Mined from src/billing.ts:14

Parameterise every query that mixes user input.

OWASP Top 10

Served before the edit

Secret guard

Raw secret reads are refused; the agent gets the managed reference instead.

Cursorwebhooks.ts

  1. cat .env | grep STRIPE

    Blocked: raw secret read

  2. Insteadprocess.env.STRIPE_WEBHOOK_SECRET

  3. npm test -- webhooks

    Tests pass

Logged for the team

Action guard

Destructive commands, schema drops and protected paths are stopped before they run.

OpenAI Codex

  1. rm -rf dist/

    Allowed: build output

  2. rm -rf .cache/

    Allowed: cache

  3. rm -rf ./storage/uploads

    Blocked: protected path, user uploads

Logged for the team

Live findings

SAST, SCA, secrets, IaC and CI/CD findings, live in the session for the agent to fix.

GitHub Copilot

  1. SASTsrc/db/users.repo.ts:42

    SQL injection

  2. SCApackage.json

    lodash 4.17.20, CVE-2021-23337

  3. Secretsconfig/prod.yml

    AWS access key

  4. IaCinfra/main.tf

    S3 bucket public-read

  5. CI/CD.github/workflows/deploy.yml

    pull_request_target

In the agent's context, live

Your frameworks, served as rules.

The security rules the agent receives map to the frameworks your auditors check.

  • OWASP Top 10Injection, broken access control, exposed secrets.
  • SOC 2Access control, audit logging, change management.
  • GDPRPersonal data in logs, retention, data minimization.
  • ISO 27001Secure development and access control.

Frameworks your rules map to, not certifications of CybeDefend. Our own posture

Try it free on your own code.

No card. To go further, we run a pilot with your team and set the price with you.

Before you install.

In CybeDefend's controlled study of 24 August 2026, the same agent applied 89% of precise rules with VibeDefend, against 12% with no tool and 13% with a rules file kept by hand.

Does my code leave my machine?
What you send for analysis does, and it stays in the region you picked at install: Paris for EU customers on SecNumCloud-qualified infrastructure, Iowa for US customers, on our own self-hosted models, never a third-party AI API. The guard decides on your machine, its telemetry carries metadata only (no prompt content, no raw code), findings never cross regions, and your code is never used to train a model.
Which agents does it work with?
The installer wires Claude Code, Cursor, Windsurf, GitHub Copilot and Codex. Any other agent that speaks MCP works in bring-your-own-config mode, including Gemini CLI, Cline, Continue.dev and Zed.
What does the free plan include, and what happens after?
Sign in and run the install command: your rules reach Claude Code, Cursor, Windsurf, GitHub Copilot and Codex, and the guards run in Claude Code, Cursor and Codex, with no card. To go further, we run a pilot with your team, then set a price with you, for your usage.
Is this another scanner that floods the agent with alerts?
No. Legacy scanners run on commits and bury you in false positives. VibeDefend runs at agent-time on the diff being written, with reachability and framework awareness, and hands the agent one finding it can act on, with the fix.
Can I read the study before I sign up?
Yes, and you should. The 36-page paper, the 90 transcripts, the blind audits and the six cases where the layer did not deliver are in the public repository linked on this page.
What happens when VibeDefend blocks a command?
The command never runs. The agent receives the reason in its session, so it can take another way, and the refusal is logged for the team in the Brain.
Where do the rules it serves come from?
From two places: rules proposed from your own code, which a person approves once, and the frameworks you choose, such as the OWASP Top 10, SOC 2 or GDPR, served as rules. Before each edit, VibeDefend hands the agent the ones that apply to the file it is changing.
What is checked before the commit?
The changes the agent just made. At the end of its response, VibeDefend reviews them and hands each finding back with its fix, so the agent rewrites the line before the commit. The findings of your SAST, SCA, secrets, IaC and CI/CD scans are in the session too, live.
Can the team see what each agent did?
Yes. Every rule served, every refusal and every finding is traced to its agent and its developer in the Brain, the map of your agents, so a lead or a security team reads it without asking anyone.
My agent already checks its own code. Why add CybeDefend?
Each agent checks its own work, with its own settings. CybeDefend gives all five agents the same rules, your business rules included, served before the edit rather than reviewed after it, and keeps one record of what each agent was served, what was blocked and what was fixed.