{"record":{"id":"f90ccbb88bccc4cb","repo":"nautechsystems/nautilus_trader","slug":"failed-e-f90ccb","errorCode":null,"errorMessage":"{FAILED}: {e}","messagePattern":"\\{FAILED\\}: \\{e\\}","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/model/src/orders/builder.rs","lineNumber":668,"sourceCode":"                    self.get_time_in_force(),\n                    self.get_expire_time(),\n                    self.get_reduce_only(),\n                    self.get_quote_quantity(),\n                    self.get_display_qty(),\n                    self.get_emulation_trigger(),\n                    self.get_trigger_instrument_id(),\n                    self.get_contingency_type(),\n                    self.get_order_list_id(),\n                    self.get_linked_order_ids(),\n                    self.get_parent_order_id(),\n                    self.get_exec_algorithm_id(),\n                    self.get_exec_algorithm_params(),\n                    self.get_exec_spawn_id(),\n                    self.get_tags(),\n                    self.get_init_id(),\n                    self.get_ts_init(),\n                )\n                .unwrap_or_else(|e| panic!(\"{FAILED}: {e}\")),\n            ),\n            OrderType::TrailingStopLimit => OrderAny::TrailingStopLimit(\n                TrailingStopLimitOrder::new_checked(\n                    self.get_trader_id(),\n                    self.get_strategy_id(),\n                    self.get_instrument_id(),\n                    self.get_client_order_id(),\n                    self.get_side(),\n                    self.get_quantity(),\n                    self.get_activation_price(),\n                    self.price,\n                    self.trigger_price,\n                    self.get_trigger_type(),\n                    self.get_limit_offset(),\n                    self.get_trailing_offset(),\n                    self.get_trailing_offset_type(),\n                    self.get_time_in_force(),\n                    self.get_expire_time(),","sourceCodeStart":650,"sourceCodeEnd":686,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/model/src/orders/builder.rs#L650-L686","documentation":"OrderTestBuilder::build panics with `Condition failed: {e}` when constructing an OrderAny::TrailingStopMarket via TrailingStopMarketOrder::new_checked returns an OrderError. The builder deliberately uses `new_checked` and converts the Err into a panic (unwrap_or_else), because a malformed order spec is a programmer error rather than a recoverable runtime condition. The inner error comes from nautilus correctness checks (crates/core/src/correctness.rs, `FAILED = \"Condition failed\"`) and OrderError invariants (crates/model/src/orders/mod.rs).","triggerScenarios":"Calling OrderTestBuilder().build(OrderType::TrailingStopMarket) with a spec that fails validation: quantity not positive, display_qty greater than quantity, TimeInForce::Gtd with a None or zero expire_time, or an OrderInitialized invariant violation (e.g. side NoOrderSide, invalid combination of contingency/linked fields). For TrailingStopMarket specifically the trigger may be unset (activate-at-market path) but trailing_offset/type and activation checks must still pass.","commonSituations":"Test fixtures reusing a builder template across order types and forgetting to set expire_time for GTD; setting display_qty from config without clamping to quantity; constructing orders from deserialized strategy configs with zero quantity; passing OrderSide default/NoOrderSide from an unvalidated enum conversion.","solutions":["Read the inner `{e}` OrderError message in the panic text; it names the exact failed check (e.g. 'display_qty exceeds quantity', 'GTD requires expire_time').","Fix the builder spec: set a positive Quantity, ensure display_qty <= quantity, and supply expire_time when time_in_force is GTD.","Ensure a valid OrderSide (Buy/Sell) is set on the builder.","If the failing values come from external config, validate them before calling build(), or switch to the order type's new_checked API to handle the error instead of panicking."],"exampleFix":"// before\nOrderTestBuilder::new(OrderType::TrailingStopMarket)\n    .quantity(Quantity::from(0))\n    .build()\n// after\nOrderTestBuilder::new(OrderType::TrailingStopMarket)\n    .side(OrderSide::Buy)\n    .quantity(Quantity::from(100))\n    .build()","handlingStrategy":"validation","validationCode":"fn valid_tsm_spec(qty: Quantity, display_qty: Option<Quantity>, tif: TimeInForce, expire_time: Option<UnixNanos>) -> Result<(), String> {\n    if qty.raw == 0 { return Err(\"quantity must be positive\".into()); }\n    if let Some(dq) = display_qty { if dq > qty { return Err(\"display_qty exceeds quantity\".into()); } }\n    if tif == TimeInForce::Gtd && expire_time.map_or(true, |t| t.as_u64() == 0) { return Err(\"GTD requires expire_time\".into()); }\n    Ok(())\n}","typeGuard":"if builder_spec.quantity.is_zero() || builder_spec.side == OrderSide::NoOrderSide { return; }","tryCatchPattern":null,"preventionTips":["Always set side, a positive quantity, and every field the target order type requires on OrderTestBuilder","Supply expire_time whenever time_in_force is GTD","Clamp display_qty to <= quantity before building","Prefer new_checked variants and handle OrderError when values come from untrusted input"],"tags":["rust","orders","panic","validation"],"backgroundTag":"internal-invariant-violation","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}