xai-org/grok-build · error

{err}

Error message

{err}

What it means

During startup the CLI validates chat-mode flag combinations via `session_startup::chat_mode_flag_conflict(args.chat(), args.fork_session, args.restore_code)`; when `--chat` is combined with `--fork-session` or `--restore-code` (which operate on non-chat sessions), the returned Some(reason) is surfaced with `anyhow::bail!("{err}")`.

Source

Thrown at crates/codegen/xai-grok-pager/src/app/mod.rs:709

    }
    if session_startup::chat_mode_conflicts_with_leader(args.chat(), use_leader) {
        anyhow::bail!("{}", session_startup::CHAT_MODE_LEADER_CONFLICT);
    }
    if args.trust {
        match std::env::current_dir() {
            Ok(cwd) => xai_grok_workspace::folder_trust::grant_folder_trust(&cwd),
            Err(e) => {
                tracing::warn!(error = %e, "--trust: failed to resolve cwd; folder not trusted")
            }
        }
    }
    if let Some(reason) = policy_disable_reason {
        tokio::spawn(xai_grok_shell::leader::kill_stale_reachable_leaders(reason));
    }
    if let Some(err) =
        session_startup::chat_mode_flag_conflict(args.chat(), args.fork_session, args.restore_code)
    {
        anyhow::bail!("{err}");
    }
    #[cfg(feature = "local-workspace")]
    {
        let lw = session_startup::resolve_local_workspace_config(
            args.chat(),
            args.local_workspace(),
            args.local_workspace_attach(),
            args.local_workspace_cwd(),
        )?;
        if let Some(ref cfg) = lw {
            session_startup::emit_local_workspace_startup_ux(cfg)?;
        }
        session_startup::set_active_local_workspace(lw)?;
    }
    let intent = args
        .session_startup_intent()
        .map_err(|e| anyhow::anyhow!("{e}"))?;
    let mut materialize_ctx = session_startup::MaterializeCtx::from_pager_args(&args);

View on GitHub (pinned to bc7f02eddd)

Solutions

  1. Drop `--fork-session`/`--restore-code` when using `--chat`
  2. Run fork/restore without the chat flag
  3. Audit generated command lines in scripts to keep chat flags separate from session-management flags

Example fix

// before
grok-pager --chat --fork-session
// after
grok-pager --fork-session   # or: grok-pager --chat
Defensive patterns

Strategy: validation

Validate before calling

fn ensure_chat_flags_valid(chat: bool, fork: bool, restore: Option<String>) -> Result<(), String> {
    if chat && (fork || restore.is_some()) {
        Err("--fork-session/--restore-code cannot be used with --chat".into())
    } else { Ok(()) }
}

Type guard

fn chat_without_session_flags(chat: bool, fork: bool, restore: bool) -> bool {
    chat && !fork && !restore
}

Try / catch

if let Err(e) = run_pager(args) {
    let msg = e.to_string();
    if msg.contains("fork") || msg.contains("restore") { eprintln!("conflicting session flags with --chat: {msg}"); }
    else { eprintln!("startup failed: {msg}"); }
}

Prevention

When it happens

Trigger: Invoking the binary with `--chat` plus `--fork-session`, or `--chat` plus `--restore-code`; any script passing all three flags together.

Common situations: Reusing a fork/restore command line and adding `--chat`; CI scripts templating flags where chat was toggled on without removing session-restore flags.

Related errors


AI-assisted analysis of xai-org/grok-build@bc7f02eddd (2026-08-31). Data as JSON: /api/errors/4765dd3e8a42c1b7. Report an issue: GitHub.