How the detection engine works
Last updated 2026-07-14 · applies to the current version of the checker
A tax tool earns trust by showing its work. This page documents every rule the engine applies and — just as important — every situation it deliberately refuses to judge. Our design principle: a wrong "you're safe" is the worst possible output, so when in doubt the engine flags, warns, or abstains. It never silently guesses.
The rules we apply
- The 61-day window, inclusive. A loss sale on day D is washed by a substantially identical acquisition in any of your accounts from D−30 through D+30 (IRC §1091(a)). Both boundary days count. Trade date governs, not settlement date.
- Cross-account, cross-broker aggregation. All accounts you load are treated as one taxpayer, matching IRS treatment. Tag each account taxable or IRA — the distinction changes outcomes.
- FIFO lot matching. Sells relieve the earliest-acquired lot first. If you elected specific-lot identification at your broker, your realized amounts may differ (a stated limitation).
- Replacement shares: earliest-acquired first, each share used at most once (per IRS Pub 550's matching order). Partial quantities split proportionally, including fractional shares.
- Basis adjustment and holding-period tacking. A disallowed loss is added to the replacement lot's basis and the original holding period tacks on — so deferred losses are recovered on a later clean sale, and cascading washes chain correctly.
- IRA absorption is permanent. When the replacement lands in a traditional or Roth IRA, the loss is flagged as permanently disallowed with no basis adjustment anywhere, per Rev. Rul. 2008-5. This is displayed in its own unmissable category.
- Substantially-identical tiers (conservative by design): (1) same ticker, or the exact same option contract → full dollar math. (2) Stock loss followed by a call purchase on the same underlying → statutory violation (IRC §1091(a) "contract or option to acquire"); reported, with the option-basis adjustment listed for your CPA rather than silently applied. (3) Any other same-underlying acquisition (different strike/expiry, puts) → a caution flag with no dollar math — possibly substantially identical, review with a professional. Tier 3 is never marked "safe."
- Year attribution. A December loss washed by a January re-buy is disallowed in the December tax year, matching 1099-B treatment.
When the engine refuses to answer
- Incomplete history. If your sells exceed your uploaded purchase history for a symbol, every verdict touching that symbol (shares AND options on it) is suppressed and replaced with an explicit "incomplete history" notice. Upload more history to unlock it.
- Short positions. Sell-to-open and buy-to-close legs are excluded and loudly listed per symbol; wash-sale results do not account for them (short-cover losses are themselves subject to §1091 — take those to a professional).
- Option exercise / assignment / expiration, splits, transfers. These rows are skipped with visible warnings; where they change share counts, downstream verdicts may be affected and we say so rather than fabricate a reconstruction.
Known limitations (the honest list)
- FIFO only — no specific-lot election modeling yet.
- No cross-ticker "substantially identical" analysis (e.g., SPY vs VOO) — see our explainer for why that judgment needs a human.
- No short-position wash analysis; no Section 475 mark-to-market accounting.
- Broker CSV exports vary and occasionally contain broker-side errors (documented per broker on our broker guides); we surface parse errors and skipped rows rather than hide them.
- The engine is tested against the worked examples in IRS Pub 550 plus an adversarial test suite, but it is informational software, not a tax professional. Reconcile the year-end summary with your CPA.
Primary sources
IRC §1091 · IRS Publication 550 · Rev. Rul. 2008-5 · Form 8949 instructions