{"record":{"id":"02b9b3877b673b6b","repo":"nautechsystems/nautilus_trader","slug":"invalid-ibordertags-value-for-nonguaranteed-valu","errorCode":null,"errorMessage":"Invalid IBOrderTags value for NonGuaranteed: {value}","messagePattern":"Invalid IBOrderTags value for NonGuaranteed: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/interactive_brokers/src/execution/transform/tags.rs","lineNumber":420,"sourceCode":"}\n\nfn parse_ib_order_type(value: &str) -> Option<IbOrderType> {\n    let upper = value.to_ascii_uppercase();\n    IbOrderType::from_str(value)\n        .or_else(|_| IbOrderType::from_str(&upper))\n        .ok()\n}\n\nfn parse_ib_tif(value: &str) -> Option<IbTimeInForce> {\n    let upper = value.to_ascii_uppercase();\n    IbTimeInForce::from_str(value)\n        .or_else(|_| IbTimeInForce::from_str(&upper))\n        .ok()\n}\n\nfn apply_non_guaranteed_combo_tag(ib_order: &mut IBOrder, value: &Value) -> anyhow::Result<()> {\n    let Some(non_guaranteed) = parse_bool_like(value) else {\n        anyhow::bail!(\"Invalid IBOrderTags value for NonGuaranteed: {value}\");\n    };\n\n    set_tag_value(\n        &mut ib_order.smart_combo_routing_params,\n        \"NonGuaranteed\",\n        if non_guaranteed { \"1\" } else { \"0\" },\n    );\n    Ok(())\n}\n\nfn parse_bool_like(value: &Value) -> Option<bool> {\n    if let Some(value) = value.as_bool() {\n        return Some(value);\n    }\n\n    if let Some(value) = value.as_i64() {\n        return match value {\n            0 => Some(false),","sourceCodeStart":402,"sourceCodeEnd":438,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/interactive_brokers/src/execution/transform/tags.rs#L402-L438","documentation":"The NonGuaranteed combo tag must be a boolean-like JSON value (true/false or \"1\"/\"0\"-style). parse_bool_like returns None for anything else, and since NonGuaranteed maps into smart_combo_routing_params as \"1\"/\"0\", arbitrary values are rejected.","triggerScenarios":"apply_ib_order_tag_overlay -> apply_non_guaranteed_combo_tag with a NonGuaranteed value that is not bool-like, e.g. {\"NonGuaranteed\": \"yes\"}, {\"NonGuaranteed\": 2}, or a nested object/array.","commonSituations":"Passing human-friendly strings like \"yes\"/\"no\"/\"on\" into order tags; wrapping the flag in an object; using 1/0 as numbers if parse_bool_like only accepts bool/strings.","solutions":["Pass a boolean: {\"NonGuaranteed\": true}","If passing a string, use \"1\" or \"0\" (verify which string forms parse_bool_like accepts in tags.rs)","Remove quotes/extra structure so the value is a bare bool or accepted string literal"],"exampleFix":"// before\n{\"NonGuaranteed\": \"yes\"}\n// after\n{\"NonGuaranteed\": true}","handlingStrategy":"validation","validationCode":"let v = &tags[\"NonGuaranteed\"];\nlet ok = matches!(v, serde_json::Value::Bool(_))\n    || matches!(v, serde_json::Value::String(s) if s == \"1\" || s == \"0\");\nif !ok { return Err(anyhow::anyhow!(\"NonGuaranteed must be bool or \\\"1\\\"/\\\"0\\\"\")); }","typeGuard":"fn is_bool_like(v: &serde_json::Value) -> bool {\n    v.is_boolean() || matches!(v, serde_json::Value::String(s) if s == \"1\" || s == \"0\")\n}","tryCatchPattern":null,"preventionTips":["Use JSON booleans for flag-like tags, not \"yes\"/\"no\"/\"on\"","Document the accepted NonGuaranteed forms for combo orders","Validate combo tag payloads in a pre-submit check"],"tags":["interactive-brokers","combo-orders","json","validation"],"backgroundTag":"invalid-argument-value","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"}