diff --git a/docs/plans/2026-05-26-ibkr-flex-ingestion.md b/docs/plans/2026-05-26-ibkr-flex-ingestion.md index 7a22578..1fa57bb 100644 --- a/docs/plans/2026-05-26-ibkr-flex-ingestion.md +++ b/docs/plans/2026-05-26-ibkr-flex-ingestion.md @@ -1461,8 +1461,10 @@ OpenPositions against WF-computed quantities. | Open Positions | symbol, position, markPrice, currency, assetCategory | | Securities Information | symbol, description, conid | -Date range: `Last Business Day` for daily incremental. Switch to -`Year to Date` for one-time backfills only. +Date range: `Last 90 Days` — trailing window so a missed cron run +doesn't lose data. SyncRecordStore makes overlapping pulls idempotent. +Switch to `Year to Date` or `Custom Date Range` only for one-time +historical backfills. ## Cash type mapping diff --git a/docs/providers/ibkr.md b/docs/providers/ibkr.md index a21df5b..501c641 100644 --- a/docs/providers/ibkr.md +++ b/docs/providers/ibkr.md @@ -39,8 +39,11 @@ a new query named `broker-sync-activity` with: **Date Format:** `yyyy-MM-dd`. **Time Format:** `HH:mm:ss` (no timezone suffix — ibflex 1.1 rejects timezone abbreviations in the time field). -**Date Range:** `Last Business Day` for daily incremental. Switch to -`Year to Date` only for one-off backfills. +**Date Range:** `Last 90 Days` — trailing window so a missed cron run +doesn't lose data. SyncRecordStore (keyed by `external_id`) makes +overlapping pulls idempotent. For a one-off historical backfill, widen +temporarily to `Year to Date` or `Custom Date Range`, run once, then +switch back. ## Cash type mapping diff --git a/docs/specs/2026-05-26-ibkr-ingest-design.md b/docs/specs/2026-05-26-ibkr-ingest-design.md index 40bb9df..21aaf12 100644 --- a/docs/specs/2026-05-26-ibkr-ingest-design.md +++ b/docs/specs/2026-05-26-ibkr-ingest-design.md @@ -210,9 +210,12 @@ top. - Sections: `Account Information`, `Trades`, `Cash Transactions`, `Open Positions`, `Securities Information` - Date Format: `yyyy-MM-dd` · Time Format: `HH:mm:ss TimeZone` - - Date Range: `Last Business Day` (for daily runs; flip to - `Year to Date` only for the initial backfill — irrelevant while - account is empty) + - Date Range: `Last 90 Days` — trailing window so a missed cron run + (failed pod, outage, vacation) doesn't lose data. SyncRecordStore + keys on `ibkr:trade:` / `ibkr:cash:`, so + overlapping pulls are no-ops. `Last Business Day` was the original + choice but creates a "single missed run = permanent data loss" + failure mode — rejected in favour of dedup-backed resync window. - Format: XML - Trade fields: ensure `tradeID`, `tradeDate`, `tradeTime`, `symbol`, `buySell`, `quantity`, `tradePrice`, `currency`, `ibCommission`, @@ -248,10 +251,13 @@ curl -sS -b /tmp/wf-jar -X POST "$WF_BASE_URL/api/v1/accounts" \ ### Step 4 — Initial backfill (skip while account is empty) -When the IBKR account first holds positions, switch the Flex query -Date Range to `Year to Date`, run the CronJob manually once, verify WF -totals match the broker app, then switch the Flex query back to -`Last Business Day` for daily incremental. +When the IBKR account first holds positions, the daily CronJob will +backfill automatically up to the 90-day trailing window. For older +history, temporarily switch the Flex query Date Range to +`Year to Date` (or `Custom Date Range` with a 1-year window), run the +CronJob manually once, verify WF totals match the broker app, then +switch the Flex query back to `Last 90 Days` for daily incremental. +Dedup makes the temporary widening safe — already-synced rows are no-ops. ### Step 5 — Deploy