Parse, normalize, validate, and sync brokerage activity exports into typed Obsidian notes and Bases. Use for Betashares, Stake, CSV/XLSX exports, transaction histories, dividends, and idempotent import workflows for stock brokerage records.
Run this skill when brokerage exports need typed vault surfaces instead of a CSV pasted into an inbox note. brokerage_activity_kind is the supertag for economic events, while brokerage_asset_kind is the supertag for ticker-indexed asset notes derived from those events. The two surfaces stay synchronized through one idempotent import path.
obsidian help
qmd status
uvx --version
Fail fast if any dependency is missing. Do not mutate investment notes when the tooling is unavailable.
obsidian read path="20 Resources/Investments/Brokerage Activity/Brokerage Activity.base"
obsidian read path="20 Resources/Investments/Brokerage Assets/Brokerage Assets.base"
qmd query "brokerage activity investment ledger dividends portfolio" -c resources -l 8
qmd query "Betashares Stake brokerage dividends trading" -c inbox -l 5
Default read scope stays inside:
20 Resources/Investments/Brokerage Activity/**/*.md20 Resources/Investments/Brokerage Activity/Brokerage Activity.base20 Resources/Investments/Brokerage Assets/*.md20 Resources/Investments/Brokerage Assets/Brokerage Assets.baseuvx --from python --with pydantic --with pyyaml python \
.skills/obsidian-brokerage-activity-manager/scripts/validate_brokerage_activity.py \
--glob "20 Resources/Investments/Brokerage Activity/**/*.md"
Review invalid frontmatter and duplicate source_signature collisions before importing anything new.
Validate the derived asset surface too:
uvx --from python --with pydantic --with pyyaml python \
.skills/obsidian-brokerage-activity-manager/scripts/validate_brokerage_assets.py \
--glob "20 Resources/Investments/Brokerage Assets/*.md"
uvx --from python --with polars --with pydantic --with pyyaml python \
.skills/obsidian-brokerage-activity-manager/scripts/sync_brokerage_activity.py \
--input "brokerage-export.csv" \
--provider auto \
--mode check
The sync script:
source_signature instead of creating duplicate notes--column-mapuvx --from python --with polars --with pydantic --with pyyaml python \
.skills/obsidian-brokerage-activity-manager/scripts/sync_brokerage_activity.py \
--input "brokerage-export.csv" \
--provider auto \
--mode fix
When provider detection is too weak, pass an explicit mapping:
uvx --from python --with polars --with pydantic --with pyyaml python \
.skills/obsidian-brokerage-activity-manager/scripts/sync_brokerage_activity.py \
--input "future-broker.csv" \
--provider generic_csv \
--column-map '{"activity_date":"Executed At","activity_type":"Description","symbol":"Ticker","amount":"Net Amount","price":"Unit Price","quantity":"Units","status":"Status","currency":"Currency","brokerage":"Brokerage"}' \
--mode fix
uvx --from python --with pydantic --with pyyaml python \
.skills/obsidian-brokerage-activity-manager/scripts/render_brokerage_activity_base.py \
--output "20 Resources/Investments/Brokerage Activity/Brokerage Activity.base"
uvx --from python --with pydantic --with pyyaml python \
.skills/obsidian-brokerage-activity-manager/scripts/render_brokerage_assets_base.py \
--output "20 Resources/Investments/Brokerage Assets/Brokerage Assets.base"
The rendered Bases surface:
uvx --from python --with pydantic --with pyyaml python \
.skills/obsidian-brokerage-activity-manager/scripts/validate_brokerage_activity.py \
--glob "20 Resources/Investments/Brokerage Activity/**/*.md"
uvx --from python --with pydantic --with pyyaml python \
.skills/obsidian-brokerage-activity-manager/scripts/validate_brokerage_assets.py \
--glob "20 Resources/Investments/Brokerage Assets/*.md"
obsidian read path="20 Resources/Investments/Brokerage Activity/Brokerage Activity.base"
obsidian read path="20 Resources/Investments/Brokerage Assets/Brokerage Assets.base"
obsidian search query="brokerage_activity_kind" limit=20 total
obsidian search query="brokerage_asset_kind" limit=20 total
obsidian unresolved total
Treat import warnings as workflow gates. If a date-window warning says the ledger has no history before the workbook start date, do not trust downstream current holdings as complete until you either import older history or reconcile against a current valuation/holdings snapshot.
Use references/brokerage-activity-schema.md for the canonical note contract.
trade_buy
quantity and unit_price when the export provides them.trade_sell
fee_amount when brokerage is explicit.distribution
distribution_reinvestment in DRP workflows.distribution_reinvestment
cash_deposit and cash_withdrawal
fee, tax, cash_interest
fx, corporate_action, adjustment
review_status should remain needs_review until the mapping is explicit.Use references/brokerage-asset-schema.md for the asset contract.
listed_security
AAA.md, NDQ.md, and similar notes instead of creating duplicates.fund, crypto, fx_pair, other, unknown
brokerage_activity_kind as the supertag and schema selector for every generated note.brokerage_asset_kind as the supertag and schema selector for every generated asset note.source_signature values and merge source_row_hashes instead of duplicating notes.--column-map input over brittle fuzzy parsing for unknown providers.references/brokerage-activity-schema.md — canonical schema, note path rules, and _kind taxonomyreferences/brokerage-asset-schema.md — ticker-keyed asset schema and aggregation rulesreferences/provider-mapping.md — provider detection, column aliases, and future-provider extension rulesscripts/brokerage_models.py — source of truth for the Pydantic v2 schema