headroom/tests
gglucass 8c00f7103c
fix(codex): poll /wham/usage for subscription limits (handshake no longer sends x-codex-* headers) (#924)
## Description

Codex's subscription usage window (primary/secondary rate-limit gauges)
stopped populating for ChatGPT-OAuth sessions. This PR restores it by
polling Codex's dedicated usage endpoint instead of relying on response
headers that are no longer sent.

### Why the previous approach no longer works

The existing code populates `CodexRateLimitState` from `x-codex-*`
rate-limit headers captured on the `/v1/responses` WebSocket handshake
(`update_from_headers` at WS accept). That worked when OpenAI returned
`x-codex-primary-used-percent`, `x-codex-primary-window-minutes`, etc.
on the handshake response.

OpenAI has since stopped sending those headers on the ChatGPT WebSocket
handshake. I confirmed this by faithfully replaying a real Plus-account
handshake (both `prewarm` and regular `request_kind`): no `x-codex-*`
headers come back on either. This matches OpenAI's own move to a
dedicated usage endpoint (`GET /backend-api/codex/usage` in CodexApi
mode) and reports such as openai/codex#14728. So `update_from_headers`
now runs on every accept but finds nothing to parse, and the window
silently stays empty.

The headers aren't coming back, so there is nothing to fix in the
parsing path. The data now lives behind a request we have to make
ourselves.

## Type of Change

- [x] Bug fix (non-breaking change that fixes an issue)

## Changes Made

- `subscription/codex_rate_limits.py`:
- `parse_codex_usage_payload()` / `update_from_usage_payload()` — map
the `GET /backend-api/wham/usage` JSON (`rate_limit.primary_window` /
`secondary_window` with `used_percent`, `limit_window_seconds`,
`reset_at`; `credits`; `rate_limit_reached_type`) into the existing
`CodexRateLimitState`. `limit_window_seconds` is converted to
window-minutes with the same round-up codex-rs uses (`(secs + 59) //
60`).
- `maybe_schedule_usage_poll()` — fire-and-forget, throttled to one
request per 60s, scoped to ChatGPT sessions (requires both a Bearer
token and `ChatGPT-Account-Id`; API-key traffic is skipped). Uses an
in-flight guard so concurrent accepts don't stack polls. Endpoint is
overridable via `HEADROOM_CODEX_USAGE_URL`.
- `proxy/handlers/openai.py`:
- At the Codex WS accept site, after the now-usually-empty
`update_from_headers` block, schedule the usage poll. Wrapped in
`contextlib.suppress` and fully non-blocking so it can never delay or
fail the WebSocket accept.

The old header-capture path is intentionally left in place as a no-cost
fallback in case OpenAI restores the headers.

## Testing

- [x] Unit tests pass (`pytest`)
- [x] Linting passes (`ruff check .`)
- [x] Type checking passes (`mypy headroom`)
- [x] New tests added for new functionality
- [x] Manual testing performed (live `/wham/usage` replay against a Plus
account returned HTTP 200 with the expected schema; payload fixture in
tests mirrors that real shape)

## Test Output

```
$ uv run pytest tests/test_codex_rate_limits.py -q
........................................                                 [100%]
41 passed in 0.16s

$ uv run ruff check headroom/subscription/codex_rate_limits.py headroom/proxy/handlers/openai.py tests/test_codex_rate_limits.py
All checks passed!

$ uv run mypy headroom/subscription/codex_rate_limits.py
Success: no issues found in 1 source file
```

## Additional Notes

- New tests cover: full-payload mapping, window-minutes round-up,
credits balance kept only when `has_credits`, promo object vs string,
empty payload returns `None`, missing `used_percent` skipped,
header-gating (requires Bearer + account-id), poll throttling, and
no-event-loop safety.
- Scoping to `ChatGPT-Account-Id` keeps the poll off API-key traffic,
and the 60s throttle plus in-flight guard bound it to at most one
lightweight GET per minute per running proxy.

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 17:03:14 -05:00
..
cli Add Click-based CLI with memory management commands 2026-01-29 21:30:21 -08:00
fixtures/memory_tool_definitions fix(memory): expose memory IDs in auto-tail + memory_list tool + ID-usage guidance 2026-05-19 22:10:42 -05:00
integrations/test_strands feat: Add AWS Strands Agents SDK integration 2026-01-31 00:31:37 -08:00
parity fix(proxy): restore Codex usage headers on WS and streaming SSE transports (#577) (#794) 2026-06-09 15:55:53 -05:00
test_backends fix(proxy): Strands MCP bundle + backend path fixes + Codex fail-closed protection 2026-05-21 11:00:14 -07:00
test_cache fix: eliminate prefix cache busts from frozen count underestimation 2026-04-07 17:10:20 -07:00
test_cli fix(codex): poll /wham/usage for subscription limits (handshake no longer sends x-codex-* headers) (#924) 2026-06-12 17:03:14 -05:00
test_compression Remove LLMLingua: Kompress is the sole text compressor 2026-03-26 11:11:00 -07:00
test_dashboard test(dashboard): fix playwright importorskip placement 2026-04-21 00:10:05 -05:00
test_evals Remove LLMLingua: Kompress is the sole text compressor 2026-03-26 11:11:00 -07:00
test_install fix(codex): poll /wham/usage for subscription limits (handshake no longer sends x-codex-* headers) (#924) 2026-06-12 17:03:14 -05:00
test_integrations fix: B1 — retire ICM, RollingWindow, scoring, relevance + dependents 2026-05-02 12:23:17 -07:00
test_learn fix(learn): claude-cli streams output with idle timeout (#373) 2026-06-11 11:55:19 -05:00
test_mcp_registry fix(codex): respect CODEX_HOME for wrap config (#731) 2026-06-10 18:21:29 -05:00
test_memory feat(memory): add opt-in Apple-GPU (MPS) embedding runtime (#766) 2026-06-11 12:59:20 -05:00
test_providers style: match CI ruff formatting 2026-04-22 22:21:00 -05:00
test_proxy feat(proxy): log compressed messages alongside original request (#261) 2026-06-11 19:02:54 -05:00
test_scripts fix(ci): restore repro harness test in dev installs 2026-04-20 22:12:01 +07:00
test_storage fix: B1 — retire ICM, RollingWindow, scoring, relevance + dependents 2026-05-02 12:23:17 -07:00
test_transforms feat(proxy): add agent-90 savings profile (#830) 2026-06-11 18:58:06 -05:00
__init__.py Initial commit: Headroom SDK - LLM context optimization toolkit 2026-01-06 23:16:58 -08:00
_dotenv.py fix(tests): stop module-level dotenv loaders from polluting os.environ during pytest collection 2026-04-26 09:15:37 -07:00
conftest.py fix: B1 — retire ICM, RollingWindow, scoring, relevance + dependents 2026-05-02 12:23:17 -07:00
e2e_real_compression.py fix: complete /v1/responses compression telemetry, multi-frame WS, frozen-count cap 2026-05-07 14:50:03 -07:00
e2e_ws_codex_usage_headers.py fix(proxy): restore Codex usage headers on WS and streaming SSE transports (#577) (#794) 2026-06-09 15:55:53 -05:00
e2e_ws_responses_compression.py fix: complete /v1/responses compression telemetry, multi-frame WS, frozen-count cap 2026-05-07 14:50:03 -07:00
repro_unsendable_panic.py fix(ci): restore green lint gate on main 2026-06-04 14:15:49 -07:00
test_acceptance.py fix: B1 — retire ICM, RollingWindow, scoring, relevance + dependents 2026-05-02 12:23:17 -07:00
test_adapter_hooks.py fix: B5 — TOIN observation-only refactor + per-tenant aggregation key 2026-05-02 16:24:03 -07:00
test_adaptive_sizer.py Diversity-aware SmartCrusher: keep unique items, compress text within 2026-03-25 23:57:24 -07:00
test_agent_savings.py feat: add dashboard agent usage stats (#814) 2026-06-12 14:12:22 -05:00
test_anthropic_beta_session_sticky.py fix: A6 — anthropic-beta and openai-beta deterministic merge + session-sticky 2026-05-02 09:53:37 -07:00
test_anthropic_pre_upstream_backpressure.py refactor(proxy): migrate Gemini + Anthropic non-streaming onto outcome funnel 2026-05-14 19:38:54 -07:00
test_anthropic_stage_timings.py fix: B1 — retire ICM, RollingWindow, scoring, relevance + dependents 2026-05-02 12:23:17 -07:00
test_auth_mode.py feat: add dashboard agent usage stats (#814) 2026-06-12 14:12:22 -05:00
test_backend_anyllm.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_backend_bugs.py fix(tests): stop module-level dotenv loaders from polluting os.environ during pytest collection 2026-04-26 09:15:37 -07:00
test_backend_streaming_cache_metrics.py fix(proxy): record cache reads/writes on backend-routed streaming (#327) 2026-05-14 11:01:57 -07:00
test_banner_upstream_targets.py feat: add Vertex AI proxy routing (#793) 2026-06-09 23:05:30 -07:00
test_bedrock_region.py fix(tests): stop module-level dotenv loaders from polluting os.environ during pytest collection 2026-04-26 09:15:37 -07:00
test_binaries.py fix: docker install fails with PermissionError in readonly cache dir 2026-04-20 17:36:44 -07:00
test_bundled_tools_savings.py fix(tests): stop module-level dotenv loaders from polluting os.environ during pytest collection 2026-04-26 09:15:37 -07:00
test_cache_aligner_detector_only.py fix(tests): update CacheAligner detector-only tests for F2.2 5-field CompressionPolicy 2026-05-06 14:39:39 -07:00
test_canonical_pipeline.py fix: align docs and prune dead compatibility surfaces 2026-05-09 14:07:59 -07:00
test_ccr.py feat(rust): retire python smart_crusher, ship rust-only via pyo3 2026-04-27 00:52:21 -07:00
test_ccr_batch_processor.py Harden Anthropic prefix cache stability across proxy and batch paths 2026-04-04 13:45:37 -05:00
test_ccr_batch_store.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_ccr_context_tracker.py fix(ccr): scope proactive expansion by workspace (cross-project leak) 2026-05-26 13:23:51 -07:00
test_ccr_feedback.py Fix all ruff lint and format errors for CI 2026-01-10 15:33:44 -08:00
test_ccr_mcp_server.py fix(ccr): use shared compression store (#875) 2026-06-11 18:41:39 -05:00
test_ccr_response_handler.py fix(ccr): skip CCR when model calls headroom_retrieve alongside user tools (#839) 2026-06-10 21:12:26 -05:00
test_ccr_response_handler_extra.py fix: B1 — retire ICM, RollingWindow, scoring, relevance + dependents 2026-05-02 12:23:17 -07:00
test_ccr_row_drop_store_bridge.py fix(crusher): bridge SmartCrusher row-drop hash to Python compression_store (#389) 2026-05-05 11:41:48 -07:00
test_ccr_rust_marker_hash_bridge.py fix(ccr): key Rust search/diff/log markers with explicit_hash (#852) 2026-06-11 13:08:05 -05:00
test_ccr_tool_always_on.py fix: B7 — CCR hardening: persistent backends + always-on tool 2026-05-02 16:52:33 -07:00
test_ccr_tool_injection.py Remove LLMLingua: Kompress is the sole text compressor 2026-03-26 11:11:00 -07:00
test_claude_session_branch_compare.py Harden anthropic cache-mode replay stability 2026-04-05 16:11:39 -05:00
test_claude_session_mode_benchmark.py Harden cache validation reporting and TTL analysis 2026-04-06 20:11:21 -05:00
test_cli_learn.py Fix learn CLI worker expectation in CI 2026-05-09 22:11:42 -07:00
test_cli_perf_format.py feat: add dashboard agent usage stats (#814) 2026-06-12 14:12:22 -05:00
test_cli_proxy_env.py feat: add dashboard agent usage stats (#814) 2026-06-12 14:12:22 -05:00
test_cli_proxy_improvements.py feat(cli): comprehensive help text, validation, and exception handling improvements (#640) 2026-06-10 20:53:18 -05:00
test_cli_tools.py test: apply linux ruff formatting 2026-04-23 08:49:50 -05:00
test_code_compressor_thread_safety.py test(code_compressor): add unsendable-panic repro and thread-local parser tests 2026-06-03 17:02:07 -05:00
test_codex_openai_contract_parity.py fix(proxy): restore Codex usage headers on WS and streaming SSE transports (#577) (#794) 2026-06-09 15:55:53 -05:00
test_codex_rate_limits.py fix(codex): poll /wham/usage for subscription limits (handshake no longer sends x-codex-* headers) (#924) 2026-06-12 17:03:14 -05:00
test_codex_ws_compression_scheduler.py test(codex): de-flake semaphore-tail ratio check on fast runners 2026-06-03 23:57:31 -07:00
test_compaction_markdown_kv.py feat: gated Markdown-KV compaction formatter (serialization-aware output) (#859) 2026-06-11 13:03:50 -05:00
test_compress_api.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_compress_failure.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_compression_cache.py fix: complete /v1/responses compression telemetry, multi-frame WS, frozen-count cap 2026-05-07 14:50:03 -07:00
test_compression_decision.py fix(proxy): surface CompressionDecision.passthrough_reason in tags 2026-05-15 14:40:00 -07:00
test_compression_determinism.py Compress Codex Responses payloads 2026-05-10 17:27:47 -07:00
test_compression_observability.py fix: expose compression latency bottlenecks 2026-05-12 13:34:08 -07:00
test_compression_policy.py feat: net-cost cache mutation formula on CompressionPolicy (#856 P1) (#857) 2026-06-11 13:06:09 -05:00
test_compression_policy_toin_gate.py fix(transforms): F2.2 c2/3 — wire toin_read_only gate + extend policy_selected log 2026-05-06 14:37:33 -07:00
test_compression_safety_rails.py feat: compression safety rails — error-output protection, pipeline circuit breaker, library inflation guard (#851) 2026-06-11 12:55:13 -05:00
test_compression_store.py fix(ccr): make retrieval TTL configurable (#715) 2026-06-10 23:20:46 -05:00
test_compression_summary.py Add compression summaries, multi-provider headers, Dockerfile fix 2026-02-18 16:54:20 -08:00
test_compression_summary_eval.py Add compression summaries, multi-provider headers, Dockerfile fix 2026-02-18 16:54:20 -08:00
test_compression_summary_hard_eval.py fix(tests): stop module-level dotenv loaders from polluting os.environ during pytest collection 2026-04-26 09:15:37 -07:00
test_compression_summary_integration.py fix(tests): stop module-level dotenv loaders from polluting os.environ during pytest collection 2026-04-26 09:15:37 -07:00
test_compression_summary_tool_eval.py fix(tests): stop module-level dotenv loaders from polluting os.environ during pytest collection 2026-04-26 09:15:37 -07:00
test_compression_units.py Compress Codex Responses payloads 2026-05-10 17:27:47 -07:00
test_config.py feat: detect re-served tool results as over-compression waste signal (#854) 2026-06-11 13:07:04 -05:00
test_copilot_auth.py fix: harden Copilot API auth token handling (#557) 2026-06-11 12:57:48 -05:00
test_copilot_linux_secret.py fix(copilot): support subscription auth through Headroom 2026-06-02 21:24:47 -07:00
test_copilot_macos_keychain.py fix(copilot): support subscription auth through Headroom 2026-06-02 21:24:47 -07:00
test_copilot_quota.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_copilot_subscription_smoke.py fix(copilot): restore generic endpoint for non-subscription OAuth (#610) (#612) 2026-06-04 16:27:54 -07:00
test_corrupt_golden_bytes_recovery.py fix(proxy): fail-open on corrupt golden bytes instead of RuntimeError (#603) 2026-06-04 18:19:06 -07:00
test_cost_tracker_counterfactual.py style: fix linting and formatting issues 2026-06-03 20:08:26 +05:30
test_critical_fixes.py fix: B5 — TOIN observation-only refactor + per-tenant aggregation key 2026-05-02 16:24:03 -07:00
test_critical_gaps.py fix: B5 — TOIN observation-only refactor + per-tenant aggregation key 2026-05-02 16:24:03 -07:00
test_dashboard_agent_usage.py feat: add dashboard agent usage stats (#814) 2026-06-12 14:12:22 -05:00
test_dashboard_cache_ttl_playwright.py ci: run dashboard playwright tests in a dedicated job (#921) 2026-06-12 10:20:37 -05:00
test_evals_datasets.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_evals_metrics.py feat(evals): add zero-cost tool schema compaction integrity eval (#817) 2026-06-10 16:03:42 -05:00
test_exceptions.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_forwarded_headers.py fix(proxy): F4 — trust X-Forwarded-* only behind allow-listed gateway 2026-05-06 14:37:09 -07:00
test_google_multimodal.py fix: correct preserved-entry index mapping in Gemini content round-trip (#836) 2026-06-10 21:10:56 -05:00
test_google_multimodal_e2e.py Add E2E tests for Google multimodal content preservation 2026-01-24 21:01:25 -08:00
test_graph.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_handler_outcome_tag_invariant.py refactor(proxy): MemoryRanker + ImageCompressionDecision + branch-aware version-sync 2026-05-19 12:13:09 -05:00
test_header_isolation.py fix: A5 — strip x-headroom-* from upstream-bound headers (P5-49) 2026-05-02 09:35:27 -07:00
test_hnsw_only.py Add bounded memory support to HNSWVectorIndex with LRU eviction 2026-02-01 21:12:06 -08:00
test_hooks.py Add Compression Hooks — extension points for SaaS and advanced customization 2026-02-19 08:17:30 -08:00
test_image_compression.py Skip image tests when Pillow not installed (CI fix) 2026-04-09 16:24:15 -07:00
test_image_compression_decision.py refactor(proxy): MemoryRanker + ImageCompressionDecision + branch-aware version-sync 2026-05-19 12:13:09 -05:00
test_image_compressor.py fix: release image router models after compression 2026-04-29 01:45:27 -04:00
test_image_log_redaction.py fix(observability): G3 remediation — bound cardinality + wire dead metrics 2026-05-24 10:41:56 -07:00
test_image_ocr_api_compat.py fix: PR #372 — restore [image] extra on Python 3.13 via rapidocr 3.x adapter 2026-05-04 08:20:01 -07:00
test_issue_728_empty_tools_injection.py fix: don't inject empty tools:[] when client omitted the tools field (#772) 2026-06-08 21:55:59 -08:00
test_issue_746_tool_search.py fix: preserve Claude Code tool-search deferral through the proxy (#746) (#753) 2026-06-08 11:20:48 -07:00
test_kompress_preload_deferral.py fix(proxy): make Kompress eager preload cache-only so a cold cache can't block startup (#783) 2026-06-11 12:53:03 -05:00
test_lean_ctx_installer.py feat: add lean-ctx context tool support 2026-05-11 17:54:17 -04:00
test_log_compressor.py fix: improve error handling and add comprehensive test coverage 2026-01-27 16:08:36 -08:00
test_memory_auto_tail.py fix(memory): READ-ONLY framing + fail-closed unresolved-project fallback 2026-05-26 14:32:08 -07:00
test_memory_bridge.py Add Memory Bridge: bidirectional sync between markdown files and Headroom memory 2026-02-23 22:45:38 -08:00
test_memory_decision.py fix(proxy): MemoryDecision contract + 3 bypass bugs + drop 500-char query cap 2026-05-19 11:13:52 -05:00
test_memory_eval.py Add hierarchical memory system with graph + vector storage 2026-01-26 21:58:47 -08:00
test_memory_handler_concurrent_init.py fix: add anthropic pre-upstream timeouts 2026-04-21 09:48:32 +07:00
test_memory_handler_native_ops.py fix(memory): expose memory IDs in auto-tail + memory_list tool + ID-usage guidance 2026-05-19 22:10:42 -05:00
test_memory_handler_project_isolation.py fix(memory): READ-ONLY framing + fail-closed unresolved-project fallback 2026-05-26 14:32:08 -07:00
test_memory_injection_budget.py fix(proxy): MemoryDecision contract + 3 bypass bugs + drop 500-char query cap 2026-05-19 11:13:52 -05:00
test_memory_integration.py Add centralized ML model configuration 2026-02-01 23:47:42 -08:00
test_memory_invariants.py fix(proxy): MemoryDecision contract + 3 bypass bugs + drop 500-char query cap 2026-05-19 11:13:52 -05:00
test_memory_query.py fix(proxy): MemoryDecision contract + 3 bypass bugs + drop 500-char query cap 2026-05-19 11:13:52 -05:00
test_memory_ranker.py Merge remote-tracking branch 'origin/main' into refactor/memory-tool-handles 2026-05-19 22:17:20 -05:00
test_memory_storage_router.py fix(memory): READ-ONLY framing + fail-closed unresolved-project fallback 2026-05-26 14:32:08 -07:00
test_memory_sync.py fix: harden learn path handling across platforms 2026-05-09 15:45:26 -07:00
test_memory_system.py Fix CI: guard starlette imports, asyncio.run(), deprecate datetime.utcnow() 2026-02-19 11:03:24 -08:00
test_memory_tool_mode.py fix: integrate B6+B7 — fix cross-test contamination + injector mock parity 2026-05-02 17:05:58 -07:00
test_memory_tool_session_sticky.py fix: A7 — memory tool injection session-sticky for both Anthropic and OpenAI 2026-05-02 10:11:27 -07:00
test_memory_tracker.py Add memory observability system (Phase 1) 2026-02-01 19:49:53 -08:00
test_memory_tracker_integration.py Add wrap commands for Codex/Cursor/Aider with rtk instructions, fix savings metrics 2026-03-13 22:02:47 -07:00
test_memory_usage_integration.py fix(tests): stop module-level dotenv loaders from polluting os.environ during pytest collection 2026-04-26 09:15:37 -07:00
test_memory_wrapper.py test: apply linux ruff formatting 2026-04-23 08:49:50 -05:00
test_ml_model_registry_lifecycle.py fix: release image router models after compression 2026-04-29 01:45:27 -04:00
test_models.py Fix pricing lookup for retired Claude models 2026-03-12 21:11:18 -07:00
test_network_diff_capture.py feat: add differential network capture harness (#761) 2026-06-08 22:18:31 -07:00
test_oauth_bearer_routing.py style: fix ruff lint/format and mypy errors for CI 3.12 pass 2026-04-20 13:23:20 -05:00
test_observability_metrics.py feat: add OTEL observability core 2026-04-09 21:20:34 -05:00
test_observability_tracing.py feat: add OTEL observability core 2026-04-09 21:20:34 -05:00
test_onnx_runtime.py fix(onnx): reduce retained cpu memory 2026-04-20 22:31:48 +00:00
test_openai_beta_session_sticky.py fix: A6 — anthropic-beta and openai-beta deterministic merge + session-sticky 2026-05-02 09:53:37 -07:00
test_openai_codex_routing.py feat: add dashboard agent usage stats (#814) 2026-06-12 14:12:22 -05:00
test_openai_codex_ws_lifecycle.py fix(proxy): restore Codex usage headers on WS and streaming SSE transports (#577) (#794) 2026-06-09 15:55:53 -05:00
test_openai_codex_ws_timings.py fix(proxy): restore Codex usage headers on WS and streaming SSE transports (#577) (#794) 2026-06-09 15:55:53 -05:00
test_openai_responses_compression_units.py Rename tool output compression parallelism env 2026-06-04 14:54:21 +10:00
test_openai_responses_context_compaction.py fix: schema compaction must not drop property names that match DROP_KEYS (#785) 2026-06-09 16:29:18 -05:00
test_openai_responses_t3_replay_regression.py Rename tool output compression parallelism env 2026-06-04 14:54:21 +10:00
test_openai_streaming_backend.py Commit message: 2026-03-13 16:49:18 -07:00
test_owned_asset_encoding.py fix: decode/encode owned config, state and template assets as UTF-8 2026-06-03 03:25:42 +08:00
test_package_init_lazy.py fix(proxy): lazy-import server to avoid fastapi crash (#442) 2026-06-10 12:44:23 -05:00
test_parser.py feat: detect re-served tool results as over-compression waste signal (#854) 2026-06-11 13:07:04 -05:00
test_paths.py feat: add lean-ctx context tool support 2026-05-11 17:54:17 -04:00
test_paths_backward_compat.py fix(wrap): track shared proxy clients with markers (#877) 2026-06-11 19:42:43 -05:00
test_pipeline.py test: apply linux ruff formatting 2026-04-23 08:49:50 -05:00
test_plugin_manifests.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_plugins_hermes_retrieve.py feat(plugins): Hermes agent headroom_retrieve plugin (#824) 2026-06-11 18:43:10 -05:00
test_pr208_changes.py fix(proxy): defer file logging install to create_app() 2026-04-28 15:28:33 -07:00
test_pricing.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_pricing_litellm.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_probe_recorder.py feat: probe-based retention scoring of recorded compression events (#862) 2026-06-11 13:02:36 -05:00
test_prometheus_stage_timing_concurrency.py perf(proxy): reduce lock contention on stage-timing metrics 2026-04-20 22:08:09 +07:00
test_provider_aider.py feat(proxy): per-project savings breakdown on the dashboard (claude, codex, aider, copilot, cursor) (#803) 2026-06-10 21:04:45 -05:00
test_provider_claude.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_provider_codex_install.py fix(codex): poll /wham/usage for subscription limits (handshake no longer sends x-codex-* headers) (#924) 2026-06-12 17:03:14 -05:00
test_provider_codex_runtime.py fix(ci): update tests to assert absence of requires_openai_auth (bug 3, #406) 2026-05-06 12:18:47 -05:00
test_provider_copilot_wrap.py feat(proxy): per-project savings breakdown on the dashboard (claude, codex, aider, copilot, cursor) (#803) 2026-06-10 21:04:45 -05:00
test_provider_cursor.py feat(proxy): per-project savings breakdown on the dashboard (claude, codex, aider, copilot, cursor) (#803) 2026-06-10 21:04:45 -05:00
test_provider_model_fallback.py Fix CI regressions for cache benchmark work 2026-04-04 22:33:44 -05:00
test_provider_openclaw_wrap.py fix(cli): proxy/perf/wrap UX cleanup + perf --hours correctness 2026-05-07 16:43:35 -07:00
test_provider_package_init.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_provider_proxy_routes.py feat: add Vertex AI proxy routing (#793) 2026-06-09 23:05:30 -07:00
test_provider_registry.py feat: add Vertex AI proxy routing (#793) 2026-06-09 23:05:30 -07:00
test_provider_registry_extended.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_proxy_anthropic_cache_stability.py fix: integrate B6+B7 — fix cross-test contamination + injector mock parity 2026-05-02 17:05:58 -07:00
test_proxy_anthropic_compression_diagnostics.py fix: A3 — byte-faithful Python forwarders; serialize canonical only when mutated 2026-05-02 09:02:10 -07:00
test_proxy_batch_integration.py Add multi-provider batch API support with CCR post-processing 2026-01-24 11:41:18 -08:00
test_proxy_byte_faithful_forwarding.py fix: A3 — byte-faithful Python forwarders; serialize canonical only when mutated 2026-05-02 09:02:10 -07:00
test_proxy_cache_ttl_metrics.py feat: expose proxy OTEL metrics and Langfuse status 2026-04-09 21:20:46 -05:00
test_proxy_ccr.py fix(ccr): make retrieval TTL configurable (#715) 2026-06-10 23:20:46 -05:00
test_proxy_codex_route_aliases.py Minimize Codex model metadata changes 2026-06-01 17:27:31 -06:00
test_proxy_compress_endpoint.py Add TypeScript SDK (headroom-ai npm package) 2026-03-26 15:41:56 -07:00
test_proxy_compression_executor.py fix: expose compression latency bottlenecks 2026-05-12 13:34:08 -07:00
test_proxy_compression_headers.py fix: strip accept-encoding from forwarded proxy headers 2026-04-15 11:40:11 -07:00
test_proxy_copilot_auth_hooks.py fix(proxy): thread tags into 13 outcome sites + synth /v1/models + free-fn _extract_tags 2026-05-15 19:15:48 -07:00
test_proxy_count_tokens_integration.py Add multi-provider batch API support with CCR post-processing 2026-01-24 11:41:18 -08:00
test_proxy_dashboard_stats_cache.py fix: expose compression latency bottlenecks 2026-05-12 13:34:08 -07:00
test_proxy_debug_endpoints.py fix(security): block DNS-rebinding on /debug/* and /stats/reset via Host-header allowlist (#605) 2026-06-11 12:58:33 -05:00
test_proxy_disable_kompress.py Add option to disable Kompress fallback (#514) 2026-06-10 22:02:13 -05:00
test_proxy_gemini_integration.py Add multi-provider batch API support with CCR post-processing 2026-01-24 11:41:18 -08:00
test_proxy_gemini_native_integration.py Add multi-provider batch API support with CCR post-processing 2026-01-24 11:41:18 -08:00
test_proxy_google_cloudcode_route_aliases.py chore: format proxy route tests with ruff 2026-04-21 19:38:32 +00:00
test_proxy_handler_helpers.py fix(codex): poll /wham/usage for subscription limits (handshake no longer sends x-codex-* headers) (#924) 2026-06-12 17:03:14 -05:00
test_proxy_handlers_batch.py fix(proxy): thread tags into 13 outcome sites + synth /v1/models + free-fn _extract_tags 2026-05-15 19:15:48 -07:00
test_proxy_healthchecks.py feat(proxy): add agent-90 savings profile (#830) 2026-06-11 18:58:06 -05:00
test_proxy_hooks_regression.py test(proxy): align hooks regression test with Bug 3 recount semantics 2026-04-30 13:26:53 -07:00
test_proxy_memory_integration.py test(memory): live tests for delete-via-[id] + dedup-hint mechanism 2026-05-19 22:18:15 -05:00
test_proxy_mode_benchmark.py Rebrand proxy modes to token/cache and harden cache-mode stability 2026-04-04 14:32:07 -05:00
test_proxy_modes.py Harden cache-mode immutability for OpenAI and fix stats mode reporting 2026-04-04 14:36:29 -05:00
test_proxy_openai_cache_stability.py fix: A3 — byte-faithful Python forwarders; serialize canonical only when mutated 2026-05-02 09:02:10 -07:00
test_proxy_openai_responses_bypass.py fix: per-project memory storage so projects can no longer bleed memories (GH #462) 2026-05-13 15:27:41 -07:00
test_proxy_openai_responses_integration.py fix: stabilize codex compression, stats, and proxy lifecycle 2026-05-09 13:47:53 -07:00
test_proxy_package_init.py fix(proxy): lazy-import server to avoid fastapi crash (#442) 2026-06-10 12:44:23 -05:00
test_proxy_passthrough_integration.py fix: B1 — retire ICM, RollingWindow, scoring, relevance + dependents 2026-05-02 12:23:17 -07:00
test_proxy_pipeline_lifecycle.py feat: probe-based retention scoring of recorded compression events (#862) 2026-06-11 13:02:36 -05:00
test_proxy_project_savings.py feat(proxy): per-project savings breakdown on the dashboard (claude, codex, aider, copilot, cursor) (#803) 2026-06-10 21:04:45 -05:00
test_proxy_savings_history.py feat(dashboard): per-model savings breakdown and expected-vs-actual cost on historical charts (#807) 2026-06-10 23:53:57 -05:00
test_proxy_scalability.py fix(proxy): support multi-worker Docker env startup 2026-04-26 12:25:33 +00:00
test_proxy_stats_recent_requests.py feat: add dashboard agent usage stats (#814) 2026-06-12 14:12:22 -05:00
test_proxy_streaming_ratelimit_headers.py fix(proxy): restore Codex usage headers on WS and streaming SSE transports (#577) (#794) 2026-06-09 15:55:53 -05:00
test_proxy_streaming_request_logger.py feat(proxy): log compressed messages alongside original request (#261) 2026-06-11 19:02:54 -05:00
test_proxy_streaming_resilience.py style: fix linting and formatting issues 2026-06-03 20:08:26 +05:30
test_proxy_system_prompt_immutable.py fix: A3 — byte-faithful Python forwarders; serialize canonical only when mutated 2026-05-02 09:02:10 -07:00
test_proxy_telemetry_env.py feat: allow overriding proxy telemetry sdk via HEADROOM_SDK 2026-03-27 14:23:32 +01:00
test_proxy_warmup.py fix: align docs and prune dead compatibility surfaces 2026-05-09 14:07:59 -07:00
test_quality_retention.py feat(rust): SmartCrusher PR4 — lossless-first default + CCR-Dropped restoration 2026-04-27 16:30:22 -07:00
test_quota_registry.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_realignment_live_multi_turn.py fix(security): allowlist GitGuardian-flagged test fixtures 2026-05-02 18:33:22 -07:00
test_release_version.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_release_workflows.py feat: add dashboard agent usage stats (#814) 2026-06-12 14:12:22 -05:00
test_relevance.py feat(relevance): weight BM25 score_batch by corpus IDF (#646) 2026-06-05 14:15:44 -08:00
test_relevance_extra.py feat(rust): retire python smart_crusher, ship rust-only via pyo3 2026-04-27 00:52:21 -07:00
test_reporting.py feat: detect re-served tool results as over-compression waste signal (#854) 2026-06-11 13:07:04 -05:00
test_request_outcome.py feat: add Vertex AI proxy routing (#793) 2026-06-09 23:05:30 -07:00
test_responses_pyo3_compression.py fix: align docs and prune dead compatibility surfaces 2026-05-09 14:07:59 -07:00
test_responses_ws_pyo3_compression.py fix: align docs and prune dead compatibility surfaces 2026-05-09 14:07:59 -07:00
test_rtk_installer.py feat(cli): add Docker-native install flow and parity docs 2026-04-10 23:27:24 -05:00
test_rust_core_smoke.py fix: A0 — fail-loud rust core deployment smoke test 2026-05-02 17:52:37 -07:00
test_search_compressor.py fix: improve error handling and add comprehensive test coverage 2026-01-27 16:08:36 -08:00
test_security_validations.py Fix security vulnerabilities in memory and CCR systems 2026-02-04 12:05:50 -08:00
test_session_probes.py feat: probe-based retention scoring of recorded compression events (#862) 2026-06-11 13:02:36 -05:00
test_shared_context.py Add SharedContext for multi-agent, rewrite README, fix proxy cleanup 2026-03-17 16:31:04 -07:00
test_signals_keyword_parity.py chore(transforms): retire dead text_compressor module (Phase 3e.3) 2026-04-29 21:14:36 -07:00
test_smart_crusher_toin_attachment.py fix(smart_crusher): re-land orphaned audit close-out — CCR knob + scorer fail-loud 2026-04-28 18:37:52 -07:00
test_sqlite_graph_store.py Add SQLiteGraphStore for bounded, persistent graph storage 2026-02-01 20:48:57 -08:00
test_sqlite_vector_index.py fix(memory): batch onnx embeddings and sqlite-vec ops 2026-04-24 09:49:28 +00:00
test_sse_thinking_blocks.py fix: A8 — SSE delta arms, UTF-8 buffer, phase preservation, request-id, 413 2026-05-02 10:35:11 -07:00
test_sse_utf8_split.py [codex] fix(proxy): parse CRLF SSE event terminators (#649) 2026-06-10 21:16:00 -05:00
test_ssl_context.py fix(ssl): upstream httpx client inherits SSL_CERT_FILE, REQUESTS_CA_BUNDLE, NODE_EXTRA_CA_CERTS (#745) 2026-06-08 21:10:47 -08:00
test_stage_timer.py feat(proxy): add per-stage timings for Codex WS and Anthropic HTTP paths 2026-04-20 22:01:41 +07:00
test_startup_log_noise.py fix: suppress LiteLLM provider banner before import (#874) 2026-06-11 15:10:20 -05:00
test_storage_backends.py test: apply linux ruff formatting 2026-04-23 08:49:50 -05:00
test_strands_tokenizer.py Count Strands reasoningContent, image, document, video tokens (#111 follow-up) 2026-04-08 17:31:00 -07:00
test_strategy_stats_supabase.py feat(telemetry): surface per-strategy compression counters 2026-04-29 14:14:09 -07:00
test_streaming_usage_parser.py fix(content-router,proxy): cache-safe text-block compression and online streaming usage 2026-05-08 15:20:54 -07:00
test_subscription_base.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_subscription_client.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_subscription_tracker.py fix(subscription): wire tokens_saved_rtk from RTK stats endpoint 2026-05-22 13:48:42 -07:00
test_subscription_tracker_rtk_wired.py fix(tests): mock logger.warning directly instead of relying on caplog 2026-05-25 16:32:31 -07:00
test_subscription_window_render.py fix: PR #281 — synthesize 5h subscription window after Anthropic reset 2026-05-04 08:17:25 -07:00
test_tag_protection_integration.py Fix API integration test: use tool output not user message for tags 2026-03-26 11:46:55 -07:00
test_tag_protector_invariant.py fix: A9 — tag protector discards wrap on placeholder loss 2026-05-02 18:01:24 -07:00
test_telemetry.py fix(telemetry): honour HEADROOM_TELEMETRY=off in /v1/telemetry collector (#390) 2026-05-05 11:30:10 -07:00
test_telemetry_context.py refactor(telemetry): centralize stack slug validation + cardinality cap 2026-04-17 18:42:41 +02:00
test_telemetry_warning.py feat: add lean-ctx context tool support 2026-05-11 17:54:17 -04:00
test_text_compressors.py chore(transforms): retire dead text_compressor module (Phase 3e.3) 2026-04-29 21:14:36 -07:00
test_toin.py fix: align docs and prune dead compatibility surfaces 2026-05-09 14:07:59 -07:00
test_toin_feedback.py fix: log Codex ws cancellations safely 2026-05-10 09:06:07 -07:00
test_toin_fixes.py fix: B5 — TOIN observation-only refactor + per-tenant aggregation key 2026-05-02 16:24:03 -07:00
test_toin_full_integration.py fix: B5 — TOIN observation-only refactor + per-tenant aggregation key 2026-05-02 16:24:03 -07:00
test_toin_integration.py feat(rust): retire python smart_crusher, ship rust-only via pyo3 2026-04-27 00:52:21 -07:00
test_toin_observation_only.py fix: align docs and prune dead compatibility surfaces 2026-05-09 14:07:59 -07:00
test_toin_publish.py fix: B5 — TOIN observation-only refactor + per-tenant aggregation key 2026-05-02 16:24:03 -07:00
test_token_headroom_mode.py fix: complete /v1/responses compression telemetry, multi-frame WS, frozen-count cap 2026-05-07 14:50:03 -07:00
test_tokenizer.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_tokenizers.py fix: correct tiktoken encoding for unknown gpt-4 model snapshots (#552) 2026-06-03 13:12:16 -07:00
test_tool_result_interceptors.py fix(review-3): address third-pass PR #210 feedback 2026-04-20 20:24:47 -07:00
test_transforms_content_detection.py test: align test_error_detection with Phase 3e.1 bug fixes 2026-04-29 16:10:08 -07:00
test_transforms_content_router.py fix: ignore brackets inside JSON strings when splitting mixed content (#553) 2026-06-03 12:32:56 -07:00
test_transforms_log_compressor.py feat(rust): port log_compressor to Rust + bug fixes (Phase 3e.5) 2026-04-29 20:47:49 -07:00
test_transforms_package.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_transforms_search_compressor.py fix(ccr): key Rust search/diff/log markers with explicit_hash (#852) 2026-06-11 13:08:05 -05:00
test_utils.py test: add missing type hints to FakeProvider in test_utils (#631) 2026-06-10 21:15:16 -05:00
test_ws_http_fallback.py fix(proxy): restore Codex usage headers on WS and streaming SSE transports (#577) (#794) 2026-06-09 15:55:53 -05:00
test_ws_memory_relay.py Fix CI lint errors and test failures 2026-04-14 18:23:06 -07:00
test_ws_session_registry.py feat(proxy): track Codex WS sessions and cancel relay tasks deterministically 2026-04-20 22:01:41 +07:00