Sync dividend data from Fidelity CSV to Dividends sheet. Reads dividend.csv from notebooks/updates/, calculates actual dividends received (shares × amount per share), writes to input area (rows 2-46), then clicks Add Dividend button to process. Triggers on sync dividends, update dividends, dividend tracker, layer 2 income, or monthly dividend analysis.
Read received-dividend records from the local DB transactions table (refreshed sync-first) and report Layer 2 income against target.
family_office.db is the system of record. The Dividends sheet and its Apps Script automation were retired 2026-07-31.
Dividend records come from the DB, refreshed FIRST so income can never be stale. Follow the shared Sync-First + DB-Read pattern.
uv run python -m src.integrations.snaptrade.sync_transactions_db # writes transactions
uv run python -m src.integrations.snaptrade.sync_transactions_db --show # confirm freshness
Completion criterion: the sync command reports success before any dividend is read.
Do not gate on MAX(synced_at) advancing. The activities sync is idempotent
via dedupe_key and only stamps rows it actually writes, so a run that finds no
new activity leaves the timestamp untouched. Verified 2026-08-04: the sync
reported 2690 fetched, 0 new, 2690 duplicates skipped and MAX(synced_at)
stayed at the prior run's value. That is a healthy no-op, not a stale table.
Read the command's own output line instead:
N new greater than 0, timestamp advances → new activity ingested.0 new, N duplicates skipped → already complete, timestamp correctly unchanged.Completeness is guaranteed by the dedupe key, not by the stamp.
Month-end lag: distributions post over several days, so the current month is incomplete until roughly the 3rd or 4th of the following month. On 2026-07-31, July read 30 payments at month-end; the month actually closed at 42 payments, about 17% higher. Never compare a partial current month against completed prior months, and never call a month-over-month decline until the month has closed.
sqlite3 family_office.db \
"SELECT date, symbol, amount, description FROM transactions WHERE type = 'DIVIDEND' ORDER BY date;"
Each row carries date, symbol, amount, and description. Null-symbol dividends already have a ticker resolved during the activities sync (parsed from the description, for example ... ETF (SCHD), mirroring the positions/options symbol fallback), so symbol is reliable.
Dedupe needs no external ledger: the activities sync is idempotent via dedupe_key, so re-running never double-counts.
Aggregate by ticker and month:
sqlite3 family_office.db \
"SELECT strftime('%Y-%m', date) AS month, symbol, ROUND(SUM(amount), 2) AS received
FROM transactions WHERE type = 'DIVIDEND'
GROUP BY month, symbol ORDER BY month DESC, received DESC;"
Monthly total against the Layer 2 target:
sqlite3 family_office.db \
"SELECT strftime('%Y-%m', date) AS month, ROUND(SUM(amount), 2) AS total
FROM transactions WHERE type = 'DIVIDEND' GROUP BY month ORDER BY month DESC LIMIT 12;"
Dividend income against margin interest is the coverage ratio that drives the scaling triggers. See the margin-management skill; do not recompute the thresholds here.
imports/Dividend_Positions_MMM-DD-YYYY.csv (the Fidelity dividend view export) remains a manual reconciliation source if the live activities sync is unavailable. It is not the primary path.
user-profile.yaml.claude/skills/_shared/SyncFirstDbRead.mdfin-guru/data/modern-income-vehicles.mdEducational purposes only. Not investment advice. Dividend distributions are not guaranteed, past yield does not predict future income, and options-based income funds carry risk of principal loss. Consult licensed financial and tax professionals before acting.
Skill Type: Domain (workflow guidance) Enforcement: SUGGEST Priority: High
下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Category:stocks-finance