From 60d96bb69f559bffd0472f448422e115ae64a4e5 Mon Sep 17 00:00:00 2001 From: JeremyDev87 Date: Tue, 5 May 2026 21:17:18 +0900 Subject: [PATCH] =?UTF-8?q?fix(core):=20duplicate=20=ED=99=95=EC=A0=95=20?= =?UTF-8?q?=EC=A0=88=EA=B0=90=20=EC=82=B0=EC=8B=9D=20=EB=B3=B4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lockfile-only duplicate가 confirmed initial payload와 LCP 개선 추정에 포함되지 않도록 reportSummary 산식을 보정한다. Closes #93 --- .../legolas-cli/tests/text_report_parity.rs | 8 ++++---- crates/legolas-core/src/report_summary.rs | 17 ++++++++++++++++- .../legolas-core/tests/intelligence_impact.rs | 19 ++++++++++++++----- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/crates/legolas-cli/tests/text_report_parity.rs b/crates/legolas-cli/tests/text_report_parity.rs index beab7cf..c9ba693 100644 --- a/crates/legolas-cli/tests/text_report_parity.rs +++ b/crates/legolas-cli/tests/text_report_parity.rs @@ -422,11 +422,11 @@ fn scan_report_confirms_production_likely_duplicate_savings_without_other_findin let ko_report = format_scan_report_for_language(&analysis, ReportLanguage::Ko); let en_report = format_scan_report_for_language(&analysis, ReportLanguage::En); - assert!(ko_report.contains("확정 초기 페이로드 절감: 약 48 KB")); - assert!(!ko_report.contains("확정 초기 페이로드 절감: 미확정")); + assert!(ko_report.contains("확정 초기 페이로드 절감: 미확정")); + assert!(!ko_report.contains("확정 초기 페이로드 절감: 약 48 KB")); assert!(ko_report.contains("초기 페이로드 절감 후보")); - assert!(en_report.contains("Confirmed initial payload savings: ~48 KB")); - assert!(!en_report.contains("Confirmed initial payload savings: not confirmed")); + assert!(en_report.contains("Confirmed initial payload savings: not confirmed")); + assert!(!en_report.contains("Confirmed initial payload savings: ~48 KB")); assert!(en_report.contains("initial payload candidate")); } diff --git a/crates/legolas-core/src/report_summary.rs b/crates/legolas-core/src/report_summary.rs index af40fd0..061c3b3 100644 --- a/crates/legolas-core/src/report_summary.rs +++ b/crates/legolas-core/src/report_summary.rs @@ -1,5 +1,6 @@ use crate::{ action_plan::rank_actions, + findings::FindingAnalysisSource, models::{ Analysis, DuplicateImpactScope, ReportSummary, ReportSummaryAction, ReportSummaryGroupSummary, ReportSummaryTextSource, @@ -53,7 +54,10 @@ fn build_group_summaries(analysis: &Analysis) -> Vec let production_duplicate_kb = analysis .duplicate_packages .iter() - .filter(|item| item.impact_scope == DuplicateImpactScope::ProductionLikely) + .filter(|item| { + item.impact_scope == DuplicateImpactScope::ProductionLikely + && confirms_initial_payload_savings(item.finding.analysis_source) + }) .map(|item| item.estimated_extra_kb) .sum(); let all_duplicate_kb = analysis @@ -100,6 +104,17 @@ fn build_group_summaries(analysis: &Analysis) -> Vec ] } +fn confirms_initial_payload_savings(analysis_source: Option) -> bool { + matches!( + analysis_source, + Some( + FindingAnalysisSource::SourceImport + | FindingAnalysisSource::Artifact + | FindingAnalysisSource::ArtifactSource + ) + ) +} + fn group_summary( key: &str, finding_count: usize, diff --git a/crates/legolas-core/tests/intelligence_impact.rs b/crates/legolas-core/tests/intelligence_impact.rs index 5c52397..346733f 100644 --- a/crates/legolas-core/tests/intelligence_impact.rs +++ b/crates/legolas-core/tests/intelligence_impact.rs @@ -167,7 +167,7 @@ fn estimate_impact_excludes_non_production_duplicate_savings_from_initial_payloa } #[test] -fn report_summary_separates_confirmed_initial_payload_from_directional_duplicate_opportunity() { +fn report_summary_excludes_lockfile_duplicates_from_confirmed_initial_payload() { let mut production_duplicate = duplicate_package_with_scope(50, DuplicateImpactScope::ProductionLikely); production_duplicate.finding = FindingMetadata::new( @@ -197,19 +197,28 @@ fn report_summary_separates_confirmed_initial_payload_from_directional_duplicate let summary = build_report_summary(&analysis); - assert_eq!(summary.verdict_key, "targeted-impact"); + assert_eq!(summary.verdict_key, "low-impact"); assert_eq!( summary.text_source.title_key, - "report.summary.targeted-impact.title" + "report.summary.low-impact.title" ); - assert_eq!(summary.confirmed_initial_payload_kb_saved, 50); + assert_eq!(summary.confirmed_initial_payload_kb_saved, 0); assert_eq!(summary.directional_opportunity_kb, 80); - assert_eq!(summary.estimated_lcp_improvement_ms, 105); + assert_eq!(summary.estimated_lcp_improvement_ms, 0); assert_eq!(summary.top_actions.len(), 2); assert_eq!( summary.top_actions[0].finding_id, "duplicate-package:prod-shared" ); + assert_eq!( + summary + .group_summaries + .iter() + .find(|group| group.key == "duplicate-packages") + .expect("duplicate group summary") + .confirmed_initial_payload_kb_saved, + 0 + ); assert_eq!( summary .group_summaries