{"record":{"id":"6674891386c96f29","repo":"nautechsystems/nautilus_trader","slug":"event-slug-builder-interval-mins-must-be-positive","errorCode":null,"errorMessage":"event_slug_builder.interval_mins must be positive","messagePattern":"event_slug_builder\\.interval_mins must be positive","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/polymarket/src/config.rs","lineNumber":113,"sourceCode":"\nimpl PolymarketUpDownEventSlugConfig {\n    /// Builds event slugs using the current system time.\n    ///\n    /// # Errors\n    ///\n    /// Returns an error if the interval or period count is zero, all assets are\n    /// blank, or the configured offset resolves before the Unix epoch.\n    pub fn build_event_slugs(&self) -> anyhow::Result<Vec<String>> {\n        let now = SystemTime::now()\n            .duration_since(UNIX_EPOCH)\n            .map_err(|e| anyhow::anyhow!(\"system clock before Unix epoch: {e}\"))?\n            .as_secs();\n        self.build_event_slugs_at_unix_secs(now)\n    }\n\n    fn build_event_slugs_at_unix_secs(&self, unix_secs: u64) -> anyhow::Result<Vec<String>> {\n        if self.interval_mins == 0 {\n            anyhow::bail!(\"event_slug_builder.interval_mins must be positive\");\n        }\n\n        if self.periods == 0 {\n            anyhow::bail!(\"event_slug_builder.periods must be positive\");\n        }\n\n        let assets = self.normalized_assets();\n        if assets.is_empty() {\n            anyhow::bail!(\"event_slug_builder.assets must include at least one non-empty asset\");\n        }\n\n        let period_secs = self\n            .interval_mins\n            .checked_mul(60)\n            .ok_or_else(|| anyhow::anyhow!(\"event_slug_builder.interval_mins is too large\"))?;\n        let period_start = (unix_secs / period_secs) * period_secs;\n        let period_secs = i128::from(period_secs);\n        let period_start = i128::from(period_start);","sourceCodeStart":95,"sourceCodeEnd":131,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/polymarket/src/config.rs#L95-L131","documentation":"The Polymarket up/down event slug builder requires a strictly positive interval_mins because it computes period boundaries from it. A zero value is rejected up front since it would produce invalid/degenerate slugs.","triggerScenarios":"Constructing an EventSlugBuilder config (e.g. for CryptoUpdownSeries) with interval_mins = 0 and calling build_event_slugs (via build_event_slugs_at_unix_secs).","commonSituations":"Config loaded from TOML/env with a zero or unset interval; mistyping interval in minutes as seconds or fraction truncated to 0.","solutions":["Set event_slug_builder.interval_mins to a positive value (e.g. 60 for hourly updown markets)","Validate the config at deserialization time so zero intervals are rejected early","Check the config source (TOML/env) for a missing or zero default"],"exampleFix":"// before\n[event_slug_builder]\ninterval_mins = 0\n// after\n[event_slug_builder]\ninterval_mins = 60","handlingStrategy":"validation","validationCode":"assert!(cfg.event_slug_builder.interval_mins > 0, \"interval_mins must be positive\");","typeGuard":null,"tryCatchPattern":"match builder.build_event_slugs() {\n    Ok(slugs) => use(slugs),\n    Err(e) => { log::error!(\"slug config invalid: {e}\"); return Err(e); }\n}","preventionTips":["Validate EventSlugBuilder config at deserialization","Use serde deny/positive-range validation for interval_mins","Test config loading with a sample TOML before deployment"],"tags":["polymarket","config","validation"],"backgroundTag":"invalid-config-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"}