KPI / KRI Catalogue (rendered)
Generated from config/metrics.yaml by tools/metrics/render.py. Do not edit by hand.
Targets and thresholds are defaults: agree them with whoever governs your security programme.
Design rules: no metric rewards finding fewer issues; every metric is computed by the platform from its ledgers; reporting is at team, application or business unit level, never per person (TOM section 7).
33 metrics: 21 KPI, 3 context, 9 KRI.
Coverage
| ID |
Metric |
Kind |
Definition |
Unit |
Target / threshold |
Frequency |
Owner |
Anti-gaming |
| COV-01 |
Registry coverage |
kpi |
Registered production applications ÷ discovered production applications (deployments to prod environments + cloud workloads) |
percent |
tier_1_2: 100, all: 90 |
monthly |
appsec_lead |
Denominator comes from discovery (E02), not from the registry itself, so not registering does not help. |
| COV-02 |
Repository onboarding |
kpi |
Active repositories (push in 90 days) linked to an application and running a trusted security-workflows pin ÷ active repositories |
percent |
all: 90 |
monthly |
platform_po |
Archiving active repos to shrink the denominator is visible in the repo-archive trend. |
| COV-03 |
Critical applications assessed |
kpi |
Tier 1 apps with an approved SAMM application assessment in the last 12 months ÷ Tier 1 apps |
percent |
tier_1: 100 |
quarterly |
appsec_lead |
Assessments require an approver outside the team (M2). |
| COV-04 |
Threat-model coverage |
kpi |
Tier 1/2 apps with ASC-TM-01 and ASC-TM-02 satisfied ÷ Tier 1/2 apps |
percent |
tier_1: 100, tier_2: 80 |
monthly |
appsec_lead |
Review evidence is bound to the commit of the reviewed files and invalidated by architecture-change signals. |
Pipeline
| ID |
Metric |
Kind |
Definition |
Unit |
Target / threshold |
Frequency |
Owner |
Anti-gaming |
| PIP-01 |
SAST coverage |
kpi |
Applicable repos with ASC-BLD-01 satisfied (fresh C2+ evidence, all detected languages) ÷ applicable repos |
percent |
tier_1_2: 95, all: 85 |
weekly |
platform_po |
Language coverage is checked against detection, so partial scans don't count as full coverage. |
| PIP-02 |
SCA coverage |
kpi |
Applicable repos with ASC-BLD-02 satisfied ÷ applicable repos |
percent |
all: 95 |
weekly |
platform_po |
Ecosystem coverage checked against lockfile detection. |
| PIP-03 |
SBOM coverage |
kpi |
Deployed artifact digests with a current, quality-passing build SBOM ÷ deployed artifact digests |
percent |
tier_1_2: 95 |
weekly |
platform_po |
Quality gate (purl coverage, NTIA elements). Inconclusive SBOMs do not count. |
| PIP-04 |
DAST coverage |
kpi |
Deployed Tier 1/2 web/API apps with ASC-TST-01 satisfied ÷ deployed Tier 1/2 web/API apps |
percent |
tier_1_2: 90 |
monthly |
appsec_lead |
Scans crawling below threshold are INCONCLUSIVE and do not count. |
| PIP-05 |
Secrets protection coverage |
kpi |
Repos with secret scanning, push protection and validity checks enabled ÷ repos |
percent |
all: 100 |
weekly |
platform_po |
Read from GitHub settings (C1); enforced by org security configuration. |
Vulnerability
| ID |
Metric |
Kind |
Definition |
Unit |
Target / threshold |
Frequency |
Owner |
Anti-gaming |
| VUL-01 |
Open P1/P2 findings |
context |
Count of open findings by priority (contextual), by business unit |
count |
– |
weekly |
appsec_lead |
Context only, not a target. Reducing detection would lower it, so it is never used to rate teams. |
| VUL-02 |
Mean/median time to remediate (verified) |
kpi |
Detection → closure by verification evidence, median and p90, by priority |
days |
P1: 7, P2: 30 |
monthly |
unit_security_leads |
Closure requires re-scan evidence; ticket closure alone does not stop the clock. |
| VUL-03 |
SLA compliance |
kpi |
Findings remediated within SLA ÷ findings that fell due, by priority (excepted findings counted separately) |
percent |
P1: 95, P2: 90, P3: 90 |
monthly |
unit_security_leads |
Excepted findings are reported alongside, so exceptions can't hide breaches; renewals are tracked (VUL-06). |
| VUL-04 |
Recurring vulnerabilities |
kpi |
Findings reopened (same fingerprint) within 180 days of verified closure ÷ verified closures |
percent |
all: 5 |
quarterly |
appsec_lead |
Fingerprints are deterministic; regressions are detected automatically. |
| VUL-05 |
False-positive rate |
context |
Findings marked false positive ÷ triaged findings, by team and tool |
percent |
– |
quarterly |
appsec_lead |
P1/P2 FPs need a second reviewer; quarterly sampling. A high rate triggers tool tuning, not team rating. |
| VUL-06 |
Exception health |
kpi |
Active exceptions by priority, renewals > 1, median age |
count |
renewals_over_1: 0 |
monthly |
governance_analyst |
Expiry is automatic and creates findings. |
Maturity
| ID |
Metric |
Kind |
Definition |
Unit |
Target / threshold |
Frequency |
Owner |
Anti-gaming |
| MAT-01 |
Tier 1 apps meeting maturity target |
kpi |
Tier 1 apps whose SAMM practice scores all meet config/samm-targets.yaml ÷ Tier 1 apps |
percent |
baseline_plus_points_at_18m: 30 |
monthly |
appsec_lead |
Manual answers are capped by automated evidence; provenance is shown alongside. |
| MAT-02 |
SAMM maturity by practice and business unit |
context |
Distribution (median, p25–p75) of application practice scores per business unit, plus trend |
score_0_3 |
– |
monthly |
appsec_lead |
Distributions, not rankings. Methodology changes are marked on trends. |
| MAT-03 |
Mandatory control coverage |
kpi |
Mandatory controls satisfied at required confidence ÷ applicable mandatory controls (observe-mode excluded) |
percent |
tier_1_2: 90 |
weekly |
appsec_lead |
N/A requires approval; excepted controls don't count as satisfied. |
Evidence
| ID |
Metric |
Kind |
Definition |
Unit |
Target / threshold |
Frequency |
Owner |
Anti-gaming |
| EVD-01 |
Evidence freshness |
kpi |
Evidence supporting mandatory controls in ACTIVE state ÷ total supporting evidence (ACTIVE + EXPIRING + EXPIRED) |
percent |
all: 95 |
weekly |
platform_po |
Freshness is computed by the platform from policy. |
| EVD-02 |
Missing evidence |
kpi |
Applicable mandatory (app, control) pairs in NO_EVIDENCE state |
count |
tier_1_2_after_onboarding_grace: 0 |
weekly |
platform_po |
NO_EVIDENCE is treated as worse than findings in all views. |
| EVD-03 |
Automated evidence share |
kpi |
Satisfied control states backed by C2/C3 evidence ÷ satisfied control states |
percent |
all: 75 |
monthly |
appsec_lead |
Confidence is assigned by the platform, never declared. |
| EVD-04 |
Evaluator calibration agreement |
kpi |
Sampled SATISFIED states confirmed by manual AppSec check ÷ sampled |
percent |
all: 97 |
quarterly |
appsec_lead |
Random sample chosen by the platform. |
People
| ID |
Metric |
Kind |
Definition |
Unit |
Target / threshold |
Frequency |
Owner |
Anti-gaming |
| PPL-01 |
Champion coverage |
kpi |
Teams owning Tier 1–3 apps with an active, trained champion ÷ such teams |
percent |
all: 90 |
quarterly |
appsec_lead |
Training completion from LMS, not self-declared. |
| PPL-02 |
Secure development training coverage |
kpi |
Recent contributors with current training ÷ recent contributors, per team (ASC-GOV-04) |
percent |
all: 90 |
quarterly |
unit_security_leads |
Team level only. |
Risk
| ID |
Metric |
Kind |
Definition |
Unit |
Target / threshold |
Frequency |
Owner |
Anti-gaming |
| KRI-01 |
KEV-listed vulnerabilities open on internet-facing apps |
kri |
Open findings whose vulnerability is CISA KEV-listed, on apps with exposure internet_* |
count |
escalate if > 0 for > 7 days |
daily |
ciso |
– |
| KRI-02 |
P1 findings past SLA |
kri |
Open P1 findings with sla_breached |
count |
escalate if > 0 |
daily |
ciso |
– |
| KRI-03 |
Expired exceptions not remediated |
kri |
exception_expired findings open > 7 days |
count |
escalate if > 0 |
weekly |
appsec_lead |
– |
| KRI-04 |
Dark applications |
kri |
Registered production apps with no evidence ingested in 30 days ÷ registered production apps |
percent |
escalate if > 5% |
weekly |
appsec_lead |
– |
| KRI-05 |
Unregistered repos with production deployments |
kri |
Repos deploying to production environments that are not linked to a registered application |
count |
escalate if > 0 for 14 days |
weekly |
appsec_lead |
– |
| KRI-06 |
Unattributed cloud findings |
kri |
High/critical cloud posture findings not attributable to an application ÷ all such findings |
percent |
escalate if > 20% |
weekly |
cloud_security |
– |
| KRI-07 |
Unmanaged tool suppressions |
kri |
Tool-level suppressions (DD risk accepted, GHAS dismissed, Checkov skip) without a platform exception |
count |
escalate if rising 3 consecutive months |
monthly |
appsec_lead |
– |
| KRI-08 |
Evidence integrity failures |
kri |
Daily verification job failures (hash chain or blob mismatch) |
count |
escalate if > 0 |
daily |
platform_po |
– |
| KRI-09 |
Stale connectors |
kri |
Connectors whose last success is older than 2× their schedule |
count |
escalate if > 0 for > 24h |
hourly |
platform_po |
– |