name: CI
on:
push:
branches:
- main
pull_request:
concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Check out repository
uses: actions/checkout@v6
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Check formatting
run: cargo fmt --check
- name: Run auto-rotate integration tests
run: cargo test -q --test auto_rotate
- name: Run main integration tests
run: |
set -euo pipefail
cargo test -q --test main_internal -- --test-threads=1
runtime-stress:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Check out repository
uses: actions/checkout@v6
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Run parallel-safe runtime proxy stress tests
run: |
set -euo pipefail
# The main test job already covers runtime_proxy_ once. Keep one extra focused
# stress pass here, but leave the slow continuation-heavy cases to the dedicated
# rerun step below so they are not paid twice in this loop as well. Keep the
# process-global and race-prone cases out of the shared process so the rest of
# runtime_proxy_ can use libtest's default parallelism.
for iteration in 1; do
echo "runtime_proxy_ stress iteration ${iteration}"
cargo test --test main_internal runtime_proxy_ -- \
--skip runtime_proxy_persists_previous_response_affinity_across_restart \
--skip runtime_proxy_persists_session_affinity_across_restart_for_compact \
--skip runtime_proxy_claude_launch_env_uses_foundry_compat_with_profile_config_dir \
--skip runtime_proxy_claude_launch_env_honors_model_override \
--skip runtime_proxy_claude_launch_env_keeps_custom_picker_entry_for_unknown_override \
--skip runtime_proxy_claude_launch_env_uses_codex_config_model_by_default \
--skip runtime_proxy_claude_launch_env_maps_alias_backed_override_to_builtin_picker_value \
--skip runtime_proxy_claude_target_model_maps_builtin_aliases_to_pinned_gpt_models \
--skip runtime_proxy_claude_reasoning_effort_override_normalizes_env \
--skip runtime_proxy_claude_reasoning_effort_override_ignores_invalid_env \
--skip runtime_proxy_retries_after_websocket_reuse_silent_hang \
--skip runtime_proxy_does_not_rotate_after_multi_chunk_sse_stall \
--skip runtime_proxy_sheds_long_lived_queue_overload_fast \
--skip runtime_proxy_absorbs_brief_long_lived_queue_burst \
--skip runtime_proxy_does_not_rotate_after_first_sse_chunk_reset \
--skip runtime_proxy_retries_same_compact_owner_after_websocket_reuse_watchdog \
--skip runtime_proxy_bound_previous_response_without_turn_state_fails_as_transport_after_websocket_reuse_watchdog \
--skip runtime_proxy_stale_websocket_previous_response_reuse_fails_as_transport \
--skip runtime_proxy_logs_local_writer_disconnect_after_first_chunk \
--skip runtime_proxy_websocket_surfaces_mid_turn_close_without_post_commit_rotate \
--skip runtime_proxy_passes_through_unauthorized_response_and_quarantines_profile_for_next_fresh_request \
--skip runtime_proxy_broker_health_endpoint_reports_registered_metadata \
--skip runtime_proxy_uses_current_profile_without_extra_runtime_quota_probe \
--skip runtime_proxy_reuses_rotated_profile_without_reprobing_quota \
--skip runtime_proxy_keeps_previous_response_affinity_for_http_requests \
--skip runtime_proxy_keeps_previous_response_affinity_for_websocket_requests
done
- name: Run serialized runtime-sensitive stress tests
run: |
set -euo pipefail
for test_name in \
runtime_proxy_claude_launch_env_uses_foundry_compat_with_profile_config_dir \
runtime_proxy_claude_launch_env_honors_model_override \
runtime_proxy_claude_launch_env_keeps_custom_picker_entry_for_unknown_override \
runtime_proxy_claude_launch_env_uses_codex_config_model_by_default \
runtime_proxy_claude_launch_env_maps_alias_backed_override_to_builtin_picker_value \
runtime_proxy_claude_target_model_maps_builtin_aliases_to_pinned_gpt_models \
runtime_proxy_claude_reasoning_effort_override_normalizes_env \
runtime_proxy_claude_reasoning_effort_override_ignores_invalid_env \
runtime_proxy_sheds_long_lived_queue_overload_fast \
runtime_proxy_absorbs_brief_long_lived_queue_burst \
runtime_proxy_does_not_rotate_after_first_sse_chunk_reset \
runtime_proxy_retries_same_compact_owner_after_websocket_reuse_watchdog \
runtime_proxy_bound_previous_response_without_turn_state_fails_as_transport_after_websocket_reuse_watchdog \
runtime_proxy_stale_websocket_previous_response_reuse_fails_as_transport \
runtime_proxy_logs_local_writer_disconnect_after_first_chunk \
runtime_proxy_websocket_surfaces_mid_turn_close_without_post_commit_rotate \
runtime_proxy_passes_through_unauthorized_response_and_quarantines_profile_for_next_fresh_request \
runtime_proxy_broker_health_endpoint_reports_registered_metadata \
runtime_proxy_uses_current_profile_without_extra_runtime_quota_probe \
runtime_proxy_reuses_rotated_profile_without_reprobing_quota \
runtime_proxy_keeps_previous_response_affinity_for_http_requests \
runtime_proxy_keeps_previous_response_affinity_for_websocket_requests
do
cargo test -q --test main_internal "${test_name}" -- --test-threads=1
done
- name: Rerun continuation-heavy tests
run: |
set -euo pipefail
for iteration in 1 2; do
echo "continuation-heavy iteration ${iteration}"
cargo test --test main_internal runtime_proxy_persists_previous_response_affinity_across_restart -- --test-threads=1
cargo test --test main_internal runtime_proxy_persists_session_affinity_across_restart_for_compact -- --test-threads=1
cargo test --test main_internal runtime_proxy_retries_after_websocket_reuse_silent_hang -- --test-threads=1
cargo test --test main_internal runtime_proxy_does_not_rotate_after_multi_chunk_sse_stall -- --test-threads=1
done