From 7e7fd15c67bc7c2b91311741545089b5574d5b31 Mon Sep 17 00:00:00 2001 From: mrizzi Date: Thu, 9 Apr 2026 09:45:37 +0200 Subject: [PATCH] fix(risk-assessment): store overall_score as 0-100 percentage for UI Keep all internal scoring on the 0-1 scale. Convert to 0-100 percentage only at the storage boundary in process_document() when writing to risk_assessment.overall_score. This ensures: - classify_risk_level works correctly for both overall and per-category - rating_label works correctly (accepts 0-1 with internal * 100) - The API returns 33.3 (not 0.333) so the UI shows "33%" - Single conversion point, no dual-scale confusion Implements JIRAPLAY-1434 Assisted-by: Claude Code --- modules/fundamental/src/risk_assessment/service/mod.rs | 5 +++-- modules/fundamental/src/risk_assessment/service/scoring.rs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/fundamental/src/risk_assessment/service/mod.rs b/modules/fundamental/src/risk_assessment/service/mod.rs index ed9746344..36b59ada2 100644 --- a/modules/fundamental/src/risk_assessment/service/mod.rs +++ b/modules/fundamental/src/risk_assessment/service/mod.rs @@ -476,11 +476,12 @@ impl RiskAssessmentService { .ok_or_else(|| Error::NotFound(assessment_id.to_string()))?; let scoring_result = scoring::compute_scoring_result(&results.categories); - let overall_score = scoring_result.overall.score; + // Convert 0.0-1.0 fraction to 0-100 percentage for the API/UI + let overall_score_pct = scoring_result.overall.score * 100.0; let assessment_update = risk_assessment::ActiveModel { id: Set(assessment_uuid), - overall_score: Set(Some(overall_score)), + overall_score: Set(Some(overall_score_pct)), status: Set("completed".to_string()), updated_at: Set(OffsetDateTime::now_utc()), ..Default::default() diff --git a/modules/fundamental/src/risk_assessment/service/scoring.rs b/modules/fundamental/src/risk_assessment/service/scoring.rs index cf6a7249d..5d2953727 100644 --- a/modules/fundamental/src/risk_assessment/service/scoring.rs +++ b/modules/fundamental/src/risk_assessment/service/scoring.rs @@ -213,7 +213,7 @@ mod tests { #[test] fn test_completeness_score_mixed() { - // 2 complete, 1 partial, 1 missing = (2*1.0 + 1*0.5) / 4 = 2.5/4 = 0.625 + // 2 complete, 1 partial, 1 missing = (2*1.0 + 1*0.5) / 4 = 0.625 let categories = vec![make_category_with_completeness( "sar", vec![