Skip to content

feat: 新增金融事实语义封套 FinancialFact 并接入行情/财务能力 (close #24) - #82

Open
xuilen wants to merge 1 commit into
helsome:mainfrom
xuilen:feat/financial-fact-envelope
Open

feat: 新增金融事实语义封套 FinancialFact 并接入行情/财务能力 (close #24)#82
xuilen wants to merge 1 commit into
helsome:mainfrom
xuilen:feat/financial-fact-envelope

Conversation

@xuilen

@xuilen xuilen commented Sep 11, 2026

Copy link
Copy Markdown

背景

实现 issue #24「定义 freshness / market-session / currency / adjustment 语义」。此前 Quote/Kline/财务指标/估值是散落的裸结构,货币、单位、调整口径、时效性都靠自由文本或约定,Agent/UI 无法可靠回答「什么时间、什么货币、什么口径」。

改动

  • 新增 packages/core/src/financial-fact.ts:统一 FinancialFact 封套
    • instrumentId / metric / value + 结构化 unit(currency/percent/basis-points/ratio/shares/count/scaled)
    • asOf(数据自身时间戳)与 retrievedAt(抓取时间)分离,绝不用本地 Date.now() 冒充 asOf
    • timing(live/delayed/eod/historical/unknown)、exchangeTimezonemarketSession
    • FiscalPeriod(quarter/fy/ttm/annual)结构化解析
    • adjustment(raw/split-adjusted/dividend-adjusted/…)显式标记,缺省 unknown 而非猜测
    • convertCurrency 保留原生 value/currency + 换算来源/汇率/汇率时点
    • computeStale 按 timing 判定过期,供 UI/Agent 识别
  • 新增 financial-fact-factories.ts:Quote/Kline/FinancialReport/CalcIndex → facts 的唯一定义处
  • 接入 4 个能力 manifest(quote/kline/financials/valuation),summary 追加 describeFactCapabilityResult 新增可选 facts[](向后兼容)
  • 非目标(遵循 issue):缺省元数据一律显式 unknown,从不猜测

测试报告

  • Bun 1.4.2 / Windows 11
  • bun test packages/core → 27 pass / 0 fail(新增)
  • bun test packages/shared/src/capabilities packages/shared/src/agent → 75 pass / 1 fail
    • 1 个失败为 pi-runtime-agent-backend.test.ts:529 的 Windows 路径分隔符基线问题(/tmp/pi/s1.jsonl vs \tmp\pi\s1.jsonl),在 main 上即可复现,与本改动无关
  • bunx tsc --noEmit:core / shared / longbridge-tools / pi-extension / ui / i18n / skill-hub 全部通过

验收对照

  • 行情/K线/财务统一语义 ✅ | live/delayed/EOD 可区分 ✅ | asOf 与 retrievedAt 分离 ✅
  • 货币/单位结构化(非自由文本)✅ | 调整口径 raw/adjusted 不静默混用 ✅ | stale 可被消费 ✅
  • 四类测试:跨币种 / 延迟行情 / 财期 / 调整 ✅

定义统一的 FinancialFact 封套, 使每个金融事实(行情/K线/财务指标/估值)都携带:
- 规范化 instrumentId、metric、value、结构化 unit(currency/percent/basis-points/ratio/shares/scaled)
- 原生 currency, 以及 asOf(数据自身时间戳) 与 retrievedAt(抓取时间) 分离, 绝不用本地 Date.now() 冒充 asOf
- timing(live/delayed/eod/historical) 与 exchangeTimezone/marketSession 区分实时性
- 财务事实的 FiscalPeriod(quarter/fy/ttm/annual) 结构化解析
- raw/split-adjusted/dividend-adjusted 调整口径显式标记, 默认 unknown 而非猜测
- FX 换算 convertCurrency 保留原生 value/currency 与换算来源/汇率/汇率时点
- computeStale 按 timing 判定 stale, 供 UI/Agent 识别过期数据

将封套接入 quote/kline/financials/valuation 四个能力 manifest, 使 summary 能回答"何时/何种货币/何种口径"。缺省元数据一律显式标记 unknown, 绝不猜测。

新增 27 个单测(computeStale/convertCurrency/isPriceSeries/markUnknown/describeFact 及各 factory 映射), 全部通过。

@helsome helsome left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

测试报告格式本身合格,但这条现在有一个需要先修的主干兼容问题:刚合入的 #59 已建立 canonical instrument identity,并在行情等结构上携带 instrumentId。你当前 quoteToFacts / klineToFacts 仍直接把 provider symbol(例如 NVDA.US)写成 FinancialFact.instrumentId,会把 canonical identity 又退回 ticker/provider symbol,导致 evidence/fact 关联出现两套身份。

请先 rebase 最新 main,并让 fact factory 优先使用上游 canonical instrumentId;只有确实没有 canonical identity 时才显式 fallback/unknown,不要把 symbol 冒充 canonical id。随后用 Bun 1.4.2 重跑现有 core + capability focused tests 即可。另外你报告里的 Windows path baseline 已被刚合入的 #70 修过,rebase 后请更新这一条测试结果。无需扩大成真实 provider E2E。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants