detection-as-code review

Your detection rules deserve a code review.

DetectionLint reads a rule the way a senior detection engineer would: it flags the logic that will page someone at 3am, scores the false-positive risk, and hands you a diff that keeps the intent.

22 Sigma checks5 query languages20 free analyses a month

rules/windows/proc_creation_win_ps_download.ymlsigma
score58fp risk6/10att&ck—NEEDS REVIEW
14

what gets flagged

Twenty-two checks, written by people who have been paged.

Every finding has a name, a severity and a line number, so a reviewer can argue with it. This is the full Sigma rule set; KQL, SPL, YARA-L and EQL carry their own.

error7

  • missing-title

    Every Sigma rule must have a title.

  • missing-logsource

    Without a logsource the SIEM does not know where to apply it.

  • missing-condition

    The detection block has no condition.

  • condition-syntax-error

    The condition is not valid Sigma syntax.

  • unknown-selection-reference

    The condition names a selection that does not exist.

  • empty-selection

    A selection with no predicates matches everything.

  • condition-always-true

    A condition that references no selections is trivially true or false.

warning11

  • broad-process-no-parent-filter

    powershell, cmd or rundll32 with no parent image filter.

  • unanchored-regex

    Regex without anchors gets expensive at SIEM scale.

  • single-wildcard-value

    A bare "*" value matches everything.

  • extension-only-match

    Matching only on file extension misses renamed binaries.

  • mutually-exclusive-values

    AND-ed equality on one field with different values can never match.

  • keyword-list-without-logsource-narrowing

    Bare keyword lists match across the whole event.

  • unreferenced-selection

    A selection block is never used in the condition.

  • missing-id

    Rules should carry a stable UUID.

  • invalid-id

    The id field is not a UUID.

  • missing-level

    No severity level declared.

  • deprecated-status

    Deprecated or unsupported rules should be removed.

info4

  • missing-attack-tag

    No ATT&CK technique tag for coverage mapping.

  • cmdline-equals-instead-of-contains

    CommandLine usually wants |contains, not equality.

  • case-sensitive-match-on-windows-path

    Lowercase-only Windows paths miss attacker variations.

  • vague-description

    The description names an indicator, not the attack it catches.

Errors block the gate. Warnings and info lower the score and show up in the review.

52

where it runs

In the editor, over the API, before the merge.

The same analyzer sits behind all three, so the score you see in the browser is the score your pipeline enforces.

/analyze

The editor

Paste or write a rule, see findings inline next to the line that caused them, and apply the suggested fix as a diff.

# findings
L9  warning  broad-process-no-parent-filter
L1  info     missing-attack-tag

# suggest fix
+ ParentImage|endswith: '\winword.exe'

POST /api/analyze

The API

Send rule source with your key and get the lint findings, false-positive score and ATT&CK techniques back as JSON.

curl https://detectionlint.org/api/analyze \
  -H "Authorization: Bearer $DL_KEY" \
  -d '{"source": "…", "language": "kql"}'

# → overallScore, lint.findings,
#   fp.fpScore, meta.attackTechniques

POST /api/analyze/batch

The pipeline

Score a whole rules directory in one call from CI, fail the job under a minimum score, and put a quality badge in the README.

# ci step: fail under 80
min=$(curl -s …/api/analyze/batch \
  -H "Authorization: Bearer $DL_KEY" \
  -d @rules.json \
  | jq '[.results[].overallScore] | min')
[ "$min" -ge 80 ] || exit 1
89

how the score works

One number, and you can see what it is made of.

The overall score blends static lint (60%) with a model-scored false-positive estimate (40%). Static facts the analyzer already proved are passed to the model as ground truth, so it can't contradict them.

lint · 60%98
fp risk · 40%2/10
Overall91
languagewhere it runsplan
SigmaYAML, any backendFree and paid
KQLMicrosoft Sentinel, DefenderPro and up
SPLSplunkPro and up
YARA-LGoogle SecOpsPro and up
EQLElasticPro and up
131

public library

Start from rules someone already reviewed.

Curated rules from public repositories, each pre-scored with quality, false-positive risk and ATT&CK coverage. Fork one into your private library and keep reviewing from there.

176

pricing

Free for the rule you're fixing today.

Upgrade when you want every language, a private library, the API, or a gate the whole team shares.

Free

For learning and one-off checks.

$0/mo
  • 20 rule analyses / month
  • All 22 lint rules
  • 3 AI "Suggest fix" / mo
  • FP score + ATT&CK mapping
  • Public library access
  • Community support
Start free
most picked

Pro

Solo detection engineers.

$15/mo
  • Unlimited rule analyses
  • 100 AI "Suggest fix" / mo, all languages
  • Private rule library
  • API access (100/day)
  • Email support
Upgrade to Pro

Team

Detection teams, 3+ people.

$39/seat/mo
  • Everything in Pro
  • Shared team library
  • Seat-based access controls
  • OIDC SSO (Google, GitHub)
  • Audit logs
  • 500 AI fixes / seat / mo
Start team trial

Enterprise

20+ engineers, compliance-heavy.

$799+ /mo
  • Everything in Team
  • On-prem rule pack export
  • Security questionnaire & whitepaper
  • Extended audit log retention
  • Custom ATT&CK taxonomy
  • Dedicated support
Contact sales

Paste one rule. Read the review.

Twenty analyses a month on the free plan, no card. Bring the rule that pages you most.