Scoring · cir-risk/0.1

Why is it high? Every point is on the page.

CIR scores are computed from the record, never typed in. Four inputs worth 0 to 3 points each, two sums, a few overrides. Simple enough to recompute in a meeting, fixed enough that a high means the same thing in every organization.

01

Try it

02

The four inputs

Severity, from corePoints
CVSS ≥ 9.03
CVSS ≥ 7.02
CVSS ≥ 4.01
CVSS < 4.00
No severity3
Exploitation, from threat_intelPoints
Active: in the wild or KEV listed3
Public: PoC, functional or weaponized2
None0
No threat_intel layer2
Exposure, from posturePoints
None: not affected, fixed, not deployedoverride
Contained: isolated, or a full validated block0
Controlled: internal, or a partial control2
Open3
No posture layer3
Impact, from contextPoints
Critical3
High2
Medium1
Low or none0
No context layer3

Severity keeps one CVSS score: issuer over vendor over nvd, then v4.0 over v3.1. Layers inherited through based_on count as present. The exact conditions are in the specification.

03

Two scores

severity + exploitationPublic priority, 0 to 6, stored in threat_intel.priority. Needs no organizational data: a CERT can publish it.
+ exposure + impactOrganizational risk, 0 to 12, stored in context.score.
round(points / max × 10, 1)Both become a value on 10.
Public priorityLevel
5 to 6critical
4high
2 to 3medium
0 to 1low
Organizational riskLevel
10 to 12critical
7 to 9high
4 to 6medium
0 to 3low

Overrides, in order

  1. Exposure none → level none, value 0. Nothing to fix here.
  2. Exploitation confirmed in the organization → level critical, value unchanged. It is an incident.
  3. KEV listed and exposure open → level at least high.
04

Built to be trusted

i.

Deterministic

Computed from the record fields only. Two tools reading the same record get the same score.

ii.

Explainable

Additive points, no weights, no curve. Anyone can recompute it on a whiteboard.

iii.

Versioned

A stored score names its method. Validators recompute it and reject a mismatch.

iv.

Comparable

An organization may add its own method, but cir-risk stays the shared reference.

An unknown risk is treated as a dangerous one.
Missing severity, posture or context count as the worst case, so filling posture or context can only lower a score