Skip to main content
Vibgrate Review — free in the CLI and in VS Code, runs locally

Did this change break the architecture you declared?
Ask before the pull request.

AI coding agents write changes faster than anyone can judge their architectural consequences. Vibgrate Review reads a change from your Vibgrate Graph, runs deterministic scanners, and gives one policy-owned decision — pass, needs review, fail, or undetermined — as a versioned receipt. On your machine. Source never leaves it.

vg review reads the change from the code map and gives one policy-owned decision — pass, needs review, fail, or undetermined — before the pull request.

Real output of the shipped CLI on our .NET Clean Architecture test solution. Replay the same run below.

Three questions a senior reviewer asks

A drift scan answers how far behind is the stack? Review answers a different question about the same repository — and answers it about one change, before it lands.

Did it move toward the architecture you declared?

Declare the target pattern — layered, clean, hexagonal, MVC — in .vibgrate/review.toml. A new dependency that skips a tier, or a controller that reaches persistence directly, is reported as a regression with the rule it breaks, not as a style nit.

Did it weaken a security control?

A guard removed from an entrypoint, a mutating route left unguarded where its peers are guarded, or a known-vulnerable dependency added. These findings are protected: while one is unresolved, policy cannot say pass — not through low confidence, not through an exception, not through anything a model says.

What did it not account for?

A changed file with no test reaching it. A data-access pattern that deviates from every peer. A duplicate of a function that already exists. And where Review could not observe something, it says so as an unknown — never a green tick nobody earned.

How it decides

Each stage owns exactly one thing. Findings never decide; a model never decides; policy decides once, and the receipt records which policy and which model.

  1. 01

    Source + diff

    The working tree and index against HEAD, or a branch against its merge-base — the same change set a pull request shows.

  2. 02

    Vibgrate Graph + deterministic scanners

    Roles, layers, edges, and peers come from the local code map. Every finding cites the evidence it rests on.

  3. 03

    Analysis Capsule

    A bounded evidence packet — a few thousand tokens — that never leaves your machine unless you opt in.

  4. 04

    Optional local model

    May add explanations and implications. It never decides, and a schema verifier rejects any output that invents evidence or a verdict.

  5. 05

    Policy

    The one layer that writes a decision, from a policy version you can read. Protected findings cannot be blessed into a pass.

  6. 06

    Receipt

    vg.review.receipt.v1: the decision, every finding with evidence ids, the policy and model versions, and content digests.

Protected findings

An unguarded entrypoint, a removed guard, and a known-vulnerable dependency are protected. While one is unresolved, the decision cannot be pass. The only way to stop a protected rule from gating is to turn it off in .vibgrate/review.toml — read from the trusted base branch on a pull request, so a change cannot weaken the policy applied to itself.

Decisions and exit codes

pass0No material delta, or every finding is target-aligned
fail2 when gatedAn unresolved protected finding, or a high-severity finding above the confidence threshold
needs review2 with --fail-on needs_reviewFindings a human should look at
undetermined2 with --fail-on needs_reviewNot enough evidence to decide — deliberately not a pass

Gating is opt-in, as for vg scan: without --fail-on or enforcement in the policy file, every decision is reported and the process exits 0. A missing code map or model exits 6, which is never read as a pass.

The same review, everywhere you work

One binary, one policy, one receipt — whether it runs on a laptop, in the editor, or on a runner.

Vibgrate CLI

vg review on the working tree, --base for a branch, explain for one finding. Text for people; json, sarif (security findings only), and md for machines and pull requests.

Command reference

Vibgrate for VS Code

The Review panel lists your uncommitted changes, runs the same review, marks findings on the files, and shows the evidence behind any finding with every path one click from the editor.

The extension

In CI

The shipped GitHub Actions example runs the same binary against the merge-base, uploads the receipt, and writes the Markdown summary to the check. Gating is opt-in: --fail-on fail stops the build only on a fail decision.

CI integration

Vibgrate Cloud

--push sends the receipt — never the source — so a repository shows its review decisions commit by commit next to its DriftScore. Two numbers, two widgets, never blended.

Vibgrate Cloud

Review your next change

Install the Vibgrate CLI, make a change, and run one command. Review builds the code map if there is none, and on a first run writes a starter, advisory .vibgrate/review.toml seeded from the layering the repository already exhibits — after the review, so it never lands in the change set being reviewed.

npx @vibgrate/cli scan

no install·Nothing is installed globally — ideal for CI or a one-off scan.

Then
$ vg review # the working tree + index, vs HEAD
$ vg review --base origin/main # the branch, vs its merge-base
$ vg review explain arch-01 # the evidence behind one finding

What it is not

  • It is not a proof of security, and absence of findings is not a certification. Review reports change integrity against the architecture and controls you declared.
  • It does not replace Semgrep, CodeQL, compilers, or tests. Dataflow (taint) analysis is not part of this slice: when a change touches an entrypoint, Review reports that as an unknown rather than pretending to have checked.
  • It is not a majority vote. A dependency that skips a tier is a regression only when you declared a target pattern; otherwise it is a medium finding about the repository’s own habits, because a majority is not a decision.
  • It is not DriftScore. DriftScore measures how far a stack has drifted from current versions; Review measures whether one change kept its promises. They are never combined.
Vibgrate Review

See a real review run

A replay of the actual CLI reviewing a change to our .NET Clean Architecture test solution — the decision, the findings, the evidence behind one of them, and the Markdown summary. Nothing executes in your browser.

Replay
demo@vibgrate — bash
npx @vibgrate/cli scan
 
╭──────────────────────────────────────────╮
Vibgrate Drift Report
╰──────────────────────────────────────────╯
 
── node-turborepo (node) .
Runtime: >=18.0.0 (6 majors behind)
Frameworks:
Turbo: 1.13.4 → 2.10.12 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
1 current 1 1-behind 3 2+ behind 1 unknown
 
── @repo/admin (node) apps/admin
Frameworks:
TanStack Query: 5.102.8 → 5.102.8 (current)
React: 18.3.1 → 19.2.8 (1 behind)
React DOM: 18.3.1 → 19.2.8 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Vite: 5.4.21 → 8.2.2 (3 behind)
Dependencies:
3 current 9 1-behind 3 2+ behind 4 unknown
 
── @repo/api (node) apps/api
Frameworks:
Express: 4.22.2 → 5.2.1 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Vitest: 1.6.1 → 5.0.0 (4 behind)
Dependencies:
7 current 5 1-behind 3 2+ behind 4 unknown
 
── @repo/web (node) apps/web
Frameworks:
Next.js: 14.2.35 → 16.3.4 (2 behind)
React: 18.3.1 → 19.2.8 (1 behind)
React DOM: 18.3.1 → 19.2.8 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
2 current 6 1-behind 3 2+ behind 5 unknown
 
── @repo/config (node) packages/config
Frameworks:
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
2 current 2 1-behind 5 2+ behind 0 unknown
 
── @repo/database (node) packages/database
Frameworks:
Prisma: 5.22.0 → 7.10.0 (2 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
1 current 0 1-behind 3 2+ behind 1 unknown
 
── @repo/types (node) packages/types
Frameworks:
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Dependencies:
0 current 0 1-behind 1 2+ behind 1 unknown
 
── @repo/ui (node) packages/ui
Frameworks:
React: 18.3.1 → 19.2.8 (1 behind)
TypeScript: 5.9.3 → 7.0.2 (2 behind)
React: 18.3.1 → 19.2.8 (1 behind)
Dependencies:
1 current 4 1-behind 1 2+ behind 1 unknown
 
── @repo/utils (node) packages/utils
Frameworks:
TypeScript: 5.9.3 → 7.0.2 (2 behind)
Vitest: 1.6.1 → 5.0.0 (4 behind)
Dependencies:
0 current 1 1-behind 2 2+ behind 1 unknown
 
Tech Stack
Frontend: React, React DOM
Meta-frameworks: Next.js
Bundlers: tsx, Turbo, Vite
CSS / UI: Autoprefixer, PostCSS, Tailwind CSS
Backend: Express
ORM / Database: Prisma, Prisma Client
Testing: Vitest
Lint & Format: ESLint, ESLint Prettier, ESLint React, Prettier, typescript-eslint
 
Services & Integrations
Auth: JWT 9.0.3
Databases: Prisma 5.22.0
 
TypeScript
v5.3.3 · strict ✔ · MIXED · target: ES2022
 
Build & Deploy
Package Managers: pnpm
Monorepo: npm-workspaces, pnpm-workspaces, turbo
 
Product Purpose Signals
Frameworks: react, nextjs
Evidence: 177
Top Signals:
- [heading] Dashboard (apps/admin/src/pages/Dashboard.tsx)
- [title] Revenue Overview (apps/admin/src/pages/Dashboard.tsx)
- [copy] workspace:* (packages/ui/package.json)
- [copy] ./dist (packages/ui/tsconfig.json)
- [copy] ./src/index.ts (packages/ui/package.json)
- [copy] @repo/config/tsconfig-base.json (packages/ui/tsconfig.json)
- [copy] @repo/ui (packages/ui/package.json)
- [copy] #3b82f6 (apps/admin/src/pages/Dashboard.tsx)
Unknowns:
- No pricing or billing evidence found.
- No integrations/connectors evidence found.
- No route structure evidence found.
 
Security Posture
Lockfile ✖ · .env ✔ · node_modules ✔
 
Platform
Native modules: turbo
 
Code Quality
Files: 36 · Functions: 183 · Avg complexity: 2.62 · Avg length: 21.13 lines
Max nesting: 2 · Circular deps: 0 · Dead code: 0%
God files: apps/admin/src/pages/Products (448 lines)
 
Database Schema
postgresql · 8 models · 1 enum
Models: Address, CartItem, Category, Order, OrderItem (+3 more)
 
Findings (16 errors, 11 warnings)
Node.js runtime ">=18.0.0" reached end-of-life on 2025-04-30 (latest: 24.0.0).
vibgrate/runtime-eol in .
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in .
60% of dependencies are 2+ major versions behind in node-turborepo.
vibgrate/dependency-rot in .
@types/node is 6 major versions behind (spec: ^20.11.0, latest: 26.5.0).
vibgrate/dependency-major-lag in .
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in apps/admin
Vite is 3 major versions behind (current: 5.4.21, latest: 8.2.2).
vibgrate/framework-major-lag in apps/admin
vite is 3 major versions behind (spec: ^5.0.12, latest: 8.2.2).
vibgrate/dependency-major-lag in apps/admin
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in apps/api
Vitest is 4 major versions behind (current: 1.6.1, latest: 5.0.0).
vibgrate/framework-major-lag in apps/api
@types/node is 6 major versions behind (spec: ^20.11.0, latest: 26.5.0).
vibgrate/dependency-major-lag in apps/api
vitest is 4 major versions behind (spec: ^1.2.1, latest: 5.0.0).
vibgrate/dependency-major-lag in apps/api
Next.js is 2 major versions behind (current: 14.2.35, latest: 16.3.4).
vibgrate/framework-major-lag in apps/web
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in apps/web
@types/node is 6 major versions behind (spec: ^20.11.0, latest: 26.5.0).
vibgrate/dependency-major-lag in apps/web
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/config
56% of dependencies are 2+ major versions behind in @repo/config.
vibgrate/dependency-rot in packages/config
eslint-plugin-react-hooks is 3 major versions behind (spec: ^4.6.0, latest: 7.1.1).
vibgrate/dependency-major-lag in packages/config
Prisma is 2 major versions behind (current: 5.22.0, latest: 7.10.0).
vibgrate/framework-major-lag in packages/database
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/database
75% of dependencies are 2+ major versions behind in @repo/database.
vibgrate/dependency-rot in packages/database
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/types
100% of dependencies are 2+ major versions behind in @repo/types.
vibgrate/dependency-rot in packages/types
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/ui
TypeScript is 2 major versions behind (current: 5.9.3, latest: 7.0.2).
vibgrate/framework-major-lag in packages/utils
Vitest is 4 major versions behind (current: 1.6.1, latest: 5.0.0).
vibgrate/framework-major-lag in packages/utils
67% of dependencies are 2+ major versions behind in @repo/utils.
vibgrate/dependency-rot in packages/utils
vitest is 4 major versions behind (spec: ^1.2.1, latest: 5.0.0).
vibgrate/dependency-major-lag in packages/utils
 
╭──────────────────────────────────────────╮
Top Priority Actions
╰──────────────────────────────────────────╯
 
1. Upgrade EOL runtime in node-turborepo
End-of-life runtimes no longer receive security patches and block ecosystem upgrades.
./.
>=18.0.0 → 24.0.0 (6 majors behind)
Impact: −10 drift points (runtime & EOL)
 
2. Fix security posture: no lockfile found
Without a lockfile, installs are non-deterministic. Run the install command to generate one and commit it.
./
Missing: package-lock.json, pnpm-lock.yaml, or yarn.lock
 
3. Upgrade Vitest 1.6.1 → 5.0.0 in @repo/api (+2 more)
4 major versions behind. Major framework drift increases breaking change risk and blocks access to security fixes and performance improvements.
./apps/api
Vitest: 1.6.1 → 5.0.0 (4 majors behind)
./packages/utils
Vitest: 1.6.1 → 5.0.0 (4 majors behind)
./apps/admin
Vite: 5.4.21 → 8.2.2 (3 majors behind)
Impact: −5–15 drift points
 
4. Reduce dependency rot in @repo/types (100% severely outdated)
1 of 1 dependencies are 2+ majors behind. Run `npm outdated` and prioritise packages with known CVEs or breaking API changes.
./packages/types
typescript: 5.9.3 → 7.0.2 (2 majors behind)
Impact: −5–10 drift points
 
5. Reduce dependency rot in @repo/database (75% severely outdated)
3 of 4 dependencies are 2+ majors behind. Run `npm outdated` and prioritise packages with known CVEs or breaking API changes.
./packages/database
@prisma/client: 5.22.0 → 7.10.0 (2 majors behind)
prisma: 5.22.0 → 7.10.0 (2 majors behind)
typescript: 5.9.3 → 7.0.2 (2 majors behind)
Impact: −5–10 drift points
 
╭──────────────────────────────────────────╮
Architecture Layers
╰──────────────────────────────────────────╯
 
Archetype: nextjs (80% confidence)
Files classified: 24 (11 unclassified)
Folders classified: 8
apps/admin/src presentation 100% 4 files
apps/admin/src/pages presentation 100% 2 files
apps/api/src/middleware middleware 100% 2 files
apps/api/src/routes routing 100% 2 files
apps/web/src/app presentation 100% 4 files
apps/web/src/app/products presentation 100% 2 files
apps/web/src/app/products/[id] presentation 100% 1 file
packages/ui/src presentation 100% 6 files
Unclassified source (sample): 11
 
presentation 15 files drift ████████████████████ 100 risk high
routing 4 files drift ████████████████████ 100 risk high
middleware 2 files drift ███████▍░░░░░░░░░░░░ 37 risk moderate
config 2 files drift ░░░░░░░░░░░░░░░░░░░░ 0 risk none
shared 1 file drift ████████████████████ 100 risk high
 
╭──────────────────────────────────────────╮
DriftScore Summary
╰──────────────────────────────────────────╯
 
DriftScore: 70/100
Risk Level: HIGH
Projects: 9
Classified: 8 nano · 1 micro · 0 small · 0 standard
Billable: 0.42 · 9 detected → 0.42 billable projects (micro-project pricing)
0.1 micro · 0.32 nano
These fractions add up across repositories, then round down to whole billable projects.
 
Score Breakdown
Runtime: ████████████████████ 100
Frameworks: ███████████▊░░░░░░░░ 59
Dependencies: ██████▌░░░░░░░░░░░░░ 33
EOL Risk: ████████████████████ 100
 
Scanned at 2026-09-08T16:04:24.884Z · 8.2s · 286 files scanned · 56 workspace files · 27 dirs
Press Run to start.

More from Vibgrate

Everything on this page is free and runs locally. Vibgrate Cloud adds the commit-by-commit timeline.