问题
三个 capability manifest 直接把 epoch 秒的时间戳写进 provenance.marketTime,
而该字段在所有其它产出方都是 epoch 毫秒。
// packages/shared/src/capabilities/manifests/market-kline.ts:51
marketTime: klines[klines.length - 1]?.timestamp
// packages/shared/src/capabilities/manifests/market-intraday.ts:32
marketTime: data[data.length - 1]?.timestamp
// packages/shared/src/capabilities/manifests/research-news.ts:37
marketTime: news[0]?.timestamp
marketTime 是毫秒而非秒的依据
market-quote.ts:51 写 marketTime: quote.timestamp * 1000;
- longbridge adapter 的
marketTimeMsFrom() 名字就带 Ms,实现是 return seconds * 1000;
- 同一个 provenance 对象里的
fetchedAt 是 Date.now(),即毫秒。
这些 timestamp 是秒的依据
同文件的格式化函数都乘了 1000:
market-kline.ts:66 — new Date(kline.timestamp * 1000).toLocaleDateString()
market-intraday.ts:47 — new Date(item.timestamp * 1000).toLocaleTimeString()
research-news.ts:54 — new Date(item.timestamp * 1000).toLocaleString()
复现
const cap = createMarketKlineCapability(fetchers({
getKline: async () => [{ symbol: 'AAPL.US', timestamp: 1710000000, open: 2, high: 2, low: 2, close: 2, volume: 2 }],
}))
const result = await cap.execute({ symbol: 'AAPL.US' }, { now: () => 12345 })
result.provenance.marketTime
- 实际:
1710000000
- 预期:
1710000000000
影响
buildFinancialEvidence()(packages/shared/src/evidence/financial-evidence.ts:54):
const asOf = numberValue(provenance.marketTime) ?? inferAsOf(result.data);
直接把 marketTime 当作证据信封的 asOf。所以 kline / intraday / news 三类证据的
asOf 比正确值小 1000 倍(1.71e9 而非 1.71e12)——按日期渲染或做新鲜度比较时会
落到 1970 年。research/runner.ts:355 也把这个值原样带上。
预期修复
三处统一改为 latest.timestamp * 1000,序列为空时保持 undefined。
(注:phase-two.ts 里 market.trades / market.capitalFlow 有同样的写法,但那些
类型的时间戳单位没有同文件证据可以确认,本次不一并改动,留待单独确认。)
环境
问题
三个 capability manifest 直接把 epoch 秒的时间戳写进
provenance.marketTime,而该字段在所有其它产出方都是 epoch 毫秒。
marketTime是毫秒而非秒的依据market-quote.ts:51写marketTime: quote.timestamp * 1000;marketTimeMsFrom()名字就带Ms,实现是return seconds * 1000;fetchedAt是Date.now(),即毫秒。这些 timestamp 是秒的依据
同文件的格式化函数都乘了 1000:
market-kline.ts:66—new Date(kline.timestamp * 1000).toLocaleDateString()market-intraday.ts:47—new Date(item.timestamp * 1000).toLocaleTimeString()research-news.ts:54—new Date(item.timestamp * 1000).toLocaleString()复现
17100000001710000000000影响
buildFinancialEvidence()(packages/shared/src/evidence/financial-evidence.ts:54):直接把
marketTime当作证据信封的asOf。所以 kline / intraday / news 三类证据的asOf比正确值小 1000 倍(1.71e9 而非 1.71e12)——按日期渲染或做新鲜度比较时会落到 1970 年。
research/runner.ts:355也把这个值原样带上。预期修复
三处统一改为
latest.timestamp * 1000,序列为空时保持undefined。(注:
phase-two.ts里market.trades/market.capitalFlow有同样的写法,但那些类型的时间戳单位没有同文件证据可以确认,本次不一并改动,留待单独确认。)
环境