用途:把投资活动(transactions 表)与银行卡/银行支出(bank_transactions 表)刷新进 family_office.db,并据此做预算与消费审查。family_office.db 是唯一记录源,Google Sheets 导出已于 2026-07-31 停用。
主要能力:先同步后读取。投资活动来自 SnapTrade,支出来自 SimpleFIN,支出行在同步时即由 categorize_expense() 自动分类。同步命令:uv run python -m src.integrations.snaptrade.sync_transactions_db;uv run python -m src.integrations.simplefin.sync_expenses_db --months 3;或一次刷新全部:uv run python -m src.integrations.refresh_all --months 3。完成标准是两条同步命令均报告成功,不要以 MAX(synced_at) 是否推进为判断依据,应读取输出中的插入/更新/跳过数量。
使用要点:两个数据源速度不同,bank_transactions 通常比 transactions 更新,后者可能滞后数天,且新鲜度按账户而异。不要因 transactions 中缺少某行就断定某事未发生,应先查 positions 的持仓变化,再查 bank_transactions 的现金腿,最后才读 transactions,并把最近几天视为不完整。消费审查需覆盖三条流:银行与卡账户、券商直接扣款(transactions 中 type='WITHDRAWAL')、已还款但未连接的卡;仅读 bank_transactions 会漏掉约四成支出。统计时排除还款与 NON_SPEND_CATEGORIES、BUSINESS_CATEGORIES,并检查两表是否重复计数。收入侧需剔除自有账户间转账。
限制:已还款但未连接的卡其消费不可见,连接但陈旧的卡(最后活动超过约一周)需视为可疑,引用总额时必须同时说明覆盖缺口。CSV 导入仅为归档与手动对账回退路径,非主流程。分类规则以 src/integrations/simplefin/categorize.py 为准,需与 CategoryRules.md 保持同步。