From dda453ab5d047383ab24bf285631e948d9e35dcd Mon Sep 17 00:00:00 2001 From: Script Generator Date: Mon, 29 Jun 2026 18:23:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=B0=8F=E5=AE=9D=E9=A2=84=E8=AD=A6):=20?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=B6=8B=E5=8A=BF=E5=BF=AB=E7=85=A7=20Bug=20?= =?UTF-8?q?=E8=AE=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/lib/xiaobao-risk-trend.test.ts | 42 +++++++++++++++++++++++++ apps/web/lib/xiaobao-risk.ts | 9 ++++-- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/apps/web/lib/xiaobao-risk-trend.test.ts b/apps/web/lib/xiaobao-risk-trend.test.ts index 2370018..2424c11 100644 --- a/apps/web/lib/xiaobao-risk-trend.test.ts +++ b/apps/web/lib/xiaobao-risk-trend.test.ts @@ -1,6 +1,8 @@ import test from 'node:test'; import assert from 'node:assert/strict'; +import type { Bug } from './bug'; +import { calcXiaobaoVersionRisk } from './xiaobao-risk'; import { buildRiskSignature, summarizeRiskTrend } from './xiaobao-risk-trend'; import type { XiaobaoRiskSnapshot } from './xiaobao-risk-trend'; @@ -38,3 +40,43 @@ test('buildRiskSignature changes when score and bug counts change', () => { assert.notEqual(base, changed); }); + +test('calcXiaobaoVersionRisk uses all open bugs in the current trend snapshot signature', () => { + const now = new Date('2026-07-02T01:00:00.000Z'); + const risk = calcXiaobaoVersionRisk({ + version: { + id: 'ver-1', + name: 'V1.0', + expectedReleaseDate: '2026-07-03T10:00:00.000Z', + members: [{ name: 'Alice' }], + }, + devTasks: [], + testCases: [], + bugs: [bug({ severity: 'major', priority: 'P2' })], + now, + }); + + assert.equal(risk.signals.openBugCount, 1); + assert.equal(risk.signals.criticalBugCount, 0); + assert.equal(risk.currentSnapshot.openBugCount, 1); + assert.equal(buildRiskSignature(risk.currentSnapshot).split('|')[5], '1'); +}); + +function bug(patch: Partial = {}): Bug { + return { + id: 'bug-1', + bugNo: 'BUG-001', + versionId: 'ver-1', + testCaseId: 'tc-1', + title: 'Non-critical open bug', + description: 'Open but not critical.', + severity: 'major', + priority: 'P2', + reportedBy: 'qa-1', + assigneeId: 'dev-1', + status: 'open', + createdAt: '2026-07-01T09:00:00.000Z', + updatedAt: '2026-07-01T09:00:00.000Z', + ...patch, + }; +} diff --git a/apps/web/lib/xiaobao-risk.ts b/apps/web/lib/xiaobao-risk.ts index 4737997..1716610 100644 --- a/apps/web/lib/xiaobao-risk.ts +++ b/apps/web/lib/xiaobao-risk.ts @@ -60,6 +60,7 @@ export interface XiaobaoVersionRisk { silentRisks: SilentRisk[]; dailyEvidence?: VersionDailyEvidence; signals: XiaobaoRiskSignals; + currentSnapshot: XiaobaoRiskSnapshot; trend: { direction: 'up' | 'down' | 'flat' | 'unknown'; delta: number; @@ -198,19 +199,20 @@ export function calcXiaobaoVersionRisk(input: CalcXiaobaoVersionRiskInput): Xiao const hasBlockingRisk = criticalBugCount > 0 || blockedCount > 0; const riskLevel = getRiskLevel(riskScore, delayDays, hasBlockingRisk); const confidence = calcConfidence(input, devTasks, testCases, bugs); - const trend = summarizeRiskTrendWithCurrent(input.snapshots ?? [], { + const currentSnapshot: XiaobaoRiskSnapshot = { versionId: input.version.id, date: now.toISOString().slice(0, 10), riskScore, riskLevel, forecastReleaseDate, - openBugCount: signals.criticalBugCount, + openBugCount: signals.openBugCount, failedTestCount: signals.failedTestCount, blockedCount: signals.blockedCount, silentRiskCount: signals.silentRiskCount, confidence, createdAt: now.toISOString(), - }); + }; + const trend = summarizeRiskTrendWithCurrent(input.snapshots ?? [], currentSnapshot); return { versionId: input.version.id, @@ -226,6 +228,7 @@ export function calcXiaobaoVersionRisk(input: CalcXiaobaoVersionRiskInput): Xiao silentRisks, dailyEvidence: input.dailyEvidence, signals, + currentSnapshot, trend, }; }