Skip to main content

Risk Tape v1 — Data Quality Scoring

Source: src/modules/riskTape/dataQuality.ts

Scoring formula

overall_score = Completeness (max 70) + ND Usage (max 20) + Consistency (max 10)

1. Completeness (70 points)

Measures how many of the 19 Tier A fields are present:

completeness = 70 × (fields_present / 19)

Cap: If track_record_months < 6, completeness is capped at 40 regardless of field presence.

The 19 Tier A fields are:

#Path
1schema_version
2as_of_date
3obligor.obligor_id
4obligor.jurisdiction
5cashflow_summary.currency
6cashflow_summary.track_record_months
7cashflow_summary.income_30d
8cashflow_summary.income_90d
9risk_profile.avg_monthly_revenue
10risk_profile.volatility_cv_12m
11risk_profile.max_drawdown_pct_36m
12risk_profile.platform_concentration_index
13risk_profile.top_platform_share
14risk_profile.track_record_months
15eligibility.rbf.eligible
16eligibility.rbf.risk_tier
17eligibility.rbf.max_advance_amount
18eligibility.rbf.max_revenue_share_pct
19eligibility.rbf.payback_cap_multiple

2. ND Usage (20 points)

Deducts 1 point for each ND2, ND3, or ND4 code found in cashflow_summary.revenue_monthly items:

nd_component = max(0, 20 - penalty_count)

ND1 (not applicable) does not penalise.

3. Consistency (10 points)

Deducts 2 points for each failed sanity check:

CheckFlag if failed
income_30d < 0negative_income_30d
income_90d < 0negative_income_90d
avg_monthly_revenue < 0negative_avg_monthly_revenue
volatility_cv_12m < 0invalid_volatility_cv
platform_concentration_index outside 0–1platform_concentration_out_of_range
top_platform_share outside 0–1top_platform_share_out_of_range
max_drawdown_pct_36m outside 0–1max_drawdown_out_of_range
consistency_component = max(0, 10 - 2 × failed_checks)

Score interpretation

ScoreMeaning
90–100Excellent — all Tier A fields present, clean data
70–89Good — minor gaps or a few ND codes
50–69Fair — some Tier A fields missing or short track record
0–49Poor — significant data gaps, likely ineligible

JSON schema validation

After scoring, the tape is validated against risk-tape-v1.json using AJV. If validation fails:

  • data_quality.blocking_validation_failed = true
  • data_quality.quality_flags includes json_schema_validation_failed
  • status is set to "failed"

Source: src/modules/riskTape/validator.ts