{"record":{"id":"a0212dfe8f15b814","repo":"nautechsystems/nautilus_trader","slug":"event-slug-builder-periods-must-be-positive","errorCode":null,"errorMessage":"event_slug_builder.periods must be positive","messagePattern":"event_slug_builder\\.periods must be positive","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/polymarket/src/config.rs","lineNumber":117,"sourceCode":"    /// # 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);\n        let mut slugs = Vec::new();\n\n        for period in 0..self.periods {\n            let period_offset = i128::from(self.start_offset_periods) + i128::from(period);","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/polymarket/src/config.rs#L99-L135","documentation":"build_event_slugs_at_unix_secs rejects the up/down event slug configuration because the periods field of event_slug_builder is zero or otherwise non-positive; a positive count is required to generate the trailing window of period slugs.","triggerScenarios":"Building event slugs with an EventSlugBuilder configured with periods = 0.","commonSituations":"Config file with periods omitted/zero; programmatic config construction forgetting to set periods; misinterpreting periods as inclusive end index.","solutions":["Set event_slug_builder.periods to a positive integer equal to the number of consecutive periods to cover","Validate config at load time to catch zero periods before runtime","Review how periods is computed (e.g. hours/day ÷ interval_mins) to avoid rounding to 0"],"exampleFix":"// before\n[event_slug_builder]\nperiods = 0\n// after\n[event_slug_builder]\nperiods = 24 # one day of 60m periods","handlingStrategy":"validation","validationCode":"assert!(cfg.event_slug_builder.periods > 0, \"periods must be positive\");","typeGuard":null,"tryCatchPattern":"if let Err(e) = builder.build_event_slugs() {\n    log::error!(\"slug config invalid: {e}\");\n    return Err(e);\n}","preventionTips":["Compute periods as total_window / interval_mins and check > 0","Validate periods at config load time","Add config round-trip tests"],"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-14T05:17:10.506Z"}