nautechsystems/nautilus_trader · error · IncompleteOrderReports

IncompleteOrderReports { reports, detail: detail.into() }

Error message

IncompleteOrderReports { reports, detail: detail.into() }

What it means

The Lighter execution adapter received an incomplete set of order status reports (e.g. during mass status or reconciliation) and bails out with a typed IncompleteOrderReports error that carries the partial reports and a detail string. The helper shown constructs this error.

Source

Thrown at crates/adapters/lighter/src/execution.rs:4845

// account, so a market-scoped sweep can serve nothing while older trades for that
// market have already been evicted by newer trades in other markets.
struct FillSweep {
    reports: Vec<FillReport>,
    covers_window: bool,
}

#[derive(Debug, thiserror::Error)]
#[error("incomplete Lighter order reports: {detail}")]
struct IncompleteOrderReports {
    reports: Vec<OrderStatusReport>,
    detail: String,
}

fn incomplete_order_reports(
    reports: Vec<OrderStatusReport>,
    detail: impl Into<String>,
) -> anyhow::Error {
    anyhow::Error::new(IncompleteOrderReports {
        reports,
        detail: detail.into(),
    })
}

fn partial_order_reports(error: &anyhow::Error) -> Vec<OrderStatusReport> {
    error
        .downcast_ref::<IncompleteOrderReports>()
        .map(|incomplete| incomplete.reports.clone())
        .unwrap_or_default()
}

fn is_commission_error(error: &anyhow::Error) -> bool {
    error
        .chain()
        .any(|cause| cause.downcast_ref::<LighterCommissionError>().is_some())
}

View on GitHub (pinned to d1527c24af)

Solutions

  1. Read detail (the wrapped message) — it states which request was incomplete
  2. Retry the mass status request; transient venue-side gaps often resolve
  3. Use partial_order_reports(error) to recover the reports that did arrive and reconcile what you can
  4. If persistent, check Lighter API announcements for endpoint changes
Defensive patterns

Strategy: retry

Type guard

fn is_incomplete_reports(e: &anyhow::Error) -> bool {
    e.downcast_ref::<IncompleteOrderReports>().is_some()
}

Try / catch

match run_mass_status().await {
    Err(e) if is_incomplete_reports(&e) => {
        let partial = partial_order_reports(&e);
        reconcile_partial(partial).await?;
    }
    other => other?,
}

Prevention

When it happens

Trigger: Calling a Lighter mass-order-status or reconciliation flow where the venue returns fewer/malformed order reports than expected for the requested order IDs.

Common situations: Venue API changes or pagination quirks dropping reports, network interruption mid-poll, or requesting status for orders the venue no longer tracks.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@d1527c24af (2026-08-27). Data as JSON: /api/errors/c300e02b143e45aa. Report an issue: GitHub.