Skip to content
VULQN VULQN docs
Get Started

.vulqn.json Reference

Place a .vulqn.json file at the root of your repository to customize VULQN’s review behavior for that repo. The file is fetched from the PR’s head SHA on every review — config changes take effect immediately on the PR that introduces them.

All fields are optional. Missing fields fall back to system defaults.

Schema

{
"version": 1,
"ignore": { ... },
"focus": { ... },
"rules": [ ... ],
"scoring": { ... },
"confidence": { ... },
"trigger": { ... },
"output": { ... }
}

The top-level version field is required and must be 1.

ignore

Exclude files from review. Additive on top of VULQN’s global ignore list (which already excludes node_modules, lock files, binaries, etc.).

"ignore": {
"pathPrefixes": ["scripts/", "docs/"],
"extensions": [".generated.ts", ".pb.go"],
"filenames": ["schema.graphql"]
}
FieldTypeDescription
pathPrefixesstring[]Drop files whose path starts with any of these prefixes
extensionsstring[]Drop files whose path ends with any of these extensions
filenamesstring[]Drop files whose basename matches exactly

focus

Only review files matching specific path prefixes. If set, files not matching any prefix are skipped.

"focus": {
"paths": ["src/", "packages/", "apps/"]
}
FieldTypeDescription
pathsstring[]Only review files matching one of these prefixes. Empty array [] disables focus (reviews everything).

rules

Inject custom review instructions for files matching specific path prefixes. Multiple rules can match the same file — all matching instructions are injected.

"rules": [
{
"paths": ["packages/core/src/ports/"],
"instructions": "Check all new ports are exported from index.ts and have an adapter."
},
{
"paths": ["backend/"],
"instructions": "Flag any auth logic outside of the designated auth package."
}
]
FieldTypeDescription
pathsstring[]Path prefixes this rule applies to
instructionsstringInstructions injected into the AI prompt for matching files

scoring

Control how VULQN calculates the confidence score for a PR review.

"scoring": {
"criticalPenalty": 25,
"mediumPenalty": 8,
"praiseBonus": 5,
"praiseCap": 15
}

Formula: 100 - (critical × criticalPenalty) - (medium × mediumPenalty) + min(praise × praiseBonus, praiseCap)

The result is clamped to [0, 100].

FieldTypeDefaultDescription
criticalPenaltynumber25Points deducted per critical finding
mediumPenaltynumber8Points deducted per medium finding
praiseBonusnumber5Points added per praise finding
praiseCapnumber15Maximum total bonus from praise

All values must be ≥ 0. Invalid values fall back to defaults.

confidence

Control when VULQN fails a PR build and which findings are included.

"confidence": {
"failOnCritical": true,
"failBelowScore": 80,
"minFindingConfidence": "medium"
}
FieldTypeDefaultDescription
failOnCriticalbooleantrueA critical finding always fails the build, regardless of score
failBelowScorenumber80Fail build if confidence score is strictly below this threshold (e.g. score = 80 with threshold 80 = pass) (clamped to 0–100)
minFindingConfidence"high" | "medium""medium"Drop AI findings below this confidence level

trigger

Control which PRs VULQN reviews.

"trigger": {
"skipDrafts": true,
"targetBranches": ["main", "develop"],
"skipAuthors": ["dependabot[bot]", "renovate[bot]"]
}
FieldTypeDefaultDescription
skipDraftsbooleanfalseSkip draft/WIP PRs. GitHub uses the draft flag; Bitbucket detects WIP:, [WIP], or Draft: title prefixes.
targetBranchesstring[][] (all)Only review PRs targeting these branches. Empty array = review all branches.
skipAuthorsstring[][]Skip PRs from these authors. Useful for bot accounts.

output

Control what VULQN posts on the PR.

"output": {
"updatePrDescription": true,
"postSummary": true
}
FieldTypeDefaultDescription
updatePrDescriptionbooleantrueUpdate the PR description with a VULQN review section
postSummarybooleantruePost a summary comment on the PR

Full example

{
"version": 1,
"ignore": {
"pathPrefixes": ["docs/", "scripts/"],
"extensions": [".generated.ts"],
"filenames": ["schema.graphql"]
},
"focus": {
"paths": ["src/", "packages/"]
},
"rules": [
{
"paths": ["src/auth/"],
"instructions": "Flag any hardcoded credentials or tokens. Check all auth flows handle token expiry."
}
],
"scoring": {
"criticalPenalty": 30,
"mediumPenalty": 8,
"praiseBonus": 5,
"praiseCap": 15
},
"confidence": {
"failOnCritical": true,
"failBelowScore": 75,
"minFindingConfidence": "medium"
},
"trigger": {
"skipDrafts": true,
"targetBranches": ["main"],
"skipAuthors": ["dependabot[bot]", "renovate[bot]"]
},
"output": {
"updatePrDescription": true,
"postSummary": true
}
}