Three-layer code review
in one API call.
ESLint, tests, and security scans produce data. Rynko Flow enforces rules on that data. AI Judge evaluates what rules can't express. One gate, one HTTP call, one audit trail.
The three-layer pipeline
Each layer catches what the previous one can't. If Layer 1 fails, Layers 2 and 3 are skipped — no wasted LLM cost.
Layer 2 — 11 Business Rules
These rules run on every submission. They enforce team standards on the structured data produced by your CI tools.
No lint errors
!lint || lint.errors === 0Lint warnings under threshold
!lint || lint.warnings <= 10All tests must pass
!tests || tests.failed === 0Test coverage >= 80%
!tests || !tests.coverage || tests.coverage >= 80No high/critical vulnerabilities
!security || security.high === 0PR title is descriptive
!pr.is_pr || pr.title.length >= 10PR is not work-in-progress
!pr.is_pr || !pr.title.toLowerCase().startsWith("wip")PR description required
!pr.is_pr || pr.description.length > 20File count limit (<= 20)
pr.files_changed <= 20Line count limit (<= 500)
pr.additions + pr.deletions <= 500No .env files committed
!files || !files.some(f => f.includes(".env"))Layer 3 — 5 AI Judge Criteria
These criteria are evaluated by an LLM against the actual diff. Each returns pass/fail with a confidence score and reasoning.
Functions should follow the Single Responsibility Principle — each function does one thing well
Error handling should use specific error types, not generic catch-all blocks
New code should follow the existing naming conventions in the codebase
Database queries should use parameterized inputs, not string concatenation
Public API endpoints should validate input and return appropriate error codes
Persona: "senior code reviewer specializing in code quality, security, and maintainability"
On fail: Route to human review (not hard-reject)
Get started in 3 commands
Clone the repo, set up the gate, run a review. That's it.
What you get back
One API call returns a structured response with results from all three layers.
{
"success": false,
"runId": "run_8f2a3c...",
"status": "pending_approval",
"validation_id": "val_4f546e...",
"layers": {
"schema": "pass",
"business_rules": "pass",
"ai_judge": "fail"
},
"aiJudgeVerdict": {
"criteria": [
{ "criterion": "SRP", "verdict": "pass", "confidence": 0.95 },
{ "criterion": "Error handling", "verdict": "fail", "confidence": 0.88,
"reasoning": "Generic catch(err) on line 42 — use AppError" },
{ "criterion": "Naming conventions", "verdict": "pass", "confidence": 0.91 },
{ "criterion": "Parameterized queries", "verdict": "pass", "confidence": 0.97 },
{ "criterion": "Input validation", "verdict": "pass", "confidence": 0.85 }
],
"overall": "fail",
"summary": "4 of 5 criteria passed"
}
}aiJudgeOnFail: "review" → routed to human approval instead of hard-rejectingDrop into any CI pipeline
GitHub Actions, GitLab CI, or any CI that runs Node.js.
name: Code Review
on: [pull_request]
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- run: node tools/rynko-review/cli.mjs --ci
env:
RYNKO_API_KEY: ${{ secrets.RYNKO_API_KEY }}One gate
Schema + rules + AI Judge all configured in one place
Full audit trail
Every review logged with payload, verdicts, and reviewer decisions
Update without deploys
Change rules and criteria in the dashboard — no CI changes needed
Build your own review pipeline.
The code-review demo is just one gate. Create gates for any validation use case — invoices, contracts, content, orders.
No credit card required · 500 free runs/month · AI Judge on paid tiers