xai-org/grok-build · error
invalid deny glob
Error message
invalid deny glob {glob:?}: {e} What it means
`validate_deny_glob` compiles each deny glob with `globset::GlobBuilder` (literal_separator enabled) and returns this error if the pattern is syntactically invalid. This is an input-validation error: the sandbox refuse deny rules it cannot compile, since an uncompilable glob could silently fail to deny writes. The error names the offending glob and the globset parse error.
Solutions
- Read the inner `{e}` to see the exact position and nature of the glob syntax error.
- Fix the pattern — commonly close the `[...]` character class or remove the stray bracket.
- Test the corrected glob against expected paths with globset (or a quick unit test) before redeploying.
- Quote backslashes properly in TOML (use single-quoted literal strings '...') to avoid escape mangling.
Example fix
// before write_deny = ['/tmp/[abc', '**/secrets'] // after write_deny = ['/tmp/[abc]*', '**/secrets'] // closed character class
Defensive patterns
Strategy: validation
Validate before calling
fn check_deny_globs(globs: &[String]) -> Result<(), String> {
for g in globs {
globset::GlobBuilder::new(g)
.literal_separator(true)
.build()
.map_err(|e| format!("invalid deny glob {g:?}: {e}"))?;
}
Ok(())
}
// run at startup/config load, before applying the sandbox Try / catch
match validate_deny_glob(glob) {
Ok(()) => {}
Err(e) if e.to_string().starts_with("invalid deny glob") => {
eprintln!("Fix the pattern in sandbox.toml: {e:#}");
std::process::exit(2); // config error, not runtime
}
Err(e) => return Err(e),
} Prevention
- Validate all deny globs at config load time, before sandbox application.
- Use single-quoted TOML strings ('...') for patterns containing backslashes.
- Lint character classes for unterminated [ before committing patterns.
- Write unit tests for every deny glob against representative paths.
When it happens
Trigger: A deny glob in config or CLI flags contains invalid syntax such as an unterminated `[` character class, malformed `{a,b}` alternation, or a dangling escape.
Common situations: Typo in ~/.grok/sandbox.toml or .grok/sandbox.toml write_deny patterns; hand-written globs like `/tmp/[abc` ; shell-style patterns copied that globset rejects; escaping mistakes with `\` in TOML strings.
Related errors
- hook JSON alias validation failed
- auth entry has no oidc_client_id — cannot refresh expired…
- auth entry has no oidc_issuer — cannot refresh expired…
- config root is not a table
- Custom sandbox profile
AI-assisted analysis of xai-org/grok-build@bc7f02eddd (2026-08-31).
Data as JSON: /api/errors/d114f3dcb5ad75f9.
Report an issue: GitHub.
Appendix: source
Thrown at crates/codegen/xai-grok-sandbox/src/deny/glob.rs:145
}
if cc.get(j) == Some(&']') {
anyhow::bail!("deny glob {glob:?}: a literal ']' as first class member is unsupported");
}
while j < cc.len() && cc[j] != ']' {
if cc[j] == '[' {
anyhow::bail!(
"deny glob {glob:?}: nested '[' / POSIX '[[:…:]]' classes are unsupported"
);
}
j += 1;
}
// Unterminated class: let the globset build below report it uniformly.
i = if j < cc.len() { j + 1 } else { cc.len() };
}
globset::GlobBuilder::new(glob)
.literal_separator(true)
.build()
.map_err(|e| anyhow::anyhow!("invalid deny glob {glob:?}: {e}"))?;
Ok(())
}
/// Push `c` as a regex literal, escaping it when it is a regex metacharacter.
#[cfg(all(feature = "enforce", target_os = "macos"))]
fn push_escaped_regex_literal(out: &mut String, c: char) {
if matches!(
c,
'.' | '+' | '*' | '?' | '(' | ')' | '[' | ']' | '{' | '}' | '^' | '$' | '|' | '\\'
) {
out.push('\\');
}
out.push(c);
}
/// Regex-escape every character of a literal path segment.
#[cfg(all(feature = "enforce", target_os = "macos"))]
fn escape_regex_literal_str(s: &str) -> String {View on GitHub (pinned to bc7f02eddd)