LCC Income Cycle — Failure Modes and Edge Cases
Strategy ID: lcc-income-cycle
Version: 0.2 (OQ-1 through OQ-5 locked 2026-06-05)
This document catalogs known and anticipated failure modes. It is part of the required risk documentation for any strategy that advances to productization. "Failure" here means both outcomes that produce financial loss AND system/data failures that corrupt the paper-trading simulation.
Financial / Strategy Failure Modes
FM-01: Sustained Uptrend with Full Assignment
What happens: Stock trends strongly higher for multiple consecutive weeks. Each cycle, the layered calls are assigned at the same strikes while the underlying advances. The trader re-enters at progressively higher prices and sells calls at similar or slightly higher strikes. Net effect: premium income does not offset the opportunity cost of being repeatedly assigned out of a rising position, and re-entry costs keep rising.
Detection: upside_missed metric trending upward over 4+ consecutive cycles. avg_premium_per_share / avg_reentry_cost_increase ratio falling below 1.0.
Mitigation: The OTM layer in Bullish sentiment reduces this effect. The brief's "5-20% uncovered" rule directly addresses it. Backtest should quantify the magnitude of this drag during AMZN's 2023 bull run.
Severity: High — this is the primary structural weakness of any covered-call strategy in a sustained bull market.
FM-02: Repeated Below-Cost Assignment
What happens: Stock sells off between re-entry and call expiration. The trader re-enters at a high price (post-gap-up), sells calls, and the stock falls such that the short calls expire worthless (good) but the long shares are worth less than purchase price. If the next cycle also sees a sell-off, the stock P/L compounds negatively while premium income is insufficient to offset.
Detection: consecutive_below_cost_assignments alert (≥3 in 30 days). total_stock_pnl cumulative turning negative while total_premium_gross is positive but insufficient.
Mitigation: The re-entry criterion price_not_extended is the primary guard. The not_chasing criterion prevents re-entering immediately at a higher price. These must be enforced deterministically — no discretionary override without a logged reason.
Severity: High — this is how the original single-ITM approach generated the pattern the brief describes ("forced income cycling" that behaved badly).
FM-03: All-ITM Creep
What happens: The trader's sentiment label defaults to "Neutral" every week without deliberate recalibration, and the Neutral structure (2 ITM + 2 ATM/OTM) gradually shifts toward all-ITM as ATM/OTM strikes repeatedly end up ITM by expiration. Over time, the system operates as the original "aggressive ITM" approach the trader wanted to escape.
Detection: itm_overuse pattern detector — 3+ consecutive all-ITM expiration outcomes (not structures at entry; outcomes). Track delta-at-entry vs. delta-at-expiration separately.
Mitigation: Require weekly sentiment label recalibration. The system must prompt for a fresh label each cycle and reject a stale label. Per OQ-4 (locked 2026-06-05): staleness threshold is 1 market day; fallback is High-Uncertainty.
Severity: Medium — degrades strategy to its prior weaker form. Not catastrophic but undermines the thesis.
FM-04: Early Assignment Risk (American-Style Options)
What happens: AMZN options are American-style. Early assignment can occur when extrinsic value approaches zero — typically for deep ITM calls. The most common early-assignment trigger is extrinsic ≤ $0.05.
Resolution (OQ-2, locked 2026-06-05): Early assignment triggers the full-screen 4-option operator decision card. State transitions to EARLY_ASSIGNMENT_PENDING. No autonomous action. The system identifies which trigger fired ("why this happened"), shows the P/L summary ("why no panic needed"), and presents 4 options: buy back at market / buy back lower / switch underlying / close LCC take the win. See spec Section 9b.
The operator framing must not present early assignment as an error. "Early assignment is sometimes favorable — buy back lower" is the design intent.
Detection: Real-time: monitor extrinsic value on all open short calls. Flag if extrinsic < $0.05.
Severity: Medium for AMZN (no dividend). High for dividend-paying tickers in Phase 2.
FM-05: Trading Halt on Expiration Friday
What happens: The underlying halts (circuit breaker, regulatory halt, or news halt) during expiration Friday. OCC has documented procedures for extending exercise windows, but the timing is non-deterministic. A halt that resolves after 4:00 PM ET can cause unexpected assignment or non-assignment depending on the resume price.
Detection: System monitors for halt status on expiration day. If halt is detected, state machine stays at NEAR_EXPIRATION and does not process assignment until confirmed.
Mitigation: 1. Do not process assignment automatically until after 4:30 PM ET confirmation window closes. 2. Flag any expiration-day halt as requiring manual confirmation before state transition. 3. In paper simulation: use 4:00 PM close price regardless of halt. Document that live trading will behave differently.
Severity: Low probability, high operational impact. Must be handled before Phase 3 automation.
FM-06: IV Crush Post-Event
What happens: Broad market catalyst (FOMC, CPI print, earnings from correlated name) causes implied volatility to collapse. An open short call that was worth $3.00 at entry may drop to $0.20 in extrinsic intra-day due to IV compression, even if the stock price hasn't moved much. The cheap-close rule (extrinsic < $0.10) triggers a buy-back — which is the correct response — but the system must handle this gracefully without generating spurious alerts.
Detection: Intra-day: monitor extrinsic on all open calls. If extrinsic drops >50% intra-day, fire IV-crush alert.
Mitigation: The cheap-close buy-back rule (FM-04 also applies) handles IV crush correctly. Ensure the rule can fire intra-day, not just at expiration.
Severity: Low — this is actually a favorable outcome (buy back cheaply, recapture upside). Document as a positive edge case, not a risk.
FM-07: Roll Creates Unfavorable Debit
Resolution (OQ-1, locked 2026-06-05): The max_roll_debit_pct_of_original_credit
per-instance config (default 0.50 = 50% of original credit) gates the roll decision.
Above the threshold: system refuses the roll and notifies the operator with 3 options:
take assignment / close-and-reopen / one-shot override.
The old max_roll_debit = $0.25/share global cap is retired. All new
implementations use the percentage-of-original-credit calculation.
What happens: Stock surges strongly. Rolling the ITM call up to a higher strike requires paying a significant debit. The trader faces: accept assignment (lose the stock, miss further upside) or pay a debit to roll (cuts into premium income, may not be recoverable this cycle).
Detection: Roll evaluation returns "refuse_roll" action. Operator is notified immediately.
Severity: Medium — resolved; no longer a blocking open question.
FM-08: Concentration Risk (Single-Ticker)
What happens: All exposure is in AMZN. AMZN-specific news (regulatory action, earnings miss, AWS outage) creates a gap down that exceeds the premium cushion. Unlike a diversified options portfolio, there is no cross-ticker premium offsetting the loss.
Detection: Not a dynamic alert — this is a structural characteristic of the strategy. Document clearly in model card.
Mitigation: Phase 2 universe expansion to 5-6 tickers diversifies this risk. Paper cap of 800 shares limits dollar exposure.
Severity: High — the most honest limitation of the strategy as scoped. Must appear in the model card's "what can go wrong" section.
FM-09: Shares Drop Below Configured N
Resolution (OQ-3, locked 2026-06-05): Auto-disable LCC + alert when shares drop below configured N. Push + email alert. Operator decides: buy shares back and re-enable / reconfigure for smaller N / close strategy. No autonomous re-sizing.
What happens: After assignment or an external sale, position shares drop below the minimum required to run the LCC strategy as configured. Continuing to sell calls would require re-sizing, which is an operator decision, not a system decision.
Detection: SHARES_BELOW_MIN_THRESHOLD alert fires; check_uncovered_shares() transitions position to DISABLED.
Severity: Medium — resolved; auto-disable + alert path is deterministic.
System / Data Failure Modes
FM-10: Stale Options Chain Data in Backtest
What happens: Historical options data (strikes, bid/ask, delta) is sourced from a vendor (ORATS, Tradier) that may have gaps, point-in-time errors, or look-ahead bias in the data construction. Using end-of-day option prices as "fill prices" overstates execution quality.
Detection: Cross-check a sample of backtest fills against CBOE DataShop raw data for the same dates.
Mitigation: Use bid-only fills as a conservative sensitivity run. Document vendor and data version in every backtest run artifact. Never run a backtest without verifying the options chain source has confirmed point-in-time data.
Severity: High for backtest validity. Every backtest result should carry a disclaimer about options data quality.
FM-11: Tax-Lot Method Assumption vs. Broker Reality
What happens (updated 2026-06-05): The paper simulation defaults to FIFO (IRS default, per OQ-5). Different brokers implement lot selection differently. Some require explicit per-trade lot selection; some don't support all methods in certain account types (e.g., IRAs). If a live trader relies on a lot-selection behavior that their broker doesn't implement the same way, the simulation's P/L attribution diverges from reality.
Detection: Not detectable in paper sim — it's a documentation gap.
Mitigation: Model card must state clearly: "Tax-lot method simulation is illustrative. Verify your broker's lot selection implementation before relying on this for tax planning. This system does not provide tax advice."
Severity: Medium compliance risk. The CPA disclaimer must be prominent.
FM-12: State Machine Consistency Violation (Naked Call)
What happens: A bug in the state machine allows a short call to be recorded when shares are insufficient (e.g., after partial assignment reduces shares below 100 * calls outstanding). This would represent a naked short call in simulation — which is both wrong and a regulatory concern for live trading.
Detection: NAKED_CALL_DETECTED alert in check_risk_controls. The covered-call constraint check runs before every new call sell and after every assignment.
Mitigation: The constraint check is hard-coded and cannot be disabled in Phase 1-3. In Phase 4 (live), it must be a pre-trade check, not just a post-hoc log. Feature-developer must implement this as a blocking guard, not an advisory.
Severity: Critical — must be treated as a blocking defect if it fires in any environment.
FM-13: Sentiment Staleness Fallback Misconfiguration
What happens (new 2026-06-05): If the sentiment_staleness_fallback config is
changed from HIGH_UNCERTAINTY to a more aggressive label (e.g., NEUTRAL), the
staleness fallback silently becomes less conservative, defeating its purpose as a
safety margin.
Detection: Config audit on strategy setup. The sentiment_staleness_fallback field
should be validated to be HIGH_UNCERTAINTY or BEARISH only — never BULLISH.
Mitigation: Feature-developer should add a config validation guard that rejects
BULLISH as a staleness fallback. The default is HIGH_UNCERTAINTY and changing it
should require an explicit operator action with a logged override reason.
Severity: Low in isolation; medium if it silently changes behavior in production.
Open Questions (All Resolved)
All OQs from the original spec are operator-locked as of 2026-06-05. See the "Decisions locked 2026-06-05" section at the top of the strategy spec and #3282.
- OQ-1 (max debit on roll): Locked — per-strategy-config, default 50% of original credit. System refuses + 3-option operator card above threshold.
- OQ-2 (early assignment workflow): Locked — 4-option educational card, no autonomous action.
EARLY_ASSIGNMENT_PENDINGstate holds until operator decides. - OQ-3 (uncovered shares / shares drop below N): Locked — auto-disable + push + email alert; 3-option operator card; no autonomous re-sizing.
- OQ-4 (sentiment staleness threshold): Locked — 1 market day; High-Uncertainty fallback; strategy continues (does not pause).
- OQ-5 (tax-lot default): Locked — FIFO (IRS default); per-trade override available at order ticket.