{"record":{"id":"a7ea7c504fffc794","repo":"xai-org/grok-build","slug":"permission-mode-invalid-value-e","errorCode":null,"errorMessage":"--permission-mode: invalid value: {e}","messagePattern":"--permission-mode: invalid value: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/codegen/xai-grok-pager/src/headless.rs","lineNumber":837,"sourceCode":"    );\n\n    apply_agent_flag(&options.agent, &mut agent_config);\n\n    if let Some(ref json) = options.agents_json {\n        agent_config.cli_agents = parse_cli_agents(json)?;\n    }\n\n    agent_config.cli_agent_overrides = xai_grok_shell::agent::config::CliAgentOverrides {\n        tools: parse_comma_list(options.cli_tools.as_deref()),\n        disallowed_tools: parse_comma_list(options.cli_disallowed_tools.as_deref()),\n        permission_rules: parse_permission_rules_strict(&options.allow_rules, &options.deny_rules)?,\n        max_turns: options.max_turns,\n        permission_mode: options\n            .permission_mode_flag\n            .as_deref()\n            .map(|s| {\n                serde_json::from_value(serde_json::Value::String(s.to_string()))\n                    .map_err(|e| anyhow::anyhow!(\"--permission-mode: invalid value: {e}\"))\n            })\n            .transpose()?,\n    };\n\n    if options.trust {\n        xai_grok_workspace::folder_trust::grant_folder_trust(&cwd);\n    }\n\n    let cancel = CancellationToken::new();\n    let memory_config = agent_config.memory_config.clone();\n    let mut pending_startup = Some(PendingStartup::new());\n    let timer = xai_grok_telemetry::startup::begin(crate::acp::Owner::Client);\n    let mut report_startup_failure = |timer: &crate::acp::StartupTimer| {\n        timer.emit_telemetry(\n            crate::acp::AgentKind::Embedded,\n            crate::acp::StartupOutcome::Error,\n            None,\n            false,","sourceCodeStart":819,"sourceCodeEnd":855,"githubUrl":"https://github.com/xai-org/grok-build/blob/bc7f02eddd3d84085849dc19ed216f11c23b0571/crates/codegen/xai-grok-pager/src/headless.rs#L819-L855","documentation":"In run_single_turn, the --permission-mode CLI flag string is deserialized into the permission-mode enum via serde_json::from_value; any non-enum string produces '--permission-mode: invalid value: {e}' (raised via CliAgentOverrides). It is a pure CLI input validation error, not a runtime condition.","triggerScenarios":"Passing --permission-mode with a value not in the enum (wrong case like 'Default' vs 'default', or a mode the binary does not support such as 'bypassPermissions' on a build without it).","commonSituations":"Typo or wrong casing in scripts/CI wrappers; copying flags from docs of a different version; shell quoting introducing stray whitespace.","solutions":["Use an exact supported value (check --help for the accepted list)","Fix casing — the enum match is typically case-sensitive","Upgrade/downgrade the binary so the flag matches a supported mode","Validate the flag in the wrapper script before invoking"],"exampleFix":"// before\npager --permission-mode AcceptEdits\n// after\npager --permission-mode accept-edits","handlingStrategy":"validation","validationCode":"const VALID_MODES: [&str; 3] = [\"default\", \"accept-edits\", \"plan\"];\nfn valid_permission_mode(s: &str) -> bool { VALID_MODES.contains(&s) }","typeGuard":"fn is_permission_mode(s: &str) -> bool {\n    matches!(s, \"default\" | \"accept-edits\" | \"plan\")\n}","tryCatchPattern":"match serde_json::from_value::<PermissionMode>(serde_json::Value::String(mode.into())) {\n    Ok(m) => m,\n    Err(e) => { eprintln!(\"--permission-mode: invalid value: {e}\"); std::process::exit(2); }\n}","preventionTips":["Copy flag values from --help of the exact binary version","Quote flag values in shell scripts to avoid whitespace","Add a wrapper that whitelists allowed modes","Test CLI invocations in CI before production use"],"tags":["cli","validation","serde","enum"],"backgroundTag":"invalid-enum-value","analyzedSha":"bc7f02eddd3d84085849dc19ed216f11c23b0571","analyzedAt":"2026-08-31T04:59:42.031Z","schemaVersion":2},"datasetVersion":"2026-08-31T09:17:48.483Z"}