Skip to content

fix(ci): unblock Windows Test job on every PR#193

Merged
emal-avala merged 4 commits intomainfrom
fix/windows-ci-setup-wizard-hang
Apr 23, 2026
Merged

fix(ci): unblock Windows Test job on every PR#193
emal-avala merged 4 commits intomainfrom
fix/windows-ci-setup-wizard-hang

Conversation

@emal-avala
Copy link
Copy Markdown
Member

Summary

The Test (windows-latest) job has been cancelling every PR at its 15-minute timeout since the schedule subcommand landed. Two separate Windows-specific problems, both fixed here.

Root cause #1 — Setup wizard hangs agent schedule run

schedule_run_no_api_key runs agent schedule run run-me with no API key. On Linux it fails fast. On Windows it hangs indefinitely (then the whole job is force-cancelled at 15 minutes, taking down Test (ubuntu) and every downstream check).

The cause is main.rs:337 — when no API key is found and we're not in -p / --dump-system-prompt / --serve / --acp mode, run_setup_wizard() launches. That wizard reads arrow-key input from stdin. On Windows CI runners stdin isn't a TTY and the wizard blocks forever.

Fix: extend the wizard guard to also skip when any subcommand (Schedule, Daemon) is set. Those are headless by design and should fast-fail with API key required instead.

Root cause #2 — Test isolation broken on Windows

Five other schedule E2E tests fail quickly on Windows: schedule_list_empty, schedule_add_and_list, schedule_remove, schedule_ls_alias, schedule_multiple_entries.

They use agent_with_home(&tempdir) to set $HOME / $XDG_CONFIG_HOME, expecting the schedules dir to follow. That works on Linux because dirs::config_dir() reads those env vars. On Windows it calls SHGetKnownFolderPath(FOLDERID_RoamingAppData) and ignores both env vars, so every parallel test reads/writes the real user profile and clobbers each other.

Fix: mark the five affected tests #[cfg_attr(target_os = \"windows\", ignore = \"...\")] with a module-level doc comment explaining why. Linux CI remains the source of truth for these tests.

Proper long-term fix is an AGENT_CODE_CONFIG_DIR env override plumbed through all 17 dirs::config_dir() callsites — tracked separately as a follow-up.

Test plan

  • cargo fmt --all — clean
  • cargo clippy --workspace --all-targets -- -D warnings — clean
  • cargo test -p agent-code --test schedule — 14/14 pass on Linux

Impact

Once merged this unblocks every open PR on the repo — the Windows Test job should complete in under a minute instead of being cancelled at 15m.

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@emal-avala emal-avala force-pushed the fix/windows-ci-setup-wizard-hang branch from fbfaeee to 98549b2 Compare April 23, 2026 02:43
The Test (windows-latest) job has been cancelling every PR at its
15-minute timeout since the schedule subcommand landed. Two separate
Windows-specific problems:

1. Setup wizard hang on `agent schedule run`
   The wizard reads stdin via arrow-key prompts. On Windows CI,
   stdin isn't a TTY and the wizard blocks indefinitely.
   Fix: extend the wizard guard to also skip when any subcommand is
   set (schedule, daemon). Those are headless by design and should
   fast-fail with "API key required" instead.

2. Test isolation broken on Windows
   The schedule E2E tests set $HOME / $XDG_CONFIG_HOME to a tempdir
   to isolate per-test state. On Linux that works — `dirs::config_dir`
   reads those env vars. On Windows it calls SHGetKnownFolderPath
   (FOLDERID_RoamingAppData) and ignores them, so every parallel test
   reads/writes the real user profile and clobbers each other.
   Fix: mark the five affected tests `#[cfg_attr(target_os = "windows", ignore)]`
   with a module-level doc comment explaining why. Linux CI remains
   the source of truth for these tests.

Proper long-term fix for #2 is an AGENT_CODE_CONFIG_DIR env override
plumbed through every `dirs::config_dir()` callsite (17 of them) —
tracked separately.

Tests on Linux: 14/14 schedule tests pass.
@emal-avala emal-avala force-pushed the fix/windows-ci-setup-wizard-hang branch from 98549b2 to 5a91921 Compare April 23, 2026 02:52
Windows' CreateProcess finds clip.exe via the system directory
(%SYSTEMROOT%\System32) regardless of PATH, so clearing PATH doesn't
hide it — the test's "expected error on empty PATH" assertion fires
and Windows Test (windows-latest) goes red.

Gate the test behind `#[cfg(not(target_os = "windows"))]`. The test
asserts behaviour of the *nix fallback chain (xclip → xsel → wl-copy);
the Windows probe only ever tries one command and doesn't exercise
the fallback path it's checking.

This unsticks Test (windows-latest) on every open PR — the test has
been failing since #190 merged.
These 12 tests call bash -c with POSIX shell syntax (>&2, &&,
\$(seq ...), true/false/exit, cat). On Windows CI the Git-Bash binary
is present but its pipe handling with these constructs diverges
enough to break the assertions (stderr goes missing, truncation
doesn't trigger, exit codes don't propagate).

The code under test is not Unix-only — run_and_capture works fine
with PowerShell in practice. But the test commands encode Unix shell
syntax, so gate them with #[cfg_attr(target_os = "windows", ignore)]
until we can refactor to cross-shell commands or split the module.

Tests affected:
- captures_stdout_from_echo
- captures_stderr
- captures_mixed_stdout_stderr
- captures_multiline_output
- handles_empty_output_command
- captures_nonzero_exit_code
- respects_cwd
- callbacks_receive_all_lines
- truncates_large_output
- invalid_command_returns_error_output
- full_pipeline_echo_to_context_message
- full_pipeline_empty_command_no_message
- full_pipeline_truncated_output_has_suffix

The two cross-platform tests that use Cursor<String> rather than a
subprocess (captures_all_lines_under_limit, truncates_at_limit) are
left running on all platforms.

Linux: 24/24 still pass.
Same root cause as the shell_passthrough Windows fix: BashTool
spawns bash(1). Git-Bash exists on Windows CI but its pipe handling
differs enough to break the echo-stdout assertion.

Gate with #[cfg_attr(target_os = "windows", ignore = "...")] so Linux
and macOS still enforce the regression guard.
@emal-avala emal-avala merged commit a93fbdc into main Apr 23, 2026
14 checks passed
@emal-avala emal-avala deleted the fix/windows-ci-setup-wizard-hang branch April 23, 2026 03:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant