rebuild(migration): audit all legacy data

This commit is contained in:
leefer
2026-07-30 11:42:33 +08:00
parent 227028f499
commit 9e694ee34a
5 changed files with 1120 additions and 64 deletions
+9 -6
View File
@@ -2,18 +2,20 @@
## 交付边界
- 旧系统只作为只读来源;真实演练源为 `data/review.db`,目标为新建的 `next/data/stage14-migrated.db`
- 旧系统只作为只读来源;真实演练源为 `data/review.db`,目标为系统临时目录中的全新数据库
- 迁移逻辑仅存在于一次性工具 `tools/legacy_migration.py`,正常应用不导入旧系统代码或旧数据库。
- 新 Docker、备份和恢复资产仅位于 `next/`,没有停止、修改或替换 NAS 正式容器。
## 真实迁移结果
- 源库 SHA-256`b7c444359c3b9b201a47ce6b23e55ad7ca4eba3d9dd67dfc8544b575d43f4924`
- 源库 SHA-256`5dda9e1538acb7efbcc6a7dbdf201978699daf03ff4ccef4d0677732f2e2f1ab`。正式切换时必须先停写并重新生成最终哈希
- SQLite `integrity_check=ok`,外键违规 0。
- 3 个账号与会员状态、1 份出生资料、2 项系统数据凭据、3 个模型配置均已转换。
- 6 条自选、3 条复盘、2 条提醒、28 条问师消息、45 条问师偏好、31 条问天历史均已迁移并保留账号归属。
- 196 次历史选股与 16 条手动策略跟踪已迁移;每个历史交易日使用明确标注的归档因子快照,不伪造旧因子覆盖率。
- 5,534 个股票目录、261 个交易日、24 份市场摘要、5,567 份最近 90 根日 K 展示归档和 24 份兼容市场洞察已迁移。
- 5,534 个股票目录、394 个题材目录、261 个交易日、25 份市场摘要、5,579 份股票/题材日 K 展示归档和 47 份兼容市场洞察已迁移。
- 286 条 iFinD 事件原因修订、9 份板块成分股快照、12 份题材详情及成分股、14 个龙虎榜历史日期和 110 份游资档案可被新业务服务直接读取。
- 真实源库 36 张业务表及 24 种快照全部被分类;未分类表和未分类快照均为 0。报告同时记录逐表源行数、完整目标表行数和每项主动舍弃原因。
- 真实账号密码验证、管理员与永久会员状态、模型选择、问天历史和选股历史抽验通过。
- 逐项机器报告见 `real-migration-report.json`,报告不含明文令牌或模型密钥。
@@ -23,6 +25,7 @@
- 已取消的用户自主 LLM 配置不迁移。
- 旧原始因子表不复制成兼容表;由新系统受治理的数据同步和因子任务重建。
- 旧指数行仅有收盘价,缺少新图表契约要求的 OHLC,未伪造成指数 K 线。
- 旧库 36 条无用户归属的内置策略不复制;它们由当前唯一版本化产品策略目录取代。用户自建策略才进入 `custom_screener_strategies`196 次历史运行结果仍完整保留。
- 日 K 展示归档每个标的保留最近 90 根;旧全量数据库和一致性备份继续作为审计资产保留。
## 备份恢复演练
@@ -43,9 +46,9 @@
## 质量门
- Ruff:通过。
- pytest96 项通过。
- pytest106 项通过。
- Vue 类型检查:通过。
- Vitest:3 个文件、7 项通过。
- Vite 生产构建:通过,CSS 89.25KBJS 279.23KB,均为构建前原始体积。
- Playwright17 项通过,单 worker,耗时 53.6 秒。
- Vite 生产构建:通过,CSS 92.40KBJS 299.80KB,均为构建前原始体积。
- Playwright26 项通过,单 worker,耗时 147.3 秒。
- `git diff --check` 与已知令牌/密码扫描:通过。
@@ -1,51 +1,209 @@
{
"source": "C:\\Users\\MoBai\\Documents\\gupiaofupan\\webapp\\data\\review.db",
"target": "C:\\Users\\MoBai\\Documents\\gupiaofupan\\webapp\\next\\data\\stage14-migrated.db",
"source_sha256": "b7c444359c3b9b201a47ce6b23e55ad7ca4eba3d9dd67dfc8544b575d43f4924",
"target_sha256": "9b0ca7faed7a15b4099bd09ae7a0c94b52a0c8a7dbfedb9d2b26bdf47e34d5d2",
"target": "C:\\Users\\MoBai\\AppData\\Local\\Temp\\xiaobai-next-migration-evidence-aa6d37d29f7a4a77994b04de8b3b3e22.db",
"source_sha256": "5dda9e1538acb7efbcc6a7dbdf201978699daf03ff4ccef4d0677732f2e2f1ab",
"target_sha256": "615992f425bbbc304e9fea8e7d34c42ab8ef7d99156757864bbbc50c80886987",
"integrity": "ok",
"foreign_key_violations": 0,
"migrated": {
"alerts": 2,
"birth_profiles": 1,
"chart_series": 5567,
"chart_series": 5579,
"heaven_readings": 31,
"llm_models": 3,
"llm_usage_daily": 9,
"market_entities": 5534,
"market_insight_snapshots": 24,
"market_summaries": 24,
"market_event_revisions": 286,
"market_insight_snapshots": 47,
"market_summaries": 25,
"memberships": 3,
"mentor_messages": 28,
"mentor_preferences": 45,
"review_notes": 3,
"screener_runs": 196,
"sector_member_snapshots": 9,
"strategy_tracks": 16,
"system_credentials": 2,
"trading_days": 261,
"users": 3,
"watchlist_entries": 6
},
"target_counts": {
"users": 3,
"memberships": 3,
"market_entities": 5537,
"market_summaries": 24,
"chart_series": 5567,
"watchlist_entries": 6,
"review_notes": 3,
"trade_entries": 0,
"source_tables": {
"alerts": 2,
"mentor_messages": 28,
"assistant_messages": 0,
"auction_factors": 505070,
"benchmark_bars": 260,
"daily_bars": 1424973,
"daily_indicators": 764710,
"dashboard_snapshots": 25,
"data_snapshots": 422,
"earnings_events": 580,
"fundamental_indicators": 49481,
"heaven_readings": 31,
"job_runs": 1101,
"lhb_institution_daily": 47,
"llm_usage": 72,
"mentor_messages": 28,
"mentor_preferences": 45,
"moneyflow_daily": 31175,
"popularity_factors": 232,
"reason_overrides": 0,
"review_notes": 3,
"schema_migrations": 3,
"screener_runs": 196,
"custom_screener_strategies": 0,
"strategy_tracks": 16
"screener_strategies": 36,
"seat_aliases": 0,
"sector_phase_overrides": 0,
"stock_master": 5534,
"strategy_tracks": 16,
"sync_runs": 21053,
"system_settings": 1,
"trade_entries": 0,
"user_birth_profiles": 1,
"user_credentials": 1,
"user_sessions": 207,
"users": 3,
"watchlist": 6,
"wencai_saved_queries": 0
},
"intentionally_skipped": {
"sessions": "sessions are intentionally invalidated during cutover",
"handled_tables": [
"alerts",
"assistant_messages",
"daily_bars",
"dashboard_snapshots",
"data_snapshots",
"heaven_readings",
"llm_usage",
"mentor_messages",
"mentor_preferences",
"reason_overrides",
"review_notes",
"screener_runs",
"screener_strategies",
"seat_aliases",
"stock_master",
"strategy_tracks",
"system_settings",
"trade_entries",
"user_birth_profiles",
"users",
"watchlist"
],
"intentionally_skipped_tables": {
"auction_factors": "governed provider inputs are rebuilt by scheduled jobs",
"benchmark_bars": "legacy rows lack OHLC values required by the chart contract",
"daily_indicators": "governed provider inputs are rebuilt by scheduled jobs",
"earnings_events": "governed provider inputs are rebuilt by scheduled jobs",
"fundamental_indicators": "governed provider inputs are rebuilt by scheduled jobs",
"job_runs": "legacy operational logs are not user-facing history",
"lhb_institution_daily": "governed provider inputs are rebuilt by scheduled jobs",
"moneyflow_daily": "governed provider inputs are rebuilt by scheduled jobs",
"popularity_factors": "governed provider inputs are rebuilt by scheduled jobs",
"schema_migrations": "legacy implementation metadata does not apply to the new schema",
"sector_phase_overrides": "sector phase overrides are no longer product-configurable",
"sync_runs": "legacy operational logs are not user-facing history",
"user_credentials": "per-user LLM configuration was removed from the product",
"raw_factor_tables": "reproducible provider inputs are rebuilt by governed sync jobs",
"benchmark_bars": "legacy rows lack OHLC values required by the chart contract"
"user_sessions": "sessions are intentionally invalidated during cutover",
"wencai_saved_queries": "the WenCai feature was explicitly removed from the product"
},
"unmapped_tables": [],
"source_snapshot_kinds": {
"auction_center_v1": 2,
"auction_center_v2": 1,
"auction_center_v3": 1,
"auction_center_v4": 1,
"auction_center_v5": 5,
"auction_center_v6": 3,
"dashboard_request_v1": 2,
"dragon_tiger": 7,
"heaven_indices": 14,
"heaven_sector": 65,
"heaven_stock": 2,
"hot_money_detail_v2": 8,
"hot_money_detail_v3": 7,
"hot_money_profiles_v1": 1,
"ifind_event_enrichment_v1": 4,
"popularity_v1": 7,
"rotation_sector_members_v1": 9,
"screener_auto_v1": 3,
"search_directory": 1,
"stock_detail": 256,
"stock_intraday": 3,
"theme_detail_v1": 12,
"theme_directory_v1": 1,
"theme_library_v1": 7
},
"handled_snapshot_kinds": [
"auction_center_v1",
"auction_center_v2",
"auction_center_v3",
"auction_center_v4",
"auction_center_v5",
"auction_center_v6",
"dragon_tiger",
"hot_money_detail_v2",
"hot_money_detail_v3",
"hot_money_profiles_v1",
"ifind_event_enrichment_v1",
"popularity_v1",
"rotation_sector_members_v1",
"theme_detail_v1",
"theme_directory_v1",
"theme_library_v1"
],
"intentionally_skipped_snapshot_kinds": {
"dashboard_request_v1": "request cache is superseded by archived dashboard snapshots",
"heaven_indices": "rebuildable input cache; saved Heaven readings are migrated",
"heaven_sector": "rebuildable input cache; saved Heaven readings are migrated",
"heaven_stock": "rebuildable input cache; saved Heaven readings are migrated",
"screener_auto_v1": "derived cache is superseded by migrated screener runs",
"search_directory": "search data is rebuilt from the migrated entity directory",
"stock_detail": "rebuildable display cache",
"stock_intraday": "rebuildable realtime display cache"
},
"unmapped_snapshot_kinds": [],
"intentionally_skipped_rows": {
"screener_strategies_builtin": {
"count": 36,
"reason": "legacy built-ins are superseded by the single versioned product catalog; only user-created strategies are migrated"
}
},
"target_counts": {
"alerts": 2,
"birth_profiles": 1,
"chart_series": 5579,
"custom_screener_strategies": 0,
"heaven_readings": 31,
"job_runs": 0,
"llm_attempts": 0,
"llm_configuration": 1,
"llm_models": 3,
"llm_requests": 0,
"llm_usage_daily": 9,
"market_entities": 5931,
"market_event_revisions": 286,
"market_insight_snapshots": 47,
"market_summaries": 25,
"memberships": 3,
"mentor_messages": 28,
"mentor_preferences": 45,
"review_assistant_messages": 0,
"review_notes": 3,
"schema_migrations": 12,
"screener_factor_snapshots": 10,
"screener_factor_values": 0,
"screener_run_backtests": 0,
"screener_runs": 196,
"seat_aliases": 0,
"sector_member_snapshots": 9,
"sessions": 0,
"strategy_track_bars": 0,
"strategy_track_events": 0,
"strategy_tracks": 16,
"system_credentials": 2,
"trade_entries": 0,
"trading_days": 261,
"users": 3,
"watchlist_entries": 6
}
}