Skip to content

Windows execpolicy false positive when Start-Process and an unrelated URL appear in the same PowerShell script #40060

Open

Description

@keyou

What version of Codex CLI is running?

codex-cli 0.146.0

The failure was reproduced on 0.146.0. I also checked the latest stable release, 0.149.0, and the current main branch; both still contain the same relevant classifier logic described below.

What subscription do you have?

Pro

Which model were you using?

gpt-5.6-sol

What platform is your computer?

Microsoft Windows NT 10.0.26100.0 x64 (Windows 11 Professional)

What terminal emulator and version are you using (if applicable)?

Windows Terminal, PowerShell 7.6.3

Codex doctor report

The full report contains private local paths, so the relevant redacted fields are included below. All relevant runtime, config, auth, sandbox, and installation checks were OK; the overall warning was an unrelated update-status warning.

{
  "schemaVersion": 1,
  "overallStatus": "warning",
  "codexVersion": "0.146.0",
  "runtime": {
    "platform": "windows-x86_64",
    "installMethod": "npm"
  },
  "config": {
    "model": "gpt-5.6-sol",
    "modelProvider": "openai"
  },
  "system": {
    "os": "Windows 10.0.26100 (Windows 11 Professional) [64-bit]"
  },
  "terminal": {
    "terminal": "Windows Terminal",
    "powershell": "7.6.3"
  }
}

What issue are you seeing?

On Windows, execpolicy falsely classifies a benign compound PowerShell script as a dangerous URL launch when the script contains both:

  1. a local Start-Process invocation with no URL argument, and
  2. an unrelated Invoke-RestMethod call to an HTTP URL later in the script.

With approval policy never, Codex rejects the command before PowerShell starts:

"C:\Program Files\PowerShell\7\pwsh.exe" -Command '...'
rejected: blocked by policy

The rejection is immediate (Wall time 0.0 seconds). Running the local Start-Process command by itself succeeds, and running the HTTP probe by itself succeeds. Combining them in one PowerShell script triggers the rejection.

This affects a common local-development pattern: start a local application or development server, then poll its loopback health/CDP endpoint until it is ready.

What steps can reproduce the bug?

  1. Run Codex on Windows with approvals disabled, for example:

    codex -a never -s danger-full-access
    
  2. Ask Codex to execute this single PowerShell tool command:

    $process = Start-Process `
      -FilePath "$env:SystemRoot\System32\cmd.exe" `
      -ArgumentList @('/c', 'exit', '0') `
      -WindowStyle Hidden `
      -PassThru
    
    try {
      Invoke-RestMethod `
        -Uri 'http://127.0.0.1:9/health' `
        -TimeoutSec 1
    } catch {}
    
    $process.Id
  3. Observe that Codex rejects the entire command with rejected: blocked by policy before pwsh.exe runs.

  4. Execute the Start-Process portion and the Invoke-RestMethod portion as two separate Codex tool calls. Both are allowed, confirming that the combination is what triggers the false positive.

What is the expected behavior?

Execpolicy should only classify Start-Process as a dangerous URL/ShellExecute launch when an HTTP/HTTPS URL is an argument of that Start-Process invocation (or otherwise belongs to the same command expression).

An unrelated URL used by a separate Invoke-RestMethod command should not cause a local executable launch to be rejected.

The truly dangerous case must remain blocked:

Start-Process 'https://example.com'

Additional information

The apparent root cause is in is_dangerous_powershell_words. It computes has_url across the full flattened token list and independently checks whether any token contains start-process:

https://github.com/openai/codex/blob/rust-v0.149.0/codex-rs/shell-command/src/command_safety/windows_dangerous_commands.rs#L36-L52

As a result, the URL and Start-Process token do not need to belong to the same command. The same implementation is still present on main:

https://github.com/openai/codex/blob/main/codex-rs/shell-command/src/command_safety/windows_dangerous_commands.rs#L36-L52

When the heuristic marks the command dangerous and approval_policy is never, the decision becomes Forbidden:

https://github.com/openai/codex/blob/rust-v0.149.0/codex-rs/core/src/exec_policy.rs#L728-L741

A regression test could assert that this is not dangerous:

Start-Process local.exe; Invoke-RestMethod http://127.0.0.1:1234/health

while preserving the existing test that Start-Process 'https://example.com' is dangerous. A robust fix would associate URL arguments with the specific PowerShell command/AST node rather than scanning the whole script token set.

Related PowerShell execpolicy/parser reports, but not duplicates of this false positive:

Activity

  1. added
    bugSomething isn't working
    CLIIssues related to the Codex CLI
    windows-osIssues related to Codex on Windows systems
    sandboxIssues related to permissions or sandboxing
    on Aug 22, 2026
  2. Generoustandard commented on Aug 27, 2026

    @Generoustandard

    Additional Windows desktop occurrence, observed on 2026-08-27. This appears closely related, with one variation: the unrelated HTTPS URL was an environment configuration value, not a health-probe URL.

    Environment

    • Installed desktop package: OpenAI.Codex 26.820.9563.0.
    • Version reported by the executable of the running desktop app-server process: codex-cli 0.150.0-alpha.8.
    • Separately installed npm CLI: codex-cli 0.117.0. This is not the running desktop app-server version above.
    • Microsoft Windows NT 10.0.26200.0, x64; tool shell PowerShell 7.6.4.
    • Task permission context and relevant user/project config entries: sandbox_mode = "danger-full-access", approval_policy = "never".
    • Existing local checkout; no new branch or worktree.

    Observed operation

    The user authorized an isolated loopback QA backend while preserving the existing development server and user data. One PowerShell tool invocation combined unused-port/non-existing-directory checks, isolated QA storage creation, process-local test environment assignments, and a local Python/Uvicorn launch with Start-Process -WindowStyle Hidden and redirected logs.

    Abbreviated, redacted command shape below. This is not a verified minimal reproduction: paths and the API-base value are placeholders; the original invocation also contained the checks and other assignments described above.

    $env:LLM_API_BASE_URL = 'https://example.invalid/v1'
    
    Start-Process `
      -FilePath '<project>\.venv\Scripts\python.exe' `
      -ArgumentList @('-m', 'uvicorn', 'backend.app.main:app',
                      '--host', '127.0.0.1', '--port', '8167', '--no-access-log') `
      -WorkingDirectory '<project>' `
      -WindowStyle Hidden `
      -RedirectStandardOutput '<isolated-qa>\backend.stdout.log' `
      -RedirectStandardError '<isolated-qa>\backend.stderr.log' `
      -PassThru

    The URL was not an argument to Start-Process. It was child-backend configuration; no URL/ShellExecute launch was intended. No API key literal was present in the command.

    Actual result

    The entire tool invocation was rejected before PowerShell was created:

    CreateProcess { message: "Rejected(... rejected: blocked by policy)" }
    Wall time 0.0 seconds
    

    Explicit user re-authorization and repetition of the same launch request did not change the result. No QA runtime directory or QA listeners were created. The existing server was unchanged; frontend launch and browser acceptance tests were not attempted.

    An additional diagnostic placed the original command in a single-quoted here-string and passed it as data to codex execpolicy check --rules ... -- pwsh.exe -Command <command>. That outer tool invocation was also rejected before execution. This is not an execpolicy check verdict: the checker never ran and no matched-rule information was obtained.

    Successful controls and limits

    • File reads/edits, git status, Python tests and production frontend builds succeeded in the same task; version-only CLI invocations also succeeded.
    • No permission/rule files were changed and no alternate execution path was used to get around the refusal.
    • Fresh-task reproduction, minimized positive/negative controls, and split-command comparison have not been performed for this occurrence.
    • The effective host-side rejection reason is unknown. The classifier code linked in this issue is consistent with our command shape, but this comment does not establish which classifier/rule the running desktop build actually used.

    Please check whether this is the same whole-script Start-Process + unrelated-URL heuristic in the desktop app-server version above. An actionable denial reason/rule identifier would help distinguish an intended restriction from a false positive without changing safety settings. Protection against actual URL/ShellExecute launches should remain intact.

    No private project name, username, real local path, credentials, customer data, full config file, or session transcript is included.

  3. SANDRA136252 commented on Sep 4, 2026

    @SANDRA136252

    Additional sanitized Windows desktop occurrence observed on 2026-09-04. The command shape appears closely related to this issue, including the environment-variable URL variant in the earlier comment. The effective denying rule/classifier has not been confirmed for this occurrence.

    Environment

    • Windows 11 Home, build 26200.
    • Desktop package initially OpenAI.Codex 26.901.1978.0; the same rejection persisted after a normal user restart also updated the package to 26.901.2854.0.
    • The affected task's persisted engine-version field reports 0.153.0-alpha.5; this is task metadata, not an independent version query of the post-update executable.
    • Full access was selected in the UI. The exact rejected turn's persisted context also records sandbox_policy.type=danger-full-access, permission_profile.type=disabled, approval_policy=never, and approvals_reviewer=user.

    Observed operation

    The user authorized a local-only development-server launch. A compound PowerShell tool invocation checked unused ports and fresh log paths, set frontend environment variables, and used Start-Process to launch the installed local Node/Vite entry point on loopback.

    The HTTP URL was assigned to VITE_API_PROXY_TARGET; it was not an argument to Start-Process and no URL/ShellExecute browser launch was intended.

    Abbreviated, path-redacted shape below, not a separately tested minimal reproduction. The original invocation also contained the preflight checks, Git revision lookup, and additional frontend environment assignments described above.

    $env:VITE_API_PROXY_TARGET = 'http://127.0.0.1:30121'
    $env:VITE_USE_PROXY = 'true'
    $node = (Get-Command node.exe -ErrorAction Stop).Source
    $vite = Join-Path '<local-project>' 'node_modules\vite\bin\vite.js'
    
    Start-Process -FilePath $node `
      -ArgumentList @($vite, '--mode', 'local-debug', '--force',
                      '--host', '127.0.0.1', '--port', '18121', '--strictPort') `
      -WorkingDirectory '<local-project>' `
      -WindowStyle Hidden `
      -RedirectStandardOutput '<local-runtime>\frontend.stdout.log' `
      -RedirectStandardError '<local-runtime>\frontend.stderr.log' `
      -PassThru

    Actual result and checks

    The tool returned immediately, before the submitted PowerShell command executed:

    exec_command failed: CreateProcess { message: "Rejected(... rejected: blocked by policy)" }
    Wall time 0.0 seconds
    
    • No startup logs or requested listener were created. The same invocation still failed after the desktop update above.
    • Adjacent ordinary file/Git/process checks succeeded; historical local launches had succeeded. This report does not claim that every process launch is blocked.
    • The inspected user rule file contains allow entries and no explicit prompt/forbidden entries. This is not an inventory of the complete effective policy.
    • The returned error and inspected local logs supplied no matching rule ID, policy source, or actionable decision rationale.
    • No permission/rule files were changed, and no split-command or alternative-launch workaround was executed. No clean-workspace or minimized positive/negative comparison has been established for this occurrence.

    Could maintainers confirm whether the whole-script Start-Process plus unrelated-URL classification discussed here applies to these desktop versions, and identify a supported fix or review path? If this action is intentionally restricted, an explicit reason would help distinguish that from a false positive. Protection against actual unsafe URL/ShellExecute launches should remain intact.

    No private project identifiers, personal filesystem paths, credentials, database contents, raw logs, task/session IDs, or complete conversation are included. This comment is submitted with the account owner's permission.

  4. baul9265-a11y commented on Sep 5, 2026

    @baul9265-a11y

    Additional sanitized Windows desktop occurrence observed on 2026-09-04 UTC (2026-09-05 locally). This is consistent with the command shape in this issue; the effective denying rule has not been confirmed.

    Environment:

    • Desktop package observed after the incident: OpenAI.Codex 26.901.5003.0.
    • Read-only --version query of the executable belonging to the currently running desktop app-server: codex-cli 0.153.3. This is a post-incident query, not proof of the exact incident-time engine version.
    • The rejected turn's persisted context records approval_policy=never and sandbox_policy.type=danger-full-access.

    Observed operation:
    A single PowerShell tool invocation performed loopback-only HTTP status/model-identity probes, checked local resource availability and fresh log paths, and then used Start-Process -WindowStyle Hidden to launch an existing local PowerShell test script with redirected stdout/stderr. The HTTP URLs belonged to the status probes; they were not arguments to Start-Process.

    The entire invocation was rejected immediately:

    exec_command failed: CreateProcess { message: "Rejected(... rejected: blocked by policy)" }
    Wall time 0.0 seconds
    

    No launcher logs or new local-model inference calls were produced. Ordinary read-only file, Git, and version queries work. The returned error and inspected logs provided no rule identifier or actionable rationale.

    The current upstream is_dangerous_powershell_words implementation still checks for a URL anywhere in the flattened token list alongside Start-Process. This is supporting evidence, not confirmation of which rule the desktop build applied.

    No permission settings or rule files were changed, and no split-command, alternative-launch, or retry workaround was executed. A minimized reproduction has not been run for this occurrence.

    Could maintainers confirm whether this is the same classifier issue and identify a supported fix or review path? Protection against unsafe URL/ShellExecute launches should remain intact.

    Submitted with the user's authorization. No private project identifiers, personal paths, credentials, model prompts/responses, raw logs, or task/session IDs are included.

  5. chad20262109 commented on Sep 5, 2026

    @chad20262109

    Confirmed another occurrence on Windows desktop with codex-cli 0.153.4 (desktop package OpenAI.Codex 26.901.5280.0), with a proposed source fix and regression tests below.

    Observed failure

    The rejected invocation configured a loopback origin in an environment variable and launched a local server executable. The URL was not an argument to the launch command. The following is a sanitized representation, not a separately executed minimal reproduction:

    $env:APP_PORT='18081'
    $env:APP_PUBLIC_ORIGIN='http://127.0.0.1:18081'
    $p=Start-Process -FilePath 'C:/app/server.exe' -WorkingDirectory 'C:/app' -WindowStyle Hidden -RedirectStandardOutput 'C:/app/server.stdout.log' -RedirectStandardError 'C:/app/server.stderr.log' -PassThru
    $p.Id | Set-Content 'C:/app/server.pid'

    The tool rejected the invocation before creating PowerShell:

    exec_command failed: CreateProcess { message: "Rejected(... rejected: blocked by policy)" }
    

    The corresponding runtime log records approval_policy=Never and sandbox_policy=DangerFullAccess. Reauthorization did not resolve it. The returned error does not identify a rule. Source inspection at the matching tag shows that the flattened token scan associates the environment URL with Start-Process, and a dangerous classification with Never leads to Forbidden. This establishes the source-level false positive; the production binary was not instrumented to prove its internal call path.

    Proposed patch

    Base: rust-v0.153.4, commit 3d2ee51ca2d5db578f328aa75e20aa22c0197c9a.

    • Use the existing PowerShell tree-sitter parser to associate URL arguments with literal command spans, including commands in assignments.
    • Refine only when all launch mentions map to actual literal command names. Dynamic arguments/names, alias definitions, stored script text, COM dispatch and parse errors keep the existing conservative fallback.
    • Keep force-delete detection and core permission/approval decisions unchanged. No dependency or policy configuration changes.

    Validation: just test -p codex-shell-command with Rust 1.95.0 in a Linux container: 170 passed, 0 skipped. Three new tests cover 28 command strings, including unrelated environment/probe URLs, actual URL launches, dynamic launch targets, COM, stored scripts, quoted delimiters and parse failures. just fmt and git diff --check passed. These are classifier tests on strings, not execution of the fixture commands or Windows desktop integration tests.

    This is a candidate for maintainer review, not a claim of comprehensive PowerShell safety verification. It has not been installed into the desktop executor. Please review the classification change and advise on an official release/update path for desktop users. An actionable denial reason identifying the heuristic would also help.

    Full source diff follows (without local paths, raw logs, credentials or Git author metadata).

    Candidate source patch and tests
    diff --git a/codex-rs/shell-command/src/command_safety/mod.rs b/codex-rs/shell-command/src/command_safety/mod.rs
    index 44d0103..c359d8f 100644
    --- a/codex-rs/shell-command/src/command_safety/mod.rs
    +++ b/codex-rs/shell-command/src/command_safety/mod.rs
    @@ -6,4 +6,5 @@ mod powershell_parser;
     mod powershell_tree_sitter;
     
     pub mod is_dangerous_command;
    +pub(crate) use powershell_tree_sitter::try_parse_powershell_command_scopes;
     pub(crate) use powershell_tree_sitter::try_parse_powershell_commands;
    diff --git a/codex-rs/shell-command/src/command_safety/powershell_tree_sitter.rs b/codex-rs/shell-command/src/command_safety/powershell_tree_sitter.rs
    index a904e92..ff86700 100644
    --- a/codex-rs/shell-command/src/command_safety/powershell_tree_sitter.rs
    +++ b/codex-rs/shell-command/src/command_safety/powershell_tree_sitter.rs
    @@ -14,6 +14,46 @@ pub(crate) fn try_parse_powershell_commands(script: &str) -> Option<Vec<Vec<Stri
         lower_with_tree_sitter(script).ok()
     }
     
    +/// Extract command spans for URL-launch classification, including commands inside assignments.
    +/// This does not lower or authorize the enclosing script. Unknown command names and parse
    +/// errors stay opaque so callers retain their conservative fallback.
    +pub(crate) fn try_parse_powershell_command_scopes(script: &str) -> Option<Vec<Vec<String>>> {
    +    if script
    +        .chars()
    +        .any(|ch| matches!(ch, '‘' | '’' | '“' | '”' | '–' | '—' | '―'))
    +    {
    +        return None;
    +    }
    +    let mut parser = Parser::new();
    +    parser
    +        .set_language(&tree_sitter_powershell::LANGUAGE.into())
    +        .ok()?;
    +    let tree = parser.parse(script, /*old_tree*/ None)?;
    +    let root = tree.root_node();
    +    if root.has_error() || has_requires_directive(root, script) {
    +        return None;
    +    }
    +    let mut nodes = Vec::new();
    +    collect_command_nodes(root, &mut nodes);
    +    if nodes.is_empty() {
    +        return None;
    +    }
    +    nodes
    +        .into_iter()
    +        .map(|node| {
    +            let mut cursor = node.walk();
    +            let name = node
    +                .named_children(&mut cursor)
    +                .find(|child| child.kind() == "command_name")?;
    +            let name = name.utf8_text(script.as_bytes()).ok()?;
    +            if name.contains(['$', '`']) {
    +                return None;
    +            }
    +            lower_command_text(node.utf8_text(script.as_bytes()).ok()?).ok()
    +        })
    +        .collect()
    +}
    +
     fn lower_with_tree_sitter(script: &str) -> Result<Vec<Vec<String>>, String> {
         // PowerShell treats these Unicode characters as syntax aliases even when tree-sitter leaves
         // them inside generic tokens. Keep that whole spelling family opaque rather than guessing at
    diff --git a/codex-rs/shell-command/src/command_safety/windows_dangerous_commands.rs b/codex-rs/shell-command/src/command_safety/windows_dangerous_commands.rs
    index cc1ae67..db969a7 100644
    --- a/codex-rs/shell-command/src/command_safety/windows_dangerous_commands.rs
    +++ b/codex-rs/shell-command/src/command_safety/windows_dangerous_commands.rs
    @@ -25,13 +25,56 @@ fn is_dangerous_powershell(command: &[String]) -> bool {
         if !is_powershell_executable(exe) {
             return false;
         }
    -    // Parse the PowerShell invocation to get a flat token list we can scan for
    -    // dangerous cmdlets/COM calls plus any URL-looking arguments. This is a
    -    // best-effort shlex split of the script text, not a full PS parser.
    +    // Keep command boundaries when the grammar can establish them. Flattening a
    +    // compound script associates local process launches with unrelated URLs.
         let Some(parsed) = parse_powershell_invocation(rest) else {
             return false;
         };
     
    +    if let Some(script) = parsed.script.as_deref()
    +        && let Some(scopes) = crate::command_safety::try_parse_powershell_command_scopes(script)
    +    {
    +        let tokens_lc: Vec<String> = parsed
    +            .tokens
    +            .iter()
    +            .map(|word| word.to_ascii_lowercase())
    +            .collect();
    +        // Refine only when every launch mention belongs to a literal command
    +        // name. Stored script text, alias definitions and COM/method dispatch
    +        // still use the original fallback; they can execute outside these spans.
    +        let launch_word = |word: &str| {
    +            let word = word
    +                .trim_matches('\'')
    +                .trim_matches('"')
    +                .to_ascii_lowercase();
    +            matches!(word.as_str(), "start" | "saps" | "ii")
    +                || word.contains("start-process")
    +                || word.contains("invoke-item")
    +                || word.contains("rundll32")
    +                || word.contains("mshta")
    +                || word.contains("explorer")
    +                || is_browser_executable(&word)
    +        };
    +        let mentions = parsed
    +            .tokens
    +            .iter()
    +            .filter(|word| launch_word(word))
    +            .count();
    +        let commands = scopes
    +            .iter()
    +            .filter(|words| words.first().is_some_and(|word| launch_word(word)))
    +            .count();
    +        if mentions == commands
    +            && !tokens_lc
    +                .iter()
    +                .any(|word| word.contains("shellexecute") || word.contains("shell.application"))
    +        {
    +            return has_force_delete_cmdlet(&tokens_lc)
    +                || scopes
    +                    .iter()
    +                    .any(|words| is_dangerous_powershell_words(words));
    +        }
    +    }
         is_dangerous_powershell_words(&parsed.tokens)
     }
     
    @@ -367,6 +410,7 @@ fn is_browser_executable(name: &str) -> bool {
     
     struct ParsedPowershell {
         tokens: Vec<String>,
    +    script: Option<String>,
     }
     
     fn parse_powershell_invocation(args: &[String]) -> Option<ParsedPowershell> {
    @@ -385,7 +429,10 @@ fn parse_powershell_invocation(args: &[String]) -> Option<ParsedPowershell> {
                         return None;
                     }
                     let tokens = shlex_split(script)?;
    -                return Some(ParsedPowershell { tokens });
    +                return Some(ParsedPowershell {
    +                    tokens,
    +                    script: Some(script.clone()),
    +                });
                 }
                 _ if lower.starts_with("-command:") || lower.starts_with("/command:") => {
                     if idx + 1 != args.len() {
    @@ -393,7 +440,10 @@ fn parse_powershell_invocation(args: &[String]) -> Option<ParsedPowershell> {
                     }
                     let (_, script) = arg.split_once(':')?;
                     let tokens = shlex_split(script)?;
    -                return Some(ParsedPowershell { tokens });
    +                return Some(ParsedPowershell {
    +                    tokens,
    +                    script: Some(script.to_string()),
    +                });
                 }
                 "-nologo" | "-noprofile" | "-noninteractive" | "-mta" | "-sta" => {
                     idx += 1;
    @@ -403,7 +453,10 @@ fn parse_powershell_invocation(args: &[String]) -> Option<ParsedPowershell> {
                 }
                 _ => {
                     let rest = args[idx..].to_vec();
    -                return Some(ParsedPowershell { tokens: rest });
    +                return Some(ParsedPowershell {
    +                    tokens: rest,
    +                    script: None,
    +                });
                 }
             }
         }
    @@ -414,6 +467,7 @@ fn parse_powershell_invocation(args: &[String]) -> Option<ParsedPowershell> {
     #[cfg(test)]
     mod tests {
         use super::is_dangerous_command_windows;
    +    use pretty_assertions::assert_eq;
     
         fn vec_str(items: &[&str]) -> Vec<String> {
             items.iter().map(std::string::ToString::to_string).collect()
    @@ -460,6 +514,70 @@ mod tests {
             ])));
         }
     
    +    #[test]
    +    fn powershell_local_launch_does_not_consume_other_command_urls() {
    +        for script in [
    +            "$env:ORIGIN='http://127.0.0.1:18081'; $p=Start-Process -FilePath 'C:/app/server.exe' -WindowStyle Hidden -PassThru; $p.Id | Set-Content 'C:/app/server.pid'",
    +            "$p = Start-Process local.exe; Invoke-RestMethod 'http://127.0.0.1:18081/health'",
    +            "Invoke-RestMethod 'https://example.com'; $p=Start-Process local.exe",
    +            "if ($true) { $p=Start-Process local.exe }; Write-Output 'https://example.com'",
    +            "# Start-Process\n$uri='https://example.com'; Write-Output 'local'",
    +            "$uri='https://example.com'; start local.exe",
    +            "$uri='https://example.com'; saps local.exe",
    +            "$uri='https://example.com'; ii 'C:/app/readme.txt'",
    +        ] {
    +            assert_eq!(
    +                is_dangerous_command_windows(&vec_str(&["pwsh.exe", "-Command", script])),
    +                false,
    +                "{script}"
    +            );
    +        }
    +    }
    +
    +    #[test]
    +    fn powershell_scoped_launch_retains_url_and_dynamic_target_checks() {
    +        for script in [
    +            "$p=Start-Process 'https://example.com'; Write-Output 'done'",
    +            "$p=Start-Process local.exe; Start-Process 'https://example.com'",
    +            "if ($true) { Start-Process 'https://example.com' }",
    +            "Write-Output $(Start-Process 'https://example.com')",
    +            "start 'https://example.com'",
    +            "saps 'https://example.com'",
    +            "Invoke-Item 'https://example.com'",
    +            "ii 'https://example.com'",
    +            "$url='https://example.com'; Start-Process $url",
    +            "$launcher='Start-Process'; & $launcher 'https://example.com'",
    +            "$url='https://example.com'; Start-Process local.exe -ArgumentList $url",
    +            "$url='https://example.com'; (New-Object -ComObject Shell.Application).ShellExecute($url)",
    +            "Invoke-Expression 'Start-Process https://example.com'",
    +            "Set-Alias go Start-Process; go 'https://example.com'",
    +            "$code='Start-Process https://example.com'; [scriptblock]::Create($code).Invoke(); Write-Output done",
    +            "$p=Start-Process local.exe; Remove-Item 'C:/tmp/file.txt' -Force; Write-Output 'https://example.com'",
    +        ] {
    +            assert_eq!(
    +                is_dangerous_command_windows(&vec_str(&["pwsh.exe", "-Command", script])),
    +                true,
    +                "{script}"
    +            );
    +        }
    +    }
    +
    +    #[test]
    +    fn powershell_command_scope_preserves_quoted_arguments_and_fallbacks() {
    +        for script in [
    +            "Start-Process 'https://example.com/a;b'",
    +            "Start-Process 'https://example.com/a|b'",
    +            "Start-Process 'https://example.com/a&b'",
    +            "Start-Process 'https://example.com'; if (",
    +        ] {
    +            assert_eq!(
    +                is_dangerous_command_windows(&vec_str(&["pwsh.exe", "-Command", script])),
    +                true,
    +                "{script}"
    +            );
    +        }
    +    }
    +
         #[test]
         fn cmd_start_with_url_is_dangerous() {
             assert!(is_dangerous_command_windows(&vec_str(&[
  6. andrew-adamson-proteros commented on Sep 8, 2026

    @andrew-adamson-proteros

    Additional reproduction on 8 September 2026: this false positive also occurs when no process-launch command exists at all. An ordinary string argument named start is sufficient when an HTTP(S) URL appears in the same classified command. Even a single URL argument triggers rejection if its path or fully qualified domain name contains start-process or invoke-item.

    Minimal live reproductions (each submitted separately):

    Write-Output 'https://example.invalid/' 'start'
    Write-Output 'https://start-process.example.invalid/'

    Codex rejects both before PowerShell executes. These arguments are literal output data; neither command requests a URL launch.

    Environment and scope

    • Native Windows Codex desktop task, with PowerShell 7 at the standard pwsh.exe installation path.
    • Task permission context: approval_policy = never, sandbox_mode = danger-full-access; filesystem access was unrestricted.
    • Reproductions were submitted directly through the task's exec_command tool. They were not merely evaluated by a separately implemented classifier.
    • codex-cli 0.153.0
    • All test commands only print literal text or Python arguments. example.invalid is used as inert data. No URL was opened, no network request was made by the test commands, and no actual Start-Process command was submitted.
    • No permission settings or rules were changed, and no installed Codex files were modified.

    Live rejection and controls

    The rejected calls returned an exec_command tool error with this structure, abbreviated to omit repetitive shell quoting and the local executable path:

    CreateProcess { message: "Rejected(… rejected: blocked by policy)" }
    

    The rejection occurred before the submitted command executed. Successful controls exited with code 0 and printed the expected data.

    1. A noncommand start argument is enough.

    Rejected:

    Write-Output 'https://example.invalid/' 'start'

    Both of these controls succeeded:

    Write-Output 'https://example.invalid/' 'run'
    Write-Output 'plain-data' 'start'

    2. The same problem affects native-program arguments.

    Rejected:

    python -c "import sys; print(sys.argv[1:])" start https://example.invalid/

    Replacing only start with run succeeded and printed ['run', 'https://example.invalid/']:

    python -c "import sys; print(sys.argv[1:])" run https://example.invalid/

    3. A here-string causes unrelated commands to become associated.

    Rejected as a single exec_command invocation:

    Write-Output @'
    https://example.invalid/
    '@
    Write-Output 'start'

    Changing the last argument to run succeeded. Keeping start but replacing the here-string URL with plain-data also succeeded.

    This version was likewise rejected:

    Write-Output @'
    https://example.invalid/
    '@
    python -c "import sys; print(sys.argv[1:])" start

    However, these two ordinary commands succeeded together in one tool invocation:

    Write-Output 'https://example.invalid/'
    Write-Output 'start'

    This distinction matters: the problem is not simply that every script containing both strings is rejected. The restricted parser can preserve command boundaries for ordinary literal commands, while unsupported syntax such as here-strings sends the whole invocation through the fallback heuristic.

    4. Additional token-matching controls.

    Input Live result
    Write-Output 'https://example.invalid/' 'START' Rejected
    Write-Output 'https://example.invalid/' 'prefix-start-process-suffix' Rejected
    Write-Output 'https://example.invalid/' 'restart' Passed
    Write-Output 'https://example.invalid/' Passed
    Write-Output 'start' Passed

    5. Matching text inside the URL itself, including the FQDN.

    Each row below was tested as its own exec_command call using Write-Output '<URL>'. There was no separate launch-like argument or second command.

    URL passed as the only argument to Write-Output Live result
    https://example.invalid/start Passed
    https://start.example.invalid/ Passed
    https://example.invalid/?action=start Passed
    https://example.invalid/start-process Rejected
    https://example.invalid/invoke-item Rejected
    https://start-process.example.invalid/ Rejected
    https://invoke-item.example.invalid/ Rejected
    https://prefix-start-process-suffix.example.invalid/ Rejected
    https://prefix-invoke-item-suffix.example.invalid/ Rejected
    https://ordinary.example.invalid/ Passed

    For example, this was rejected before execution:

    Write-Output 'https://prefix-invoke-item-suffix.example.invalid/'

    These results distinguish whole-token matching for start from substring matching for start-process and invoke-item. For the latter two, the URL token itself satisfies both the URL check and the launch-name substring check. This occurs even when the substring is embedded within a longer DNS label. No DNS lookup, network request, or browser launch is involved in printing these strings.

    6. HTTP, unusual URL spellings, and other URL-like strings with a separate start argument.

    Each row below was tested separately using Write-Output '<value>' 'start':

    Value Live result
    http://example.invalid/ Rejected
    HTTP://example.invalid/ Rejected
    hTtPs://example.invalid/ Rejected
    http:example.invalid Rejected
    https:example.invalid Rejected
    http:/example.invalid Rejected
    https:///example.invalid/ Rejected
    prefix-http://example.invalid/ Rejected
    http:// Passed
    //example.invalid/ Passed
    www.example.invalid Passed
    example.invalid Passed
    ftp://example.invalid/ Passed
    file:///example.invalid/ Passed
    ws://example.invalid/ Passed
    mailto:test@example.invalid Passed
    https%3A%2F%2Fexample.invalid Passed
    https ://example.invalid/ Passed
    httpx://example.invalid/ Passed
    http://. Rejected

    An additional control, Write-Output 'http://.' 'run', succeeded. Thus an especially short reproduction is:

    Write-Output 'http://.' 'start'

    These results are consistent with looks_like_url() in the inspected Windows classifier: it searches case-insensitively for embedded http:// or https:// prefixes, passes the resulting candidate (or the original token when no prefix is found) to url::Url::parse, and accepts the http and https schemes. Consequently, some nonstandard-looking slash forms and http://. qualify, while the tested scheme-less, encoded, and other-scheme strings do not. The matching is a syntactic classification; it does not require DNS resolution or a reachable server.

    Across all live variations above, there were 46 calls: 22 rejected calls and 24 successful controls. Every rejected call returned the same generic pre-execution policy error; successful calls printed the expected data and exited with code 0. This is a bounded reproduction set, not an exhaustive syntax matrix.

    Current upstream source and release status

    Source inspection was performed on 8 September 2026, approximately 13:28 AWST (UTC+08:00).

    • Inspected main at 95327467c3af9533ac25b171b3496b951fe425ed, committed on 8 September 2026 at 13:12:10 AWST.
    • GitHub's latest stable release at inspection time was rust-v0.153.4, published on 5 September 2026 at 07:25:48 AWST.
    • The relevant windows_dangerous_commands.rs and powershell_tree_sitter.rs files were identical between that release and the inspected main commit. The defect remains present in both source versions; I did not separately run the released 0.153.4 binary.

    The source explains the related failure modes:

    1. Argument mistaken for command. is_dangerous_powershell_words() checks for a URL anywhere in words and independently searches all words for start, start-process, saps, invoke-item, or ii. It also accepts substrings containing start-process or invoke-item. It does not require the matching word to occupy the command position. This affects even successfully lowered commands such as Write-Output ... start and python ... start ....
    2. Command boundaries lost on fallback. parse_powershell_command_into_plain_commands() delegates to the restricted Tree-sitter lowerer. The here-string fixtures explicitly expect null. When lowering returns None, commands_for_exec_policy_for_platform() retains the whole shell invocation, and parse_powershell_invocation() in the Windows dangerous-command module uses shlex to flatten the script. An unrelated URL and start argument can then be associated across commands.
    3. The URL itself mistaken for a launch command. The same is_dangerous_powershell_words() predicate includes t.contains("start-process") and t.contains("invoke-item"). A single argument such as https://start-process.example.invalid/ therefore supplies both has_url and the substring match. Associating URLs with individual commands alone would not resolve this case: the classifier also needs to distinguish the invoked command from literal argument contents.

    In exec_policy.rs, render_decision_for_unmatched_command_for_platform() maps a dangerous-command match to Forbidden when approval policy is Never. DangerousCommandMatch::Other becomes the generic reason blocked by policy. tools/orchestrator.rs returns ToolError::Rejected for that forbidden requirement before running the command.

    Separate source-level reproduction

    In addition to the live tool calls, I compiled a small standalone Rust harness using the unchanged parser and Windows classifier files fetched from the pinned upstream commit. The harness only classified strings; it did not execute them.

    It produced:

    here-string URL + noncommand start: lowered=None; dangerous=true
    same data, argument run: lowered=None; dangerous=false
    same start, no URL: lowered=None; dangerous=false
    plain program argument start + URL: lowered=Some(...); dangerous=true
    actual URL launch control: lowered=Some(...); dangerous=true
    

    The last row classified Start-Process https://example.invalid/ as a string-only positive control. That command was not executed.

    Related PRs checked

    I found no open or merged PR addressing this exact URL-plus-noncommand-start case in the searches and relevant file history inspected. This is a search result, not a guarantee that no unindexed or differently described work exists.

    These merged PRs are related but do not fix it:

    • #20336: unwraps PowerShell commands for execpolicy matching while retaining the dangerous-command heuristic.
    • #30879: recognizes mixed-case HTTP(S) schemes; fixes a missed dangerous match, not this false positive.
    • #39213 and #39311: introduce/adopt restricted in-process PowerShell lowering; here-strings remain unsupported.
    • #42113: applies remote-platform semantics and bounds rejection messages; does not fix command/argument association.

    Expected behaviour

    Literal output data and native-program arguments named start should not be interpreted as PowerShell launch commands. Neither should URL paths or hostnames containing start-process or invoke-item. A fix should address both command-position recognition and URL ownership within the relevant command expression. Existing protection for actual URL/ShellExecute launches should remain intact.

    Regression coverage should include ordinary start arguments, single URL arguments containing the longer substrings in their path or FQDN, the here-string cross-command case, and an actual URL-launch classifier control. HTTP and parser-accepted unusual forms such as http://. also reproduce the false positive. The successful URL-with-start, encoded/other-scheme, and ordinary separate-command controls above help preserve the distinctions already handled correctly.

  7. bstisgood commented on Sep 9, 2026

    @bstisgood

    Additional sanitized Windows Desktop occurrence, observed on 2026-09-08.

    • Desktop package: OpenAI.Codex 26.901.6511.0.
    • Full Access was selected in the app. Read-only app diagnostics also recorded resolvedApprovalPolicy=never; this is not a claim that every effective policy source has been identified.
    • The authorized operation was isolated npm dependency-metadata preparation using --package-lock-only and --ignore-scripts, not deployment or execution of package lifecycle scripts.

    The compound PowerShell invocation constructed a System.Diagnostics.ProcessStartInfo with UseShellExecute=false and contained an HTTPS npm registry argument. The URL was package-manager configuration, not a request to open a URL via ShellExecute.

    The tool immediately returned a CreateProcess rejection ending in blocked by policy, with reported wall time 0.0 seconds. No npm output or lock file was produced. The command was not rerouted through CMD or another execution tool, and no permission rules were changed.

    The public is_dangerous_powershell_words implementation checks for a URL alongside a token containing shellexecute. That makes this command shape consistent with the heuristic discussed here, including the literal UseShellExecute=false case. However, the denying rule and the installed desktop engine's exact source revision have not been established; this is a suspected relationship, not a confirmed diagnosis or a separately executed minimal reproduction.

    The user has already uploaded in-app feedback and explicitly authorized sharing its ID here:
    01a005b9-7b99-77d3-b70c-d385c882ddd4

    Could maintainers confirm whether this is the same classification issue and identify a supported, narrowly scoped resolution or diagnostic path? Protection against actual unsafe URL/ShellExecute launches should remain intact.

    No project source, personal filesystem paths, credentials, raw logs, or full conversation are included in this comment.

  8. staminaoo commented on Sep 9, 2026

    @staminaoo

    Additional Windows desktop occurrence observed on 2026-09-09, with a variation: the unrelated loopback URL was only a value printed in the final result object. It was neither a process argument nor a health-check request.

    Environment and actual observation

    • The executable used by the running desktop app-server reported codex-cli 0.153.4.
    • Full Access was selected in the UI. The affected turn's runtime diagnostics recorded approval_policy=Never and sandbox_policy=DangerFullAccess; configuration also had approvals_reviewer="user".
    • The authorized task was to start a local Node.js preview server listening only on 127.0.0.1.

    One compound PowerShell tool invocation attempted a local Start-Process -WindowStyle Hidden launch with redirected logs, then printed the process ID and preview URL. It was rejected before execution:

    CreateProcess { message: "Rejected(... rejected: blocked by policy)" }
    Wall time 0.0 seconds
    

    Abbreviated, redacted shape of that recorded invocation (not an independently executed minimal reproduction; directory setup, log redirection and PID-file output are omitted):

    $p = Start-Process -FilePath '<node.exe>' -ArgumentList @('scripts/serve.mjs') -WorkingDirectory '<project>' -WindowStyle Hidden -PassThru
    [pscustomobject]@{
        ProcessId = $p.Id
        Preview = 'http://127.0.0.1:4186/public-preview/'
    }

    Read-only inspection of the original command confirmed that its URL appeared only in the final display statement, not in the launch statement. A subsequent foreground preview launch succeeded. The rejected background invocation was not replayed, and no permission or execution-policy rules were changed.

    Source correlation and requested improvement

    The 0.153.4 classifier checks for a URL and launch-related words across the supplied token list. The execution-policy code maps a dangerous match plus Never to Forbidden. This is consistent with the observed failure, but the generic error did not expose an actual matched-rule/classifier trace.

    Please include an unrelated printed URL/result-object value in regression coverage, provide an actionable rejection reason, and clarify the Full Access UI wording. The current wording led me to expect this authorized local development operation to run without approval, making the unexplained denial particularly confusing. Existing protection for actual unsafe URL/ShellExecute launches should remain intact.

    No private project paths, public-facing personal domains, credentials, screenshots, or raw diagnostic logs are included.

  9. Josh-Gamer commented on Sep 10, 2026

    @Josh-Gamer

    Additional sanitized Windows Desktop occurrence on 2026-09-10: the noncommand start token was inside Python source being generated within a single-quoted PowerShell here-string. This extends the literal-data case described above.

    Environment and observed failure

    • Desktop MSIX package: OpenAI.Codex 26.903.9818.0.
    • Desktop client version recorded by app-server: 26.903.71938.
    • Affected task's recorded CLI version: 0.153.4; the running desktop executor path was the npm-installed native CLI.
    • The rejected turn recorded approval_policy=never, approvals_reviewer=user, and sandbox_policy=danger-full-access.

    The authorized operation was creation of one local unit-test file. A PowerShell here-string held a Python file-generation program; that program contained the test source as a triple-single-quoted string. The test source included a Python variable named start and synthetic HTTPS Origin values. The operation did not request a browser or URL/ShellExecute launch.

    The tool rejected the command before process creation:

    exec_command failed: CreateProcess ... Rejected(... rejected: blocked by policy)
    

    The target file remained absent. An identical resubmission after a normal desktop restart was also rejected. Static parsing of the complete original PowerShell command reported zero errors.

    Independently verified classifier-only example

    The following synthetic example was passed only as data to a standalone classifier, not submitted to the desktop execution tool or executed as PowerShell/Python. It contains no project source, filesystem paths, or network operation:

    $pythonCode = @'
    source = '''
    start = 1
    url = "https://example.test"
    '''
    print(source)
    '@
    python -c $pythonCode

    A small Rust harness included the unchanged upstream Windows classifier at commit 94697375cb9d2aa8ae74d61957c6b396819bec94. The source Git blob was verified as cc1ae671c831130dd33d11bac690d3052430b6dd. The harness read stdin into script and called:

    is_dangerous_command_windows(&[
        "pwsh.exe".to_string(),
        "-Command".to_string(),
        script,
    ])

    Built successfully with cargo build --offline using existing cached dependencies: shlex 1.3.0, once_cell 1.21.3, regex 1.12.2, and url 2.3.1. These are the reproduction's dependency versions, not a claim of exact dependency equivalence with the installed executor.

    Result for the synthetic example:

    target_command_executed=false
    rust_shlex_token_count=13
    plain_start_token_count=1
    upstream_args_have_url=true
    upstream_windows_dangerous_result=true
    

    The same standalone classifier also returned true for the byte-verified original command. Neither classifier run executed its input or modified the target file.

    Diagnostic limits and requested improvement

    A same-version execpolicy check against the user's rule file returned matchedRules: []; that tests the supplied rules, not the full runtime fallback. Local DEBUG/TRACE records showed only Allow prefix rules being loaded. For the rejected call, the available log contained the generic router error without the matched classifier or decision inputs.

    This strongly supports the literal-data false positive, but the exact in-process branch taken by the running executor remains unconfirmed. The independent harness tests the Windows classifier; it does not reproduce the complete desktop parser/policy pipeline.

    Please include nested Python source strings in regression coverage, distinguish actual PowerShell command positions from literal argument/string contents, and preserve a specific rejection reason through the classifier and policy layers. Existing checks for real URL/ShellExecute launches and unresolved dynamic execution should remain effective. Safe diagnostic fields such as parser path, classifier reason, effective approval mode, and final decision would make these failures actionable.

    This comment omits local usernames, repository identifiers, absolute paths, task/call IDs, credentials, project source, and raw logs.

  10. JosephFrancisRe commented on Sep 12, 2026

    @JosephFrancisRe

    Additional Windows desktop occurrence: Unity configuration rejected before execution

    Prepared 2026-09-12 UTC for user-authorized public submission. This is a sanitized
    diagnostic report, not a workaround script. No credentials, tokens, private account
    identifiers, live service address, raw conversation, or private repository URL are
    included.

    This appears related to #40060: the rejected PowerShell invocation contains
    Start-Process and an HTTPS URL. In this occurrence the URL is a configuration
    argument to an explicitly named local Unity executable, not the launch target or
    a request to open a browser. The actual denying classifier in the installed
    executor has not been identified; this is a suspected relationship, not a proven
    root cause or a separately tested minimal reproduction.

    The owner reports submitting two in-app feedback reports. Their feedback IDs have
    not been provided, so no session or feedback identifier is included here.

    Problem and impact

    A user-authorized Unity Editor configuration operation is rejected by the Codex
    execution tool before the outer PowerShell process starts. The user selected Full
    Access and restarted the desktop app. One normal retry after restart returned the
    same rejection. Ordinary read-only PowerShell and Git diagnostic commands continue
    to work. The project-to-development-service connection remains unconfigured.

    The returned error has this shape (workstation paths and command body omitted):

    exec_command failed: CreateProcess {
      message: "Rejected(\"<bundled pwsh.exe> -Command '<configuration script>'
                rejected: blocked by policy\")"
    }
    

    No rejecting rule ID, rationale, approval prompt, Windows error code, or remediation
    is returned. No sandbox-permission override was requested on the failed call.

    Environment

    • Windows 11, build 10.0.26200, x64.
    • Installed desktop package: OpenAI.Codex 26.903.9818.0.
    • Running Codex component and codex doctor: 0.153.4.
    • Unity Editor: 6000.3.9f1, revision 7a9955a4f2fa.
    • Unity Hub: 3.21.2; updating it did not change the rejection.
    • Current task environment reports danger-full-access, approval policy never,
      and enabled network access.
    • The app offers the user no update. Doctor advertises a newer build, but prior
      official distribution checks did not provide an installable newer package.
      No downgrade, forced update, or reinstall was performed.

    Rejected operation: scope and arguments

    The outer PowerShell script checks that no Unity process is running, creates an
    ignored log directory, launches the existing pinned Unity executable with
    Start-Process -WindowStyle Hidden -PassThru, waits for exit, and checks a fixed
    success marker. Project and log arguments containing spaces are explicitly quoted.
    The argument structure below is descriptive; placeholders are not runnable paths:

    -batchmode -quit
    -projectPath "<EXISTING_ISOLATED_UNITY_PROJECT_WITH_SPACES>"
    -executeMethod <PROJECT_EDITOR_CONFIGURATION_METHOD>
    <PROJECT_PUBLIC_ENDPOINT_ARGUMENT> <USER_OWNED_PUBLIC_HTTPS_API_ORIGIN>
    -logFile "<IGNORED_CONFIGURATION_LOG>"
    

    The inspected Editor method validates the origin locally and saves only the public
    endpoint field of the existing settings asset through Unity's AssetDatabase APIs.
    It does not read a credential vault, sign in, call an account/cloud API, enable a
    server feature, or grant rewards. Normal Unity imports/cache writes may occur.
    The isolated feature worktree was clean and no Unity process was running.

    Correlated evidence

    All timestamps below are UTC on 2026-09-12.

    Time Observation
    01:25:44-01:26:12 Earlier compile/content/scene-audit log file timestamps bracket successful runs of the same Unity executable against the same spaced project path. These are file timestamps, not exact process start/stop measurements.
    01:26:22-01:28:10 EditMode test XML records 1,333 passed, zero failed.
    01:28:23-01:28:37 PlayMode test XML records 152 passed, zero failed.
    02:16:53.214 Restarted desktop application begins logging.
    02:16:55.043 App log: Codex CLI initialized.
    02:16:55.044 App-server connection records next=connected, initialized=true, connectionError=null.
    02:17:05.821 This task's resume response records responseActivePermissionProfile=:danger-full-access, responseApprovalPolicy=never, and responseSandboxPolicy.type=dangerFullAccess.
    02:17:38.150 The retry turn resolves resolvedApprovalPolicy=never, resolvedApprovalsReviewer=user.
    02:17:38-02:20:04 The post-restart turn contains the rejected configuration attempt. This is the turn window; the exact rejection timestamp is not available in the inspected app logs.

    The resume log also contains derived defaults of on-request/workspace-write, but
    its returned active settings and subsequent turn-start settings say never/Full
    Access. The default fields alone are not evidence that the task lost Full Access.

    Successful Unity logs contain:

    Initialize engine version: 6000.3.9f1 (7a9955a4f2fa)
    Content validation passed. Errors: 0, warnings: 0
    Vertical-slice project audit passed. Errors: 0, warnings: 0
    Exiting batchmode successfully now!
    

    Earlier successful commands also use -batchmode, synchronous -executeMethod,
    -quit, and quoted spaced paths. They are comparison evidence, not an identical
    configuration reproduction. Mocked test success is not live server verification.

    Diagnostics performed and limits

    • Fresh codex doctor --json: installation/configuration consistent, app-server
      initialized, provider HTTP/WebSocket reachable, databases inspectable, and no
      locally visible recent Codex security enforcement found.
    • Doctor's overall failure is its non-interactive TERM=dumb check. Its standalone
      CLI on-disk sandbox defaults are not the active desktop task's permissions.
    • Inspected September 11/12 desktop log files for policy rejection indicators;
      no matching explanation was found. Inspected runtime log-database metadata for
      this task and threadless entries during 02:17-02:25; no blocked by policy
      record was found. Database access was read-only; no conversation or reviewer
      reasoning was exported.
    • Defender, AppLocker EXE/DLL, and Code Integrity operational logs are enabled.
      Queries for warning/error events during 02:17-02:21 returned no matches. This
      does not prove that every possible Windows/security control was ruled out.
    • Previously, a read-only check of the local execution-rules file found no
      matching rule. It does not prove all host-side/managed controls allow the action.
    • Warnings observed include unsupported PowerShell shell snapshots and an
      after-agent notification hook's Windows error 206 at turn end. Neither identifies
      the launch denial. No hook, Defender exclusion, permission, or policy was changed.
    • The expected configuration log still does not exist; the endpoint asset remains
      blank and retains its pre-attempt modification timestamp.

    Diagnosis and requested resolution

    Confirmed failure boundary: command execution is refused before PowerShell/Unity,
    while the desktop records Full Access for the task. The exact rejecting component
    and rule remain unidentified. This is not evidence of an AWS IAM failure, a Unity
    compile error, or a particular known app bug.

    Please identify which execution/approval layer emitted blocked by policy, explain
    why no rationale or rule identifier reached the tool result, and provide the
    supported remedy or exact-action approval procedure for this desktop version.
    If a newer build fixes this case, please confirm its accessible Windows update
    channel rather than relying only on advertised version metadata.

    No retries after the post-restart denial, alternate execution routes, security
    weakening, cloud changes, game-credential use, or destructive fallback were attempted
    during this investigation. Existing application work and user edits are preserved.

    Official diagnostic references

    Only sanitized excerpts are included. The original conversation and raw logs have
    not been attached to this public report.

  11. reneehuang92 commented on Sep 12, 2026

    @reneehuang92

    Additional Windows desktop occurrence observed on 2026-09-12, submitted at the account holder's explicit request.

    The rejected command contains Invoke-RestMethod against a loopback status endpoint and a separate Start-Process launching a local PowerShell service-restart script in the same tool invocation. The URL is not a launch target or an argument to Start-Process. This closely matches the command shape reported here, but we have not established the effective denying classifier in our installed desktop build.

    Environment and result

    • Installed desktop package, verified today: OpenAI.Codex 26.903.9818.0. The bundled engine version was not independently queried for this report.
    • Windows desktop; tool wrapper is the bundled PowerShell.
    • Active task context reports danger-full-access, approval_policy=never, and network access enabled.
    • Around 15:57 Asia/Taipei, the tool immediately returned CreateProcess ... rejected: blocked by policy, before execution.
    • No named rule, decision ID, review rationale, or applicable desktop approval action was returned.
    • Ordinary reads, Git operations, offline tests, and independent read-only local status requests continue to succeed.

    Scope and impact

    The user-authorized operation was to validate graceful shutdown and restart of an already repaired local Python service. The existing restart script checks that automated trading is OFF and verifies the current process identity. Restart would close an existing brokerage session and establish a new authenticated session; it is not purely read-only. It would not place, cancel, or amend orders or enable trading.

    The rejected invocation never ran. A subsequent independent status read confirmed the already-running service remained OFF, connected, and reconciled. We have not retried that denied restart through another wrapper/client, split the operation to evade rejection, or changed security settings. Matching this issue's command shape is evidence for investigation, not proof that our entire service operation should be permitted.

    The account holder reports approximately a week of development usage and repeated launch/validation interruptions. Earlier product Feedback was successfully submitted on September 11, but no actionable response or human case number has been obtained:

    no-active-thread-01a08e1d-22c6-7383-aee3-64dd5eec487b

    Questions for maintainers

    1. Is the whole-script Start-Process / unrelated-URL classifier still present in this desktop package? Is there a fixed Windows desktop build and an accessible official update channel?
    2. Can the denial expose its concrete classifier/rule and correlation ID, so a false positive can be distinguished from a separate policy restriction?
    3. What is the supported exact-action review or remediation flow for this Windows desktop configuration? The documented /approve flow explicitly describes the open-source TUI; we cannot confirm it applies here.
    4. If this occurrence belongs elsewhere, which supported issue/support channel should receive the existing Feedback ID?

    No credentials, email address, brokerage account identity, private project paths, raw sessions, or brokerage logs are included. We are requesting an actionable diagnosis and supported resolution, not a security bypass.

  12. 15 remaining items

  13. aiyang-bai commented on Oct 6, 2026

    @aiyang-bai

    Additional 0.160.0 Windows Desktop occurrence with a preserved original call and local source-only reproduction. Posting with the affected user's explicit authorization. This is intended as new evidence for this existing issue, not a duplicate report.

    Environment and incident policy

    • Codex Desktop internal version: 26.930.41038, build 13022
    • Windows MSIX package: 26.930.4958.0
    • Codex core recorded for the affected session: 0.160.0
    • Current bundled core independently verified as 0.160.0
    • PowerShell: 7.6.5
    • The exact rejected turn's persisted context records:
      • approval_policy=never
      • sandbox_policy.type=danger-full-access
      • permission_profile.type=disabled
    • A same-window native log independently records Never / DangerFullAccess.

    Therefore, for this occurrence, "Full Access was not actually enabled" does not explain the rejection.

    Incident time: 2026-10-05T17:40:26.619Z
    Tool call ID: call_2IJcdQLLtM4BcemfNh6sUrbH

    The returned error was the same family:

    exec_command failed: CreateProcess ... Rejected(... rejected: blocked by policy)
    

    The rejection occurred before the bundled pwsh.exe was created; the local Helper did not start. No retry or alternate launch path was used.

    Original command structure

    The exact original command was recovered locally and preserved privately. It is not pasted here because it contains private filesystem details.

    Native PowerShell AST parsing reports no syntax errors and shows two distinct invocations:

    Start-Process -FilePath $exe -WorkingDirectory (Split-Path -Parent $exe) -WindowStyle Hidden -PassThru
    Invoke-WebRequest -Uri 'http://127.0.0.1:19540/health' -TimeoutSec 2 -NoProxy

    The URL belongs to the independent loopback health request. It is not the Start-Process target.

    Pinned 0.160.0 source reproduction

    I pinned the public rust-v0.160.0 source to commit a956835d020762cb2b570053af06f643a11c0ecc and used the unmodified Windows classifier:

    https://github.com/openai/codex/blob/a956835d020762cb2b570053af06f643a11c0ecc/codex-rs/shell-command/src/command_safety/windows_dangerous_commands.rs

    The relevant logic computes has_url across the whole flattened PowerShell token list, then independently searches that same list for Start-Process / launch tokens.

    Using the preserved original argv as classifier input only (the command was not executed), the 0.160.0 classifier returns dangerous=true.

    A simplified string-only diagnostic reproduces the same false positive:

    Start-Process -FilePath 'E:\LOCAL_EXAMPLE\Helper.exe'; Invoke-WebRequest -Uri 'http://127.0.0.1:19540/health'

    Diagnostics:

    • Existing upstream classifier tests: 40 passed / 0 failed
    • Additional local classification cases: 8
    • False positives: 2
      • exact preserved original argv
      • local Start-Process + independent loopback health request
    • Local Start-Process alone: not dangerous
    • Loopback health request alone: not dangerous
    • Real URL launch: dangerous
    • Invoke-Item URL: dangerous
    • ShellExecute URL: dangerous
    • Force-delete literal case: dangerous

    All of the above were classifier/string tests only. None of the dangerous commands were executed.

    I also compared the 0.160.1 Windows classifier bytes available locally; they are identical to 0.160.0 for this file, so I do not have evidence that 0.160.1 fixes this issue.

    Attribution limit

    This establishes that the same-version public classifier has a false-positive path matching the preserved command shape. It does not prove that the original installed call selected this exact internal branch: the original per-call matched rule/category/fallback was not exported.

    So the current conclusion is deliberately limited to:

    • source false positive: confirmed
    • original call's exact matched internal branch/category: not proven
    • installed host repair: not present
    • original application recovery: not tested because no host fix is active

    Maintainer request

    Could maintainers please:

    1. Check the original call's matched rule/category/final fallback using the call ID above.
    2. Confirm whether the whole-script URL + local launch association is the denying classifier path for this occurrence.
    3. Fix URL association at the invocation/AST level (or another equivalently safe method), while preserving conservative handling of dynamic/unknown launch targets, real URL/ShellExecute launches, destructive operations, and other security boundaries.
    4. Expose an actionable denial category/source/remediation instead of collapsing the result to only blocked by policy.
    5. Identify the first supported signed Desktop/core build containing the fix so the original local Helper path can be re-tested without command splitting, renamed executables, cached-binary edits, or policy bypasses.

    No credentials, real private paths, raw logs, complete command, conversation transcript, or business data are included here. No production/business code or local host policy was modified.

    Related diagnostic-explanation issue: #49373.

  14. Jonathan-Ironman commented on Oct 6, 2026

    @Jonathan-Ironman

    Still occurs on codex-cli 0.160.1 on Windows with Full Access.

    This also affects start used as a subcommand of an unrelated CLI, not just Start-Process.

    Observed runtime settings in the local Codex logs:

    approval_policy=Never
    sandbox_policy=DangerFullAccess
    

    The command had this shape (CLI name and task text anonymized):

    project-cli subtask start --text 'Configure the remote service at https://example.com/mcp and report the result.'

    Codex rejected the command before PowerShell or the target CLI ran:

    exec_command failed: CreateProcess { message: "Rejected(... rejected: blocked by policy)" }
    

    This is a CLI subcommand with a URL in a text argument. It does not invoke the PowerShell start alias or request a browser launch. The rejection occurred repeatedly, including after the user explicitly authorized the operation. Local user execpolicy rules had no matching prohibition.

    The shipped version's classifier explains this case:
    https://github.com/openai/codex/blob/rust-v0.160.1/codex-rs/shell-command/src/command_safety/windows_dangerous_commands.rs

    is_dangerous_powershell_words computes has_url across all arguments and matches any token equal to start. It does not check whether start is the command being executed. looks_like_url also searches for URL prefixes inside text arguments.

    Please add a regression case for start as a CLI subcommand with a URL in a quoted data argument. The classifier should associate command identity and URL arguments with the relevant PowerShell invocation. The rejection should also identify the matched rule instead of returning only blocked by policy.

  15. lovekkcoola-glitch commented on Oct 8, 2026

    @lovekkcoola-glitch

    Additional Windows Desktop evidence: a rejected command did not contain any PowerShell process-launch command.

    Environment: Windows 11 Pro x64, OS 10.0.26200; PowerShell 7.6.5; Desktop package 26.1002.7124.0 (internal app 26.1002.52244, build 13536); the running bundled core was previously identified as 0.162.0-alpha.2. At the time of these rejections, the effective tool context was approval policy never and sandbox danger-full-access.

    Two actual tool requests were rejected before execution: a readiness/report request on October 8 and a read-only HTTPS diagnostic request on October 9 (Asia/Shanghai). Both returned CreateProcess wrapping Rejected / rejected: blocked by policy. The new diagnostic did not execute or create its intended receipt.

    For each original request, I parsed the exact submitted command string with the PowerShell Parser without executing it. Both parsed with zero errors; the only PowerShell command node was python. The script was passed through one single-quoted here-string. The here-string data contained URLs and the ordinary word start; the new request included the description no process start or rejected action retry. There was no actual Start-Process, Invoke-Item, or start command node.

    The corresponding public source at commit 74e804deeb1241d5fe699b31fb319f7d46454c42 uses shlex::split on the complete PowerShell -Command body and scans the flattened words for a URL plus a launch-related word:

    https://github.com/openai/codex/blob/74e804deeb1241d5fe699b31fb319f7d46454c42/codex-rs/shell-command/src/command_safety/windows_dangerous_commands.rs

    A Python POSIX-shlex approximation of the original strings produces an exact start token plus URL tokens in both cases. This is supporting static evidence only: I have not run the Rust classifier, and the tool error and available logs do not expose the matched rule or classification. I cannot prove the runtime branch from that output alone.

    Could maintainers check whether inert here-string data is being classified as a launch command, and provide the specific rejection rule in diagnostics? Any classifier correction should preserve rejection/review of real URL-launch commands.

    The affected Desktop chat has no permissions control according to the user's repeated UI checks, and the app updater reports up_to_date. After these rejections, a separate local collaborator changed the user configuration default to on-request; the current turn still declares never, so active-chat adoption has not been verified. The blocked requests were not rewritten, split, or rerun through another executor; no installed-core changes were made. No post-configuration-change retry is included in this report. This report contains no credentials, business data, raw logs, or private filesystem paths.

  16. ruekenndesiraeinghalry-spec commented on Oct 9, 2026

    @ruekenndesiraeinghalry-spec

    补充一个 Windows Codex Desktop 实例,疑似相关,但尚未确认共同根因。

    环境:Windows 11;桌面包 26.1002.7124.0;运行 CLI 0.162.0-alpha.2。拒绝时为 danger-full-access、approval_policy=never。

    用户已授权更新一个本机 Node 后台。原 PowerShell 命令先通过回环 HTTP 核验任务状态,再核对目标 PID、程序路径和端口,随后停止并启动同一程序。HTTP 地址属于状态查询,不是进程启动参数。

    最新拒绝时间:2026-10-09 15:15:49.968 UTC+08:00。内部调用号:exec-d35b4d8f-cd3b-4a23-9d01-1898629b2f6d。

    返回 exec_command failed: CreateProcess … rejected: blocked by policy,命令未启动。原命令对已检查本地规则的只读检查返回 matchedRules: [];这不排除内置或其他策略。旧服务和结果文件保持不变。

    请维护方确认:具体由哪个判断及命令片段触发?是否属于本问题?当前版本支持哪种针对该操作的审批或恢复路径,是否已有修复版本?

    本文不附账号、私有源码、账本、完整命令或原始日志;如需进一步证据,请指定最小范围和私密提交渠道。

  17. XianBeiQiShi commented on Oct 10, 2026

    @XianBeiQiShi

    Additional source-level verification of this false positive.

    I compiled the unchanged upstream windows_dangerous_commands.rs into an isolated Rust harness and supplied command strings strictly as data:

    Input Classified as dangerous
    Combined script: local executable launch plus an independent loopback HTTP status check true
    Launch line alone false
    Status-check line alone false
    Local launch command followed by an unrelated URL printed as text true

    The URL in the combined script belonged to the status check, not to Start-Process.

    These are direct classifier tests: the fixture commands were not executed, and the harness does not reproduce the complete exec-policy pipeline. The results reproduce the cross-command association in is_dangerous_powershell_words.

    There was also a related pre-execution rejection while generating a diagnostic report. The submitted command contained Start-Process as prose inside the report text, alongside HTTP URLs; it did not invoke Start-Process. The tool returned:

    CreateProcess ... rejected: blocked by policy
    

    The exact internal decision path of that running executor was not instrumented. Its behavior is consistent with the flattened-token fallback, and suggests regression coverage should include quoted report content containing launch keywords and unrelated URLs.

    Please consider command-scoped URL matching and a rejection message identifying the matched heuristic. Protections for actual URL-launch operations should remain intact.

  18. dhanur2 commented on Oct 12, 2026

    @dhanur2

    Reproduced with codex-cli 0.162.0-alpha.17.2 on Windows PowerShell. This needs no process launch, file write, credential, scraper, or network request. It is an output-only here-string:

    @'
    throw new Error('Existing start receipt: resume only');
    const profileURL='https://example.invalid/diagnostic';
    '@ | Write-Output

    Actual result from exec_command: rejected before process creation with CreateProcess ... rejected: blocked by policy.

    Controls submitted independently:

    1. The identical here-string containing only throw new Error('Existing start receipt: resume only'); passed with exit 0 and printed that line.
    2. The identical here-string containing only const profileURL='https://example.invalid/diagnostic'; passed with exit 0 and printed that line.

    The JavaScript is literal PowerShell string data; it is never evaluated. The reserved example.invalid URL is never accessed. The combined request never produces a process ID or an application result.

    The exact-release Windows classifier scans best-effort flattened shlex tokens for start together with a URL, rather than distinguishing PowerShell here-string data from a ShellExecute invocation. The execution policy converts dangerous matches to Forbidden under approval policy Never and supplies this generic message.

    Please distinguish literal here-string/source data from actual URL-launch commands and expose the specific classifier/rule in rejection diagnostics. Actual dangerous URL launches should retain their existing checks. No policy override or alternate execution route was used to perform the originally denied operation.

  19. justinthevoid commented on Oct 14, 2026

    @justinthevoid

    Additional reproduction on the Windows Desktop command runtime codex-cli 0.162.0-alpha.17.2 (Desktop 26.1007.71326, Windows 11 Pro build 26300, PowerShell 7.7.0-preview.5). The affected chat's retained effective settings were Full Access / approval_policy=never, rather than merely defaults in config.toml.

    One useful extension to this report: the launch cmdlet need not be invoked at all. Its name can be inert search data:

    $source = Invoke-WebRequest -Uri 'https://example.com/source.rs'
    $source.Content | Select-String -Pattern 'start-process'

    This is a read-only HTTP fetch and text search, with no process launch. This exact script shape was tested as command data against the unchanged Windows classifier from the official matching runtime tag: the new “should not be dangerous” assertion fails. A second assertion using a loopback health request followed by a separate local executable launch also fails; all 40 existing Windows-classifier tests pass.

    A corresponding public-source diagnostic invocation was rejected by Desktop before PowerShell started, with only:

    exec_command failed: CreateProcess … rejected: blocked by policy
    

    Root cause in the matching version:

    • windows_dangerous_commands.rs combines URL presence anywhere in the flattened words with a launch-name substring anywhere in those words, including literal search arguments.
    • exec_policy.rs converts that heuristic match to Forbidden when approval policy is Never.

    Please cover both inert launch-name arguments and unrelated commands in a regression fix, while retaining conservative handling of actual URL launches and dynamic execution. A more specific rejection reason would also help distinguish this pre-review checker from an Auto-review/Guardian denial.

    No private project paths, prompts, credentials or raw session logs are included. No policy-enforcement runtime was replaced.

  20. MorrisYUJQ commented on Oct 15, 2026

    @MorrisYUJQ

    Windows Desktop 补充报告:请确认 PR #54076 的桌面发布版本及不降低保护的恢复路径

    用户已明确授权提交以下脱敏诊断摘要,不共享完整会话或原始日志。

    环境

    • Windows / PowerShell
    • Desktop 26.1007.71326,build 20398,prod
    • Desktop 内置 codex-cli 0.162.0-alpha.17.2
    • 有效权限:approval_policy=never,sandbox_mode=danger-full-access
    • 2026-10-16 内置更新检查返回 up_to_date

    故障现象

    用户授权启动一个现有本地桌面工具,用于只读访问其指定的群聊记录。一次 PowerShell 请求组合了本地程序启动和独立的 loopback HTTP 健康检查,在 CreateProcess 前立即返回 blocked by policy,没有程序输出或退出码。

    历史上同一工具可以正常运行,当时启动和健康检查是不同调用。本次拒绝后没有通过拆分、改写或包装同一操作来重试,也没有更改权限、安全设置或允许规则。其他普通只读诊断可执行;没有证据表明已运行到本地工具的兼容性、登录或插件加载阶段。

    本机尚未取得具体命中规则 ID,因此这里报告的是与 #40060 高度吻合的症状和源码线索,不是已捕获内部执行追踪的结论。另见相同内置版本的相关报告 #53977。

    已核对的修复与发布状态

    官方 PR #54076 已在 2026-10-14T19:48:07Z 合并,commit 为 80b88a7。

    #54076

    实际读取公开发布列表与相关文件后:稳定 0.162.1 仍有旧判断;预发布 0.163.0-alpha.10.1 和 0.163.0-alpha.11 均未包含 powershell_commands_are_independent 改动,两者该文件 blob 均为 cc1ae671c831130dd33d11bac690d3052430b6dd。没有安装这些版本,也没有替换 Desktop 的内置执行器。

    原请求包含普通管道;#54076 对管道、脚本状态等仍保留保守回退。因此不能仅凭该 PR 已合并就保证原请求已经被修复。

    希望官方明确答复

    1. 哪个受支持的 Windows Desktop 版本已包含或计划包含 Avoid false URL-launch detections in literal PowerShell commands #54076?当前生产渠道没有可用更新时,有没有正式提供该修复的渠道或预计版本?请区分独立 CLI 与 Desktop 内置执行器。
    2. 在保持现有安全设置不变、不关闭检查、不增加宽泛允许规则的前提下,怎样恢复之前对用户指定群聊的本地只读访问?对于含普通健康检查管道的请求,有无受支持的误判纠正或复核流程?我们不请求绕过执行拒绝。
    3. 怎样取得本次拒绝的具体规则、分类器原因或最小相关诊断,以确认是不是同一缺陷?如果需要额外材料,请列出必要字段和安全提交入口,而不要要求上传完整私密聊天会话。

    本评论仅含脱敏环境信息、故障摘要和公开源码引用。未附群聊正文、群名/群号、个人路径、账号凭据、照片或完整会话。

  21. usofm commented on Oct 15, 2026

    @usofm

    Additional Windows desktop occurrence; possible relation to this issue, with the common root cause still unconfirmed.

    Observed incident

    On 2026-10-14 at 21:24:37 UTC, an explicitly authorized request to start two isolated local development services was rejected before PowerShell/process creation with:

    exec_command failed: CreateProcess ... Rejected(... rejected: blocked by policy)

    Both Start-Process calls targeted local executables and specified -WindowStyle Hidden. The same script contained loopback HTTP-origin configuration; the URLs were not passed as browser/URL-launch targets. The intended listeners were loopback-only. This is a historical observed workflow, not a newly executed minimal reproducer.

    The retained effective turn context recorded:

    • approval_policy=never
    • approvals_reviewer=user
    • sandbox_policy.type=danger-full-access
    • permission_profile.type=disabled

    This establishes a pre-execution policy refusal, not a verified Auto-review/Guardian decision.

    Bounded diagnostics

    • Current bundled CLI reports codex-cli 0.162.1; the exact embedded executor version at the original incident was not independently captured.
    • Official codex execpolicy check, supplied the original shell/command tokens as data and the existing user default.rules, returned exit 0 with {"matchedRules":[]}. This covers that file only, not every effective policy layer. The rejected command was not executed.
    • Retained structured logs no longer cover the original incident.
    • codex doctor --json timed out after 45 seconds without producing a report.
    • The owner cannot find the suggested Ask/on-request permission control.

    Clarification requested

    PR #54076 is merged. Which supported Windows desktop release includes it, and how can affected users obtain an exact-action review or supported recovery when the interactive permission control is unavailable? Please also expose the rejecting rule/classifier or a minimal safe diagnostic to distinguish this case from other policy refusals.

    No policy override, global security relaxation, alternate execution path, or startup retry was used after refusal. No private project source, directory paths, account/session identifiers, credentials, raw transcript, environment values, or application data are attached. Please consolidate this occurrence here rather than opening a duplicate issue.

  22. usofm commented on Oct 15, 2026

    @usofm

    Follow-up to #40060 (comment), explicitly requested by the affected owner.

    The desktop's built-in update check now confirms installed version 26.1007.71326, build 20398, distribution prod, status up_to_date. No eligible update is offered. We have not replaced the bundled executor, changed release channels or security settings, or retried the rejected startup.

    Could the team please clarify:

    1. Which supported Windows desktop version/build will include Avoid false URL-launch detections in literal PowerShell commands #54076 (or already includes it), and through which official update mechanism? If rollout timing is not known, please say so; a standalone CLI release does not establish desktop inclusion.
    2. Until that desktop release is available, is there an officially supported, policy-compliant way to resume the approved isolated loopback services for real-browser acceptance testing of Control and Amer Service? The interactive Ask/on-request control is not visible. Please identify the supported exact-action review or false-positive correction process and its prerequisites, or confirm that waiting is required. We are not requesting a bypass, broad allow rule, disabled checks, or an alternative executor.

    The original request contained script state; #54076 retains conservative handling of such cases. We therefore cannot assume the merged PR will resolve this particular incident. If confirmation requires diagnostics, please specify the minimal fields and an appropriate private submission route, without requiring a complete session transcript.

    Only sanitized version information and the workflow purpose are shared here; no credentials, raw logs, session identifiers or application data are attached.

  23. usofm commented on Oct 15, 2026

    @usofm

    Specific scope clarification requested by the affected owner, supplementing #40060 (comment):

    May the human owner independently start the approved isolated local test services manually, using normal application procedures, while the Codex desktop agent does not execute, rewrite or delegate the rejected startup at all, and then limit the agent to ordinary browser testing and capturing real screenshots for the English/Arabic/Persian Control and Amer Service training guides?

    Please confirm whether this separation is officially permitted for the reported pre-execution policy refusal, and identify any required supported review, conditions or approval. If it is not permitted or cannot be established from this public report, please say so and point to the appropriate official review channel. We are asking about the scope of the restriction, not treating manual execution as an assumed workaround.

    The owner consents to this proposed separation and has requested official confirmation of its policy status. Owner consent is not being treated as an official answer or a policy override; we have not initiated the manual-start handoff or the subsequent browser/testing/capture workflow. Existing security settings and normal application authentication/authorization remain in place; no injected credentials, sessions, roles or licenses are proposed. No raw logs, private identifiers or application data are attached.

  24. vjhlv commented on Oct 16, 2026

    @vjhlv

    Additional Windows Desktop occurrence; requesting a supported fix or exact-action review path.

    The running bundled executor reports codex-cli 0.163.0-alpha.10.2. The desktop app's built-in updater reports installedVersion 26.1013.31256, installedBuildVersion 20586, installedReleaseChannel prod, status up_to_date.

    A user-authorized local Python launch was rejected before process creation with CreateProcess / Rejected / rejected: blocked by policy. The PowerShell request contains a local Start-Process invocation, variables, and an unrelated HTTP mailbox configuration value. The URL is not the executable launch target. The request was retried unchanged after an official app update and received the same rejection.

    Effective settings record full access, approval_policy=never, approvals_reviewer=user. The inspected local rules contain allow entries only. An offline check of that rule file reported no matches. These observations do not exclude built-in or managed policy. No exact internal classifier ID was exposed, so this occurrence is consistent with #40060 rather than a proven internal trace.

    PR #54076 is merged, but its description retains conservative handling for script state and pipelines. Please confirm:

    1. Which supported signed Windows Desktop build includes this fix, and how users on the production channel can obtain it.
    2. Whether requests containing variables and unrelated URL configuration are within the supported fix scope.
    3. If not, what supported false-positive review or recovery process applies, and which minimal private diagnostic fields are needed.

    No installed executable, security configuration, or rule file has been modified. No alternate execution route was used to carry out the rejected operation. This report contains no account identifiers, credentials, local paths, task/session IDs, raw logs, or conversation transcripts.

  25. eimhenry-dt commented on Oct 16, 2026

    @eimhenry-dt

    Could the team clarify the supported Windows Desktop distribution and scope of merged PR #54076?

    The PR description says that independently parsed literal PowerShell commands are classified separately, while pipelines and script state retain conservative checks.

    1. Which supported Windows Desktop version/build includes this change, and through which official release channel? Please distinguish Desktop's bundled executor from standalone CLI releases.
    2. For requests outside the independently parsed literal-command case, what documented diagnostic or exact-action review route can identify the rejecting classifier and supported recovery conditions?
    3. If no such route is currently available, could that limitation and the planned resolution be documented here?

    This asks for an official fix/review path, not a policy bypass, blanket allow rule, or replacement executor.

    Public reference: #54076

  26. usofm commented on Oct 16, 2026

    @usofm

    Owner-requested update to our occurrence and pending scope question: #40060 (comment)

    After the normal app restart, the running desktop's built-in updater confirms:

    • Desktop 26.1013.31256, build 20586, distribution prod, status up_to_date (verified 2026-10-16 at 07:45 UTC).
    • The executable bundled in the running app's resources directory independently reports codex-cli 0.163.0-alpha.10.2 via --version.

    The official source for that exact runtime tag still passes flattened PowerShell tokens to the URL/launch-name matcher. This source observation is not a full binary attestation, an internal decision trace, or a claim that the original incident has been resolved. We have not retried the rejected startup after updating.

    Could the team explicitly confirm whether the owner may independently start the isolated local test services manually through normal application procedures, while the agent performs no startup/rewrite/delegation and subsequently only drives the browser and captures real application screenshots for Control and Amer Service EN/AR/FA training? Please state any supported review prerequisites or conditions, or confirm that this route must remain on hold and identify the appropriate official review channel.

    The owner has expressly requested no action on this route before an applicable official answer. We have not initiated a manual-start handoff, supplied manual-start instructions or begun the dependent browser/testing/capture workflow. Security settings and normal application authentication/authorization remain unchanged. No credentials, private identifiers, raw logs or application data are attached.

  27. drwbkr1 commented on Oct 16, 2026

    @drwbkr1

    After an official update and restart, Windows Desktop reports 26.1007.71326, build 20398. Its signed bundled executor reports 0.162.0-alpha.17.2; the running and bundled copies match.

    Does this Desktop build include PR #54076, commit 80b88a7? Does that fix cover environment-variable assignments containing an unrelated URL alongside Node/Next’s start argument? If not, which supported Desktop build does, and what minimal diagnostic identifies the original rejecting policy?

    No security settings, executables, or rules were modified. The rejected startup has not been retried.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    CLIIssues related to the Codex CLIbugSomething isn't workingsandboxIssues related to permissions or sandboxingwindows-osIssues related to Codex on Windows systems

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions