{"record":{"id":"3705ba9ad219e755","repo":"nautechsystems/nautilus_trader","slug":"continuous-future-transition-times-must-be-strictl","errorCode":null,"errorMessage":"Continuous future transition times must be strictly increasing, was {value}","messagePattern":"Continuous future transition times must be strictly increasing, was (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/data/src/engine/requests.rs","lineNumber":543,"sourceCode":"    let mut transitions = Vec::with_capacity(values.len());\n    let mut previous_transition_time_ns = None;\n    let mut previous_post_instrument_id = None;\n\n    for row_value in values {\n        let row = row_value.as_object().with_context(|| {\n            format!(\"Continuous future transition must be an object, was {row_value}\")\n        })?;\n        let transition_time_ns = row\n            .get(\"transition_time_ns\")\n            .and_then(Value::as_u64)\n            .with_context(|| {\n                format!(\"Invalid continuous future transition_time_ns, was {row_value}\")\n            })?;\n\n        if let Some(previous) = previous_transition_time_ns\n            && transition_time_ns <= previous\n        {\n            anyhow::bail!(\n                \"Continuous future transition times must be strictly increasing, was {value}\"\n            );\n        }\n        previous_transition_time_ns = Some(transition_time_ns);\n\n        let pre_instrument_id =\n            parse_transition_instrument_id(row.get(\"pre_instrument_id\"), target_bar_type)?;\n        let post_instrument_id =\n            parse_transition_instrument_id(row.get(\"post_instrument_id\"), target_bar_type)?;\n        if pre_instrument_id.venue != target_venue || post_instrument_id.venue != target_venue {\n            anyhow::bail!(\n                \"Continuous future segment venue mismatch for {target_bar_type}: target venue {target_venue}, segment venues pre={}, post={}\",\n                pre_instrument_id.venue,\n                post_instrument_id.venue,\n            );\n        }\n\n        if let Some(previous) = previous_post_instrument_id","sourceCodeStart":525,"sourceCodeEnd":561,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/data/src/engine/requests.rs#L525-L561","documentation":"Transition times in the continuous-future `transitions` table must be strictly increasing. A row whose transition_time_ns is equal to or earlier than the previous row's makes the roll schedule ambiguous and is rejected.","triggerScenarios":"parse_transitions encounters a row where transition_time_ns <= the previous row's transition_time_ns — duplicated timestamps or out-of-order rows in the `transitions` request parameter.","commonSituations":"Sorting transitions by string contract ID instead of by time; duplicated roll records from concatenating overlapping data pulls; timestamp units mixed (seconds vs nanoseconds) making later rows appear earlier.","solutions":["Sort transitions by transition_time_ns ascending and de-duplicate identical timestamps before sending.","Ensure all timestamps use the same unit (nanoseconds since epoch).","Fix the data generator/provider so each roll has a unique, increasing transition time."],"exampleFix":"// before\ntransitions.sort_by_key(|t| t.contract_symbol);\n// after\ntransitions.sort_by_key(|t| t.transition_time_ns);\ntransitions.dedup_by_key(|t| t.transition_time_ns);","handlingStrategy":"validation","validationCode":"for w in transitions.windows(2) {\n    assert!(w[1].transition_time_ns > w[0].transition_time_ns, \"transition times must strictly increase\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Sort and dedupe transitions by timestamp before sending","Use a single timestamp unit (ns) everywhere","Validate roll schedules in a unit test fixture"],"tags":["validation","ordering","continuous-futures"],"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-14T00:17:10.932Z"}