问题
buildBrief() 产生的「需要你注意」条目里会混入往日的自动化运行——昨天甚至上周的 run 会被当成今天需要注意的事,并把摘要里的计数一起抬高。
同一个函数对同一个 inputs.runs 数组用了两种口径:
packages/shared/src/automation/brief.ts:101 的 quiet 统计走 latestRunsForCurrentDay(inputs.runs, now);该私有函数的文档注释就在 :221:"Use only the latest successful run per rule on the brief's local calendar day."
- 但
:97 的 automationItems(inputs)(实现见 :200)直接消费未过滤的 inputs.runs,只按 run.materialChanges > 0 || run.notified 过滤。
生产链路传入的是全量历史运行,没有任何日期上界:
apps/electron/src/main/kernelHost.ts:2249 automationBuildBrief() → :2251 this.automationRuns.list()(无参数)→ :2269 原样交给 buildBrief({ runs, ... })。
- 该函数同时被
apps/electron/src/main/index.ts:552 的 automation:buildBrief IPC 暴露,渲染侧 packages/ui/src/client/automation.ts:119 的 loadDailyBrief() 把它显示在 Today 页的「每日简报」区。
「每日通报」这一语义也体现在 buildBrief 自身的输出上:summary 文案是 "N things need your attention."(spec §27),而 now 参数默认 Date.now()、函数名为 Daily Brief。
复现
const now = 1_700_000_000_000
const dayMs = 24 * 60 * 60 * 1000
const stale = { ...run, id: 'stale-run', ruleId: 'rule-stale', ranAt: now - 7 * dayMs, materialChanges: 3, notified: true }
const today = { ...run, id: 'today-run', ruleId: 'rule-today', ranAt: now, materialChanges: 3, notified: true }
const brief = buildBrief({ runs: [stale, today], alerts: [], diffs: [], portfolio: [], movers: [] }, now)
- 实际:
brief.items 含 automation-stale-run 与 automation-today-run 两条;brief.summary === '2 things need your attention.'
- 预期:只含当天那条;
brief.summary === '1 thing needs your attention.'
用例已加入 packages/shared/src/automation/brief.test.ts:修复前 11 pass / 1 fail,修复后 12 pass / 0 fail。
建议修法
在 buildBrief 中只计算一次 latestRunsForCurrentDay(inputs.runs, now),把同一份结果同时喂给 automationItems 与 quiet 统计(消除两种口径)。
与其他 issue 的区别(避免重复)
环境
Bun 1.4.2 / Windows 11。bun test packages/shared/src/automation --isolate → 69 pass / 0 fail;bun run typecheck → 五工作区 exit 0。
问题
buildBrief()产生的「需要你注意」条目里会混入往日的自动化运行——昨天甚至上周的 run 会被当成今天需要注意的事,并把摘要里的计数一起抬高。同一个函数对同一个
inputs.runs数组用了两种口径:packages/shared/src/automation/brief.ts:101的 quiet 统计走latestRunsForCurrentDay(inputs.runs, now);该私有函数的文档注释就在:221:"Use only the latest successful run per rule on the brief's local calendar day.":97的automationItems(inputs)(实现见:200)直接消费未过滤的inputs.runs,只按run.materialChanges > 0 || run.notified过滤。生产链路传入的是全量历史运行,没有任何日期上界:
apps/electron/src/main/kernelHost.ts:2249automationBuildBrief()→:2251this.automationRuns.list()(无参数)→:2269原样交给buildBrief({ runs, ... })。apps/electron/src/main/index.ts:552的automation:buildBriefIPC 暴露,渲染侧packages/ui/src/client/automation.ts:119的loadDailyBrief()把它显示在 Today 页的「每日简报」区。「每日通报」这一语义也体现在
buildBrief自身的输出上:summary文案是"N things need your attention."(spec §27),而now参数默认Date.now()、函数名为 Daily Brief。复现
brief.items含automation-stale-run与automation-today-run两条;brief.summary === '2 things need your attention.'brief.summary === '1 thing needs your attention.'用例已加入
packages/shared/src/automation/brief.test.ts:修复前 11 pass / 1 fail,修复后 12 pass / 0 fail。建议修法
在
buildBrief中只计算一次latestRunsForCurrentDay(inputs.runs, now),把同一份结果同时喂给automationItems与 quiet 统计(消除两种口径)。与其他 issue 的区别(避免重复)
claimed):根因是调度器的内存去重 map 未持久化、且缺少 in-flight 锁,导致同一天重复执行规则;本 issue 不动调度器,只指出简报渲染阶段的日期口径缺失。calendarProbe缺时间下界,历史财报事件每天重复触发研究与通知;位于探测层,与本处无关。环境
Bun 1.4.2 / Windows 11。
bun test packages/shared/src/automation --isolate→ 69 pass / 0 fail;bun run typecheck→ 五工作区 exit 0。