{"record":{"id":"4fbec8ea7d4bdbd5","repo":"BoundaryML/baml","slug":"contains-an-invalid-org-name","errorCode":null,"errorMessage":"'{}' contains an invalid org name ('{}')","messagePattern":"'(.+?)' contains an invalid org name \\('(.+?)'\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/bstd/src/project_fqn.rs","lineNumber":55,"sourceCode":"        Self {\n            org_slug,\n            project_shortname: project_name,\n        }\n    }\n\n    pub fn parse(fqn: impl AsRef<str>) -> Result<Self> {\n        let fqn = fqn.as_ref();\n        let (org_slug, project_shortname) = fqn.split_once('/').context(format!(\n            \"'{fqn}' is not a valid fully-qualified project name - must specify both an org and project name\"\n        ))?;\n        let org_slug = org_slug.to_string();\n        let project_shortname = project_shortname.to_string();\n\n        let org_slug_regex = Regex::new(r\"^[a-z0-9_][a-z0-9_-]*$\")\n            .context(\"Failed to construct org name validator\")?;\n\n        if !org_slug_regex.is_match(&org_slug) {\n            anyhow::bail!(\"'{}' contains an invalid org name ('{}')\", fqn, org_slug);\n        }\n        Self::is_valid_project_shortname(&project_shortname)\n            .map_err(|e| anyhow::anyhow!(\"'{}' contains an {e}\", fqn))?;\n        Ok(Self {\n            org_slug,\n            project_shortname,\n        })\n    }\n}\n\nimpl Display for ProjectFqn {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"{}/{}\", self.org_slug, self.project_shortname)\n    }\n}\n\n#[cfg(test)]\nmod tests {","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/bstd/src/project_fqn.rs#L37-L73","documentation":"ProjectFqn::parse splits a fully-qualified project name into org slug and project shortname and validates the org slug against ^[a-z0-9_][a-z0-9_-]*$. When the org portion contains characters outside that set (uppercase, dots, spaces, leading dash, etc.) parsing bails with this message naming both the full FQN and the offending org.","triggerScenarios":"Calling ProjectFqn::parse (or FromStr) with an FQN like \"MyOrg/project\" or \"my.org/project\" where the org segment fails the slug regex: must start with [a-z0-9_] and continue with [a-z0-9_-].","commonSituations":"Users typing org names with capitals or dots (GitHub-style org names) into CLI project creation; programmatic FQN construction from un-normalized org display names.","solutions":["Lowercase the org name and replace invalid characters with '-' or '_' before parsing","Ensure the org slug starts with a lowercase letter, digit, or underscore (not a dash)","Normalize at the input boundary (CLI/API) so display names are slugged before becoming FQNs","Surface the regex rules in the CLI error/UX so users know the constraint"],"exampleFix":"// before\nlet fqn = ProjectFqn::parse(\"MyOrg.MyProject\")?;\n// after\nlet org = \"MyOrg\".to_lowercase().replace(['.', ' '], \"-\");\nlet fqn = ProjectFqn::parse(&format!(\"{}/my-project\", org))?;","handlingStrategy":"validation","validationCode":"fn valid_org_slug(org: &str) -> bool {\n    let mut chars = org.chars();\n    matches!(chars.next(), Some(c) if c.is_ascii_lowercase() || c.is_ascii_digit() || c == '_')\n        && org.chars().all(|c| c.is_ascii_lowercase() || c.is_ascii_digit() || c == '_' || c == '-')\n}","typeGuard":null,"tryCatchPattern":"match ProjectFqn::parse(input) { Ok(f) => f, Err(e) => { eprintln!(\"invalid FQN: {e}\"); return Ok(()); } }","preventionTips":["Slugify org names (lowercase, replace invalid chars) before building FQNs","Enforce org-name rules at signup/creation time, not parse time","Document the slug charset in CLI help"],"tags":["validation","identifier","fqn"],"backgroundTag":"invalid-identifier-format","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}