diff --git a/apps/web/lib/xiaobao-risk.test.ts b/apps/web/lib/xiaobao-risk.test.ts index b80ccea..78d9dfe 100644 --- a/apps/web/lib/xiaobao-risk.test.ts +++ b/apps/web/lib/xiaobao-risk.test.ts @@ -4,6 +4,7 @@ import { calcXiaobaoVersionRisk } from './xiaobao-risk'; import type { DevTask } from './dev-task'; import type { TestCase } from './test-case'; import type { Bug } from './bug'; +import type { VersionDailyEvidence } from './xiaobao-risk-evidence'; function version(patch: any = {}) { return { @@ -104,3 +105,26 @@ test('calcXiaobaoVersionRisk marks blocked when critical Bug / blocked dev task assert.ok(risk.reasons.some((reason: { key: string }) => reason.key === 'critical_bug')); assert.ok(risk.reasons.some((reason: { key: string }) => reason.key === 'blocked_work')); }); + +test('calcXiaobaoVersionRisk preserves daily evidence on the returned risk object', () => { + const dailyEvidence: VersionDailyEvidence = { + todayDeliveries: [{ id: 'ev-1', title: '提交提测', summary: '完成核心流程', occurredAt: '2026-07-02T02:00:00.000Z' }], + todayProgress: [], + todayRisks: [], + progressNotes: [], + needsProgressItems: [], + recentActivityCount: 1, + lastActivityAt: '2026-07-02T02:00:00.000Z', + }; + + const risk = calcXiaobaoVersionRisk({ + version: version(), + devTasks: [], + testCases: [], + bugs: [], + dailyEvidence, + now: new Date('2026-07-02T01:00:00.000Z'), + }); + + assert.equal(risk.dailyEvidence, dailyEvidence); +}); diff --git a/apps/web/lib/xiaobao-risk.ts b/apps/web/lib/xiaobao-risk.ts index c647a95..0b151e6 100644 --- a/apps/web/lib/xiaobao-risk.ts +++ b/apps/web/lib/xiaobao-risk.ts @@ -3,6 +3,7 @@ import type { DevTask } from './dev-task'; import { STATUS_PROGRESS, getEstimateHours } from './dev-task'; import type { TestCase } from './test-case'; import { getTestCaseEstimateHours } from './test-case'; +import type { VersionDailyEvidence } from './xiaobao-risk-evidence'; import { WORK_HOURS, addWorkHours } from './work-hours'; export type XiaobaoRiskLevel = 'on_track' | 'attention' | 'at_risk' | 'likely_delayed' | 'blocked'; @@ -55,6 +56,7 @@ export interface XiaobaoVersionRisk { remainingWorkHours: number; reasons: RiskReason[]; silentRisks: SilentRisk[]; + dailyEvidence?: VersionDailyEvidence; signals: XiaobaoRiskSignals; trend: { direction: 'up' | 'down' | 'flat' | 'unknown'; @@ -71,6 +73,7 @@ export interface CalcXiaobaoVersionRiskInput { now?: Date; snapshots?: Array<{ riskScore: number; createdAt?: string; date?: string }>; silentRisks?: SilentRisk[]; + dailyEvidence?: VersionDailyEvidence; recentActivityCount?: number; lastActivityAt?: string; } @@ -197,6 +200,7 @@ export function calcXiaobaoVersionRisk(input: CalcXiaobaoVersionRiskInput): Xiao remainingWorkHours, reasons, silentRisks, + dailyEvidence: input.dailyEvidence, signals, trend, };