headroom/tests
Parideboy 3752458022
fix(cache): enforce Anthropic's 1h-before-5m cache_control ordering before forwarding (#2941)
## Description

Anthropic evaluates prompt-cache breakpoints in **one pass over the
whole request** — `tools`, then `system`, then `messages` — and rejects
the request outright when a `ttl='1h'` breakpoint appears after a
5-minute one. A bare `{"type": "ephemeral"}` marker counts as 5 minutes,
so this is easy to trip without any `ttl` field being visibly wrong:

```
API Error: 400 messages.15.content.1.cache_control.ttl: a ttl='1h' cache_control block must not
come after a ttl='5m' cache_control block. Note that blocks are processed in the following order:
tools, system, messages.
```

Headroom rewrites `cache_control` markers in several independent places,
each looking at one section, and nothing checked the invariant that
spans them. The failure mode is a dead turn, not a silent cost
regression.

Two paths can leave the forwarded body illegal today:

1. **Replayed 1h marker in a 5m request.** Claude Code picks its TTL
lane per request, not per session: the main loop asks for 1h and sends
the `extended-cache-ttl` beta header, while a side question (`/btw` in
the report) goes out in the 5m lane with bare markers and no beta
header. Headroom replays part of the previous turn's forwarded bytes
into `messages` to keep the prefix stable, and those bytes still carry
`ttl: "1h"`. `tools`/`system` at 5m, `messages` at 1h — 400.
2. **Tools breakpoint downgraded.** `inject_tool_search_deferral`
re-places the *last* marker it stripped, so a bare marker on a later
deferred tool overwrites a `ttl='1h'` one. The tools prefix goes
upstream at 5m while message breakpoints are still 1h — 400. Reported
separately as #2767.

The rule spans `tools`/`system`/`messages`, so no individual transform
is in a position to check it. The fix is a guard at the last seam before
the body goes on the wire, plus the one Python/Rust divergence that
manufactures the violation upstream of it.

Closes #2939

## Type of Change

- [x] Bug fix (non-breaking change that fixes an issue)
- [ ] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] Documentation update
- [ ] Performance improvement
- [ ] Code refactoring (no functional changes)

## Changes Made

- `headroom/proxy/helpers.py`: new `enforce_cache_control_ttl_order`,
plus `cache_control_ttl_lane` / `cache_control_ttl_lanes` /
`walk_cache_control`. The walk visits markers in Anthropic's documented
order and matches the traversal `count_cache_breakpoints` already
performs, so the two cannot disagree about what counts as a breakpoint.
TTL ranking is ported verbatim from the Rust `TtlOrderingWalk::observe`:
absent or `"5m"` is short, `"1h"` is long, any other value is left alone
rather than guessed at. Two repairs:
- **Lane containment** — when the client sent no 1h marker of its own,
strip `ttl` from any 1h marker that leaked in. That request never sent
the `extended-cache-ttl` beta header, so it could not have written a 1h
entry anyway; nothing is lost. Other marker fields (`scope`, …) are
preserved.
- **Ordering** — when the client did ask for 1h, promote every 5m marker
preceding the last 1h one. Demoting would also make the request legal
but would discard 1h caching the client is explicitly paying for, which
is the regression #2375 / #2382 / #2651 were filed to stop. A violation
seen on the way out means headroom downgraded or introduced a marker, so
promoting restores what the client's own (legal) request asked for at
that position.
- Copy-on-write: a legal body is returned by identity, so the hot path
pays only a walk over at most a handful of markers. Kill switch
`HEADROOM_CACHE_CONTROL_TTL_GUARD=0`, matching the
`HEADROOM_TOOL_SEARCH=0` convention.
- `headroom/proxy/handlers/anthropic.py`:
- Capture the client's TTL lane from the inbound snapshot, before any
transform runs. This cannot be inferred from the session or from config
— the lane is a per-request property of Claude Code, which is the whole
reason the `/btw` case exists.
- Call the guard immediately before `log_cache_breakpoints`, i.e. after
every transform, the tool sort, the deferral, CCR injection and the
pipeline extensions. Mark the body mutated when a repair fires, and log
a WARNING carrying the repair kind, the counts and the offending
sections — the diagnostic the next report of this class will need.
- `_sort_tools_deterministically` now skips the sort when any tool
carries `cache_control`, logging `event=tool_sort_skipped
reason=marker_present`. A breakpoint on a tool means "cache through
here", so reordering changes what is inside the cached prefix and can
move a 1h-marked tool behind a 5m-marked one. The Rust proxy already
refuses for exactly this reason (`any_tool_has_cache_control` in
`crates/headroom-proxy/src/compression/live_zone_anthropic.rs:651`); the
Python path never got the same guard. Putting the check in
`_sort_tools_deterministically` rather than `_tools_for_forwarding`
covers all call sites including the batch path.
- `tests/test_cache_control_ttl_order.py`: new, 24 cases.

## 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

The new tests validate against an independent reimplementation of
Anthropic's rule rather than against the guard's own walk, so a bug in
the walk cannot make the assertions pass. Coverage: lane classification
(bare marker is 5m, unknown TTLs are `other`); containment of a replayed
1h marker including preservation of non-`ttl` fields; promotion across
`tools`→`messages`, `system`→`messages` and within `messages`; markers
nested in `tool_result` sub-blocks; only markers before the *last* 1h
one are rewritten, so a legal 1h-then-5m ordering is left alone; legal
bodies returned by `is` identity; unknown `ttl` untouched; kill switch;
the tool sort skipping on marked tools and still sorting unmarked ones,
with one test pinning that the sort *would* have created a violation
without the guard; and an end-to-end regression running
`inject_tool_search_deferral` then the guard on the #2767 shape.

### Test Output

```text
$ pytest tests/test_cache_control_ttl_order.py -q
24 passed in 0.77s

$ pytest tests/test_cache_ttl_preserved.py tests/test_cache_control_move_bust.py \
         tests/test_cache_breakpoint_diagnostics.py tests/test_issue_746_tool_search.py -q
86 passed in 1.36s

$ pytest tests/test_cache/ tests/test_proxy/ -q
16 failed, 489 passed, 2 skipped in 91.41s

$ ruff check headroom/ tests/test_cache_control_ttl_order.py
All checks passed!

$ ruff format --check headroom/ tests/test_cache_control_ttl_order.py
1 file would be reformatted, 520 files already formatted

$ mypy --python-version 3.13 headroom --ignore-missing-imports
Found 12 errors in 3 files (checked 517 source files)
```

The three non-green results above are all pre-existing on a clean
`upstream/main` in this environment, verified by stashing the changes
and re-running:

- The 16 failures are all in
`tests/test_cache/test_client_integration.py` and are a Windows
temp-path problem in this sandbox (`OSError: [WinError 123] ...
'\\C:\\Users\\...\\Temp'`), not a code failure. They fail identically
with the branch stashed.
- `ruff format --check` flags `headroom/testing/README.md`, a docs code
block untouched by this PR.
- The mypy errors are in `headroom/memory/mcp_server.py` and
`headroom/release_version.py`; none are in the files this PR changes.
`--python-version 3.13` is needed locally because the pinned
`python_version = "3.10"` makes mypy reject the installed numpy stubs
before it checks anything.

## Real Behavior Proof

- Environment: Windows 11, Python 3.13.11, headroom at this branch's
head, run against the real `headroom.proxy` forwarding helpers. No
Anthropic API key is available in this environment, so Anthropic's
validator is reimplemented locally from its documented rule and its own
error string; the request bodies are produced by the real code path
(`_sort_tools_deterministically` then `inject_tool_search_deferral` then
the guard), not hand-written.
- Exact command / steps: build two request shapes — (A) a 5m-lane
request whose `messages` carries a replayed `ttl:"1h"` marker, the
`/btw` case; (B) 13 tools with markers on two deferred tools plus 1h
message breakpoints, the #2767 case — push each through the forwarding
helpers twice, once with `HEADROOM_CACHE_CONTROL_TTL_GUARD=0` and once
with the guard at its default, and validate the resulting body.
- Observed result: both scenarios are rejected with the issue's exact
400 when the guard is off, and both are legal with it on. Scenario A is
repaired by lane containment (the leaked 1h ttl is stripped), scenario B
by promotion (the downgraded tools breakpoint goes back to 1h). Full
output:

```text
########## Scenario A: /btw side question replays a 1h marker into a 5m request ##########

===== BEFORE (HEADROOM_CACHE_CONTROL_TTL_GUARD=0) =====
  tools.0                      5m
  system.0                     5m
  messages.1.content.0         1h
  RESULT: API Error: 400 messages.1.content.0.cache_control.ttl: a ttl='1h' cache_control block
  must not come after a ttl='5m' cache_control block. Note that blocks are processed in the
  following order: tools, system, messages.

===== AFTER (default) =====
WARNING event=cache_control_ttl_order request_id=repro-2939 repair=lane_containment demoted=1
leaked_from_section=messages; the client sent no 1h marker, so a replayed 1h breakpoint would
have been rejected upstream
  tools.0                      5m
  system.0                     5m
  messages.1.content.0         5m
  RESULT: 200 OK (request satisfies the ordering rule)

########## Scenario B: tool-search deferral downgrades the tools breakpoint ##########

===== BEFORE (HEADROOM_CACHE_CONTROL_TTL_GUARD=0) =====
INFO event=tool_sort_skipped reason=marker_present tool_count=13 marked=2
  tools.1                      5m
  messages.1.content.0         1h
  RESULT: API Error: 400 messages.1.content.0.cache_control.ttl: a ttl='1h' cache_control block
  must not come after a ttl='5m' cache_control block. Note that blocks are processed in the
  following order: tools, system, messages.

===== AFTER (default) =====
INFO event=tool_sort_skipped reason=marker_present tool_count=13 marked=2
WARNING event=cache_control_ttl_order request_id=repro-2939 repair=promote_to_1h promoted=1
first_short_section=tools first_long_section=messages; a 5m breakpoint preceded a 1h one, which
Anthropic rejects outright
  tools.1                      1h
  messages.1.content.0         1h
  RESULT: 200 OK (request satisfies the ordering rule)
```

- Not tested: no live call to `api.anthropic.com` — no credentials in
this environment — so the 400/200 above come from a local
reimplementation of the rule, not from the API itself. The reporter's
original `/btw` flow was not reproduced end to end through `headroom
wrap claude`. Cache-hit-rate impact of promoting a 5m marker to 1h was
not measured against real traffic; the reasoning for promoting over
demoting is argued above, not benchmarked. Nothing on the Rust side was
exercised.

## Review Readiness

- [x] I have performed a self-review
- [x] This PR is ready for human review

## Checklist

- [x] My code follows the project's style guidelines
- [x] I have performed a self-review of my code
- [x] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] I did **not** edit `CHANGELOG.md` — it is generated by
release-please from my Conventional Commit PR title (a CI guard enforces
this)

## Additional Notes

Documentation was not updated: the new env var is a kill switch for an
internal correctness guard with no user-facing behaviour when things are
working, matching how `HEADROOM_KOMPRESS_BACKGROUND_WARM` is handled.
Happy to add a line to the env-var reference if maintainers prefer.

**One trade-off worth a maintainer's eye.** `affinity_tools` feeds a
`segment_fingerprint` used for prefix-tracker affinity. Skipping the
sort makes that fingerprint depend on the client's tool order. Clients
that mark tools must already keep a stable order for their own prefix
cache to work, so this should be safe, but it is stated rather than
assumed.

**Deliberately out of scope, flagged rather than dropped:**

- The sibling hole in `inject_tool_search_deferral`: when
`resident_has_cache_control` is already true at 5m, a dropped 1h marker
is discarded outright. That is a cost regression rather than a 400, and
it sits in the same handful of lines that the open PR #2771 rewrites, so
touching it here would conflict. Better raised on #2767.
- `TtlOrderingWalk` in `crates/headroom-core/src/cache_control.rs` is
instantiated separately per field list, so it only ever sees violations
*within* `messages`, `system` or `tools` — never across them — and it
only warns. Its module doc justifies warn-only with "Anthropic itself
accepts both orderings (just with potentially-suboptimal cache
eviction)". #2939 and #2767 both show that premise is now stale.
Changing Rust behaviour is a separate blast radius.
- `cold_prefix._cache_control_ttls` never scans `tools[]`, so a client
whose only 1h marker rides on `tools` is read as 300s. Separate bug,
separate PR.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: JD Davis <mxjerrett@gmail.com>
2026-08-12 16:32:12 -05:00
..
cli Add Click-based CLI with memory management commands 2026-01-29 21:30:21 -08:00
fixtures fix(codex): rerun memory lookup on every response.create WS frame (#2113) 2026-07-13 14:42:27 -04:00
integrations fix(compression): honor qualified CCR names across integrations (#2698) 2026-08-03 20:17:39 -07:00
parity feat(rust): port CodeCompressor AST compressor to Rust (parity-only) (#1154) 2026-07-27 09:21:57 -07:00
test_backends fix(backends/litellm): None-guard core token counts in OpenAI usage block (#2324) 2026-08-11 23:48:43 -05:00
test_cache fix(cache): stable session identity and per-conversation prefix trackers under agentic clients (#2193) 2026-07-15 18:42:20 +00:00
test_cli fix(wrap): serialize shared proxy startup (#2946) 2026-08-12 12:50:09 -07:00
test_compression fix(code): parse-probe tree-sitter availability in code_handler (#1231) (#1300) 2026-07-09 14:06:29 -05: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(install/windows): register persistent-task from S4U hidden XML (#2453) (#2459) 2026-08-12 00:10:23 -05:00
test_integrations fix(litellm): close shared cloud client 2026-08-11 10:13:10 -07:00
test_learn fix(learn): stop classifying a successful exit code 0 as an error (#2289) 2026-08-11 23:45:32 -05:00
test_live feat(read-maturation): activity-based hold-back Read maturation (Mechanism B) (#1068) 2026-06-22 22:52:42 -05:00
test_mcp_registry fix(wrap/serena): install Serena from the serena-agent PyPI wheel, not the git source 2026-08-11 09:10:32 -07:00
test_memory fix(memory): keep vector metadata in sync (#2295) 2026-08-11 23:46:13 -05:00
test_providers fix(providers/openai): bound tiktoken vocab loads with the guarded loader (#2554) 2026-08-12 00:20:16 -05:00
test_proxy fix(proxy/anthropic): None-guard usage token counts on the direct buffered path (#2434) 2026-08-12 00:07:51 -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_tokenizers fix(tokenizers): bound tiktoken vocab load so a stalled download cannot hang requests (#956) (#994) 2026-06-19 11:27:09 -05:00
test_transforms fix(transforms/smart_crusher): don't crash on a tool call with a null function (#2232) 2026-08-11 23:39:37 -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
_mcp_stub.py fix(codex): stop pinning Codex memory MCP to one project db (#1269) 2026-06-23 07:49:07 -05:00
_skip_helpers.py fix(ccr): skip Anthropic marker emission when tool injection is deferred (#1273) 2026-06-23 12:48:05 -05:00
conftest.py fix(proxy): cache litellm model resolution to stop repeated Provider List spam 2026-08-11 09:55:24 -07:00
e2e_cortex_latency.py fix(cortex-code): migrate to current Cortex REST API endpoints + add e2e benchmarks (#1474) 2026-06-30 14:14:36 -05:00
e2e_cortex_mcp.py fix(cortex-code): migrate to current Cortex REST API endpoints + add e2e benchmarks (#1474) 2026-06-30 14:14:36 -05:00
e2e_cortex_proxy.py fix(cortex-code): migrate to current Cortex REST API endpoints + add e2e benchmarks (#1474) 2026-06-30 14:14:36 -05:00
e2e_cortex_proxy_mcp.py fix(cortex-code): migrate to current Cortex REST API endpoints + add e2e benchmarks (#1474) 2026-06-30 14:14:36 -05:00
e2e_cortex_quality.py fix(cortex-code): migrate to current Cortex REST API endpoints + add e2e benchmarks (#1474) 2026-06-30 14:14:36 -05:00
e2e_cortex_savings.py fix(cortex-code): migrate to current Cortex REST API endpoints + add e2e benchmarks (#1474) 2026-06-30 14:14:36 -05: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_5xx_accounting_all_providers.py fix(proxy): count exhausted upstream 5xx as failed across all providers (#1571) 2026-07-09 17:07:08 -05:00
test_acceptance.py fix: B1 — retire ICM, RollingWindow, scoring, relevance + dependents 2026-05-02 12:23:17 -07:00
test_adapter_hooks.py feat: compression extraction — Rust knob exposure, CCR hardening, traffic audits (#818) 2026-06-16 20:21:13 -07:00
test_adaptive_sizer.py fix(transforms/adaptive-sizer): honor max_k on small-input fast path (#2319) 2026-08-11 23:48:22 -05:00
test_adversarial_grid.py feat(evals): adversarial-input robustness grid for compressors (#918) 2026-06-13 10:47:54 -05:00
test_agent_savings.py fix(savings): coding profile compresses the recent delta (protect_recent 2->0, min_tokens 25->10) (#2145) 2026-07-14 04:07:25 -04: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_ccr_workspace_unbound.py fix(proxy): hoist ccr_workspace_key default so /v1/messages survives CCR-inject off (#1096) 2026-07-09 17:29:40 -05:00
test_anthropic_compaction_transforms.py fix(tests): repair three main-branch test failures (#2306) 2026-07-16 09:21:41 -07:00
test_anthropic_pre_upstream_backpressure.py fix(proxy/cost): mark estimated-basis budget records and add an enforcement policy (#2713) (#2725) 2026-08-02 23:05:44 -07:00
test_anthropic_stage_timings.py fix(anthropic): strip first-party tool search on custom upstreams (#2539) 2026-08-08 01:55:02 -05:00
test_audit_codex.py fix: remove rtk and lean-ctx CLI context tools (#2677) 2026-07-30 22:59:41 -07:00
test_audit_reads.py feat: compression extraction — Rust knob exposure, CCR hardening, traffic audits (#818) 2026-06-16 20:21:13 -07:00
test_auth_mode.py fix(proxy/auth): match real Anthropic OAuth token prefix (sk-ant-oat) (#1672) 2026-07-02 14:26:19 -07:00
test_auth_policy.py feat(grok-build): add Grok Build wrap command and MCP integration (#1629) 2026-07-15 20:51:52 +00:00
test_azure_foundry_claude_compression.py feat(azure-foundry): derive upstream URL from ANTHROPIC_FOUNDRY_RESOURCE (#1138) 2026-06-22 15:49:14 -05:00
test_backend_anyllm.py fix(backends/anyllm): stream tool_use blocks and map finish_reason on the streaming path 2026-08-11 18:15:57 -07:00
test_backend_bugs.py fix(backends/litellm): drop oversized tool names before Bedrock Converse (#2129) 2026-07-13 19:53:49 -04:00
test_backend_nonstreaming_cache_metrics.py fix(proxy/bedrock): report uncached input tokens from backend usage, not the live-zone count (#2318) 2026-08-11 23:47:33 -05: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_bash_search_lossless_fold.py feat(lossless): factor shared directory prefix in the grep search fold (#2547) 2026-07-24 20:40:49 -07:00
test_bedrock_prefix_tracker_wiring.py fix(proxy/bedrock): wire PrefixCacheTracker updates into Bedrock backend paths (#2196) 2026-07-15 18:18:20 +00:00
test_bedrock_region.py fix(proxy): pass through cross-region prefixed Bedrock model IDs directly (#2330) 2026-08-11 23:54:03 -05:00
test_bedrock_streaming_input_tokens.py fix(proxy): report real input tokens on streaming message_start (#1132) (#1305) 2026-06-23 12:53:15 -05:00
test_bedrock_tool_result_cache_and_streaming_stats.py fix(backend/bedrock): preserve system-prompt cache_control breakpoint (list form) (#2225) 2026-07-15 19:58:06 +00:00
test_beta_header_merge.py refactor(proxy): extract beta header merge policy (#1993) 2026-07-12 21:34:25 -07:00
test_beta_header_policy.py refactor(proxy): extract beta header policy (#1992) 2026-07-12 12:18:53 -04:00
test_binaries.py fix: docker install fails with PermissionError in readonly cache dir 2026-04-20 17:36:44 -07:00
test_builtin_compressor_adapters.py feat(transforms): dispatch kompress/text via the compressor registry + forward question (#2411) 2026-07-18 22:03:53 -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_cache_aligner_prefix_stability.py fix(cache-aligner): hash the frozen conversation prefix so Claude Code cache invalidation is detected (#2085) (#2161) 2026-07-14 11:59:52 -04:00
test_cache_breakpoint_diagnostics.py fix(cache): mirror client cache_control positions instead of single-marker consolidation 2026-08-11 18:15:44 -07:00
test_cache_control_move_bust.py fix(cache): mirror client cache_control positions instead of single-marker consolidation 2026-08-11 18:15:44 -07:00
test_cache_control_ttl_order.py fix(cache): enforce Anthropic's 1h-before-5m cache_control ordering before forwarding (#2941) 2026-08-12 16:32:12 -05:00
test_cache_mode_cold_start.py fix(proxy): compress cache-mode cold starts and tag prefix-mismatch passthrough (#2365) 2026-08-11 23:55:11 -05:00
test_cache_mode_delta_marker.py feat(cache): provider-agnostic cache-mode delta + cc-agnostic prefix comparison (#1868) 2026-07-08 13:29:35 -07:00
test_cache_prefix_overlay.py feat(cache): provider-agnostic cache-mode delta + cc-agnostic prefix comparison (#1868) 2026-07-08 13:29:35 -07:00
test_cache_ttl_preserved.py fix(cache): preserve cache_control ttl when re-anchoring a breakpoint (#2651) 2026-07-29 09:16:41 -07:00
test_canonical_pipeline.py fix(transforms): gate tool string output from lossy compression (#1307) (#1387) 2026-06-25 13:43:53 -05:00
test_ccr.py fix(ccr): make headroom_retrieve a hash-only full-content lookup (#1532) 2026-06-28 10:32:43 -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): skip compact summaries for proactive expansion (#2242) 2026-07-15 19:57:46 +00:00
test_ccr_feedback.py fix(cache/ccr): don't count a successful eviction as a retrieval (#2106) 2026-07-13 10:53:55 -04:00
test_ccr_golden_policy.py refactor(proxy): extract ccr golden replay policy (#2006) 2026-07-12 11:49:12 -04:00
test_ccr_inline_resolve_handlers.py fix(ccr): resolve <<ccr:...>> markers inline when no retrieve-tool path exists (#2512) 2026-08-12 00:18:43 -05:00
test_ccr_marker_policy.py fix(proxy): stop toggling headroom_retrieve in the Anthropic tools array (#2672) 2026-08-03 16:18:11 -07:00
test_ccr_marker_resolution.py fix(ccr): resolve <<ccr:...>> markers inline when no retrieve-tool path exists (#2512) 2026-08-12 00:18:43 -05:00
test_ccr_mcp_http.py feat(mcp): add streamable HTTP MCP transport (#1773) 2026-07-14 13:25:45 -04:00
test_ccr_mcp_server.py fix(mcp): reap orphaned mcp serve on client death (#2226) 2026-07-15 18:57:32 +00:00
test_ccr_response_handler.py fix(ccr): guard empty/malformed OpenAI choices in _extract_assistant_message (#2389) 2026-07-18 16:47:59 -07:00
test_ccr_response_handler_extra.py fix(ccr): tolerate null/malformed OpenAI data in response handling (#2467) 2026-08-12 00:11:30 -05:00
test_ccr_response_handler_openai_responses.py feat(ccr): wire retrieve-tool interception into OpenAI Responses handler (#1898) 2026-07-09 09:41:06 -04:00
test_ccr_row_drop_store_bridge.py feat(compress): reach the lossless provider seam on the general path and default /v1/compress to marker-free output (#2691) 2026-07-31 12:31:38 -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_session_tracker.py refactor(proxy): extract ccr session tracker (#2003) 2026-07-11 10:17:53 -05:00
test_ccr_sqlite_backend.py fix(ccr): honor workspace dir for sqlite store (#1564) 2026-07-01 20:25:14 -05:00
test_ccr_tag_placeholder_regression.py fix(ccr): store pre-protection original, not tag placeholder, in CCR (#1208) 2026-07-14 16:07:08 -04:00
test_ccr_tool_always_on.py fix(ccr): make headroom_retrieve a hash-only full-content lookup (#1532) 2026-06-28 10:32:43 -07:00
test_ccr_tool_calls.py fix(ccr): don't crash tool-call detection on a null function/functionCall (#2269) 2026-07-16 14:38:09 -07:00
test_ccr_tool_injection.py fix(ccr): don't crash tool-call detection on a null function/functionCall (#2269) 2026-07-16 14:38:09 -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 fix(tokenizers): price Claude against a real BPE (tiktoken o200k) not a char estimate (#2543) 2026-07-24 15:06:43 -07:00
test_cli_dashboard.py feat(cli): add headroom dashboard and surface the dashboard URL (#1277) (#1292) 2026-06-22 19:05:38 -05:00
test_cli_doctor.py fix(doctor): flag ollama launch claude proxy bypass instead of misdirecting (#2566) 2026-08-12 00:19:44 -05:00
test_cli_extension_seam.py feat(cli,pricing): add CLI extension seam and prompt-cache TTL pricing (#2802) 2026-08-05 12:24:49 -07:00
test_cli_inspect.py feat(cli): add headroom inspect to view original vs compressed content (#1595) 2026-07-15 19:58:38 +00:00
test_cli_learn.py fix(learn): aggregate verbosity baselines across projects instead of overwriting (#1288) 2026-06-30 08:37:37 -05:00
test_cli_memory_index_sync.py fix(memory): sync FTS5 and vector indexes on CLI delete/edit/prune/purge 2026-08-11 14:25:36 -07:00
test_cli_perf_format.py perf: surface optimization overhead diagnostics (#1212) 2026-07-15 21:04:21 +00:00
test_cli_proxy_embedding_server.py fix(cli): fall back gracefully when embedding-server sidecar is absent (#1206) 2026-06-23 07:47:51 -05:00
test_cli_proxy_env.py fix(proxy): dedupe Codex WS request logging for accurate mixed-provider dashboards (#2189) 2026-07-15 18:18:34 +00:00
test_cli_proxy_improvements.py docs(proxy): document HEADROOM_SAVINGS_PROFILE and correct --mode default (#2031) (#2040) 2026-07-14 14:10:28 -04:00
test_cli_tools.py test: apply linux ruff formatting 2026-04-23 08:49:50 -05:00
test_cli_update.py fix(cli/update): let install ownership win over bare /.dockerenv so venv installs self-update (#2830) 2026-08-11 17:23:29 -05:00
test_code_aware_brace_comment_regressions.py fix(code): stop TS export duplication + comment displacement (#1906) 2026-07-09 12:51:32 -05:00
test_code_aware_regressions.py fix: correct Go AST compression bugs and CODE_AWARE token accounting (#1668) 2026-07-07 11:36:49 -05:00
test_code_compressor_language_alias.py feat(code): add PHP support to CodeAwareCompressor (#2423) 2026-07-31 15:54:13 -07: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_client_stamp.py fix(proxy): stamp X-Client: codex on Responses endpoint for unidentified callers (#1036) 2026-06-17 11:45:20 -05:00
test_codex_live.py fix(proxy): route Codex Live voice through a dedicated /v1/live transport (#2709) 2026-08-02 13:15:47 -07: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_responses_passthrough_bytes.py Wire OpenAI Responses output shaping (#1438) 2026-07-05 13:59:21 -07:00
test_codex_responses_waste_signals.py fix(codex): compute waste signals on the OpenAI Responses path (#898) 2026-06-12 17:10:29 -05:00
test_codex_ws_compression_scheduler.py refactor(transforms): isolate mixed content parsing (#1939) 2026-07-10 19:28:21 -05:00
test_codex_ws_per_frame_memory.py fix(codex): rerun memory lookup on every response.create WS frame (#2113) 2026-07-13 14:42:27 -04:00
test_codex_ws_savings_deferral.py fix(proxy/openai): don't record Codex WS savings without input accounting (#2493) 2026-07-22 06:06:30 -07:00
test_cold_start_fast_pass.py fix(cache): stable session identity and per-conversation prefix trackers under agentic clients (#2193) 2026-07-15 18:42:20 +00: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 feat(compress): expose frozen_message_count in library-mode compress() (#2178) 2026-07-14 16:07:21 -04:00
test_compress_failure.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_compress_passthrough.py feat(proxy): opt-in compression for catch-all passthrough routes (#1699) 2026-07-15 19:58:34 +00:00
test_compress_route_tokenizer_by_model.py fix(compress): resolve the /v1/compress tokenizer per model, and document the real contract (#2743) 2026-08-03 12:20:33 -07:00
test_compression_batches.py fix(proxy): batch small Codex Responses tool outputs (#2239) 2026-07-15 19:57:50 +00:00
test_compression_cache.py fix(cache): bound compression cache bookkeeping 2026-08-11 09:52:27 -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_fidelity_regression.py test(evals): add offline fidelity regression gate (recall-based, zero-model) (#1187) 2026-06-22 22:53:59 -05:00
test_compression_observability.py feat(metrics): record per-extension token savings (#2371) 2026-07-17 21:58:18 -07:00
test_compression_policy.py fix(policy): correct warm-cache penalty in net_mutation_gain to (S + dT) (#903) 2026-06-12 17:14:30 -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(cache/ccr): don't evict a live entry on a duplicate store at capacity (#2082) 2026-07-13 09:46:24 -04:00
test_compression_strategy_outcomes.py refactor(cache): isolate compression strategy outcomes (#1938) 2026-07-10 19:21:47 -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 fix(proxy): batch small Codex Responses tool outputs (#2239) 2026-07-15 19:57:50 +00:00
test_compressor_config_exposure.py feat: compression extraction — Rust knob exposure, CCR hardening, traffic audits (#818) 2026-06-16 20:21:13 -07:00
test_compressor_registry.py feat(transforms): add pluggable compressor registry + headroom.compressor entry point (#2370) 2026-07-17 21:55:16 -07:00
test_compressor_selection.py feat(transforms): make built-in compressors real Compressor implementations (adapters) (#2391) 2026-07-18 12:59:49 -07:00
test_config.py feat: attribute reread waste to over-compression via marker check (#901) 2026-06-13 10:43:35 -05:00
test_content_router_compact_json.py fix(router): compact JSON evades compression via whitespace token counting (#1857) 2026-07-14 06:54:01 -04:00
test_content_router_detection_dedup.py perf(content_router): dedupe content detection (#2419) 2026-07-19 08:50:46 -07:00
test_content_router_exclude_tools.py fix(content-router): protect_tool_results must not be weakened by profile-derived read_protection_window (#2105) 2026-07-13 14:01:18 -04:00
test_content_router_single_item_deadline.py fix(kompress): raise the default execution-slot wait (#2456) 2026-07-22 06:17:33 -07:00
test_content_router_token_units.py fix(router): compare token quantities in one unit (#2759) 2026-08-03 22:49:47 -07:00
test_content_router_tool_role_reversibility.py fix(transforms): gate tool string output from lossy compression (#1307) (#1387) 2026-06-25 13:43:53 -05:00
test_content_router_user_blocks.py fix(proxy): compress Anthropic user text blocks when enabled (#1875) 2026-07-08 14:24:15 -07:00
test_context_tool_cleanup.py fix: remove rtk and lean-ctx CLI context tools (#2677) 2026-07-30 22:59:41 -07:00
test_copilot_auth.py feat(copilot): proxy VS Code models transparently (#2687) 2026-08-03 04:42:48 -07: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_provider_label.py feat(proxy): label GitHub Copilot traffic as "copilot" in the outcome… (#2377) 2026-07-18 09:54:06 -07:00
test_copilot_quota.py fix(subscription/copilot): preserve remaining=0 for exhausted quota (#1997) 2026-07-12 18:48:22 -04:00
test_copilot_subscription_smoke.py fix: support Copilot Business subscription auth (#641) 2026-06-12 20:46:38 -05: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_cortex_code_compression.py feat(providers): add Cortex Code (Snowflake CoCo) as a supported agent (#1190) 2026-06-21 22:18:47 -07:00
test_cost_budget_basis.py fix(proxy/cost): mark estimated-basis budget records and add an enforcement policy (#2713) (#2725) 2026-08-02 23:05:44 -07:00
test_cost_budget_total_prompt.py fix(cost): send litellm the total prompt so --budget stops seeing $0 (#2757) 2026-08-03 22:41:10 -07:00
test_cost_pricing_warning_dedup.py fix(proxy/cost): warn once per model when pricing lookup fails (#2504) (#2535) 2026-07-24 09:47:09 -07:00
test_cost_tracker_counterfactual.py fix(proxy): keep OpenAI tool observations mutable in cache mode (#1884) 2026-07-09 07:51:01 -07:00
test_cost_tracker_totals.py perf: cut hot-path latency 27% (token-count memo, startup preloads, JSON scan memo) (#2838) 2026-08-06 17:47:40 -07:00
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(ccr): make headroom_retrieve a hash-only full-content lookup (#1532) 2026-06-28 10:32:43 -07:00
test_cross_turn_cache_safety.py fix(proxy): freeze must forward cached (compressed) prefix byte-identical — stop token-mode cache busting (#1850) 2026-07-06 14:54:39 -07:00
test_cross_turn_dedup.py fix(transforms/cross-turn-dedup): don't renumber-fold zero-padded line prefixes (#2369) 2026-07-20 17:47:56 -07:00
test_custom_base_passthrough_telemetry.py fix(codex): OpenCode Zen telemetry attribution (#1648) 2026-07-07 11:35:21 -05:00
test_dashboard_agent_usage.py feat: add dashboard agent usage stats (#814) 2026-06-12 14:12:22 -05:00
test_dashboard_cache_lifetime_playwright.py fix: publish headroom-opencode in release workflow (#2372) 2026-08-11 23:56:40 -05:00
test_dashboard_cache_net_playwright.py fix(dashboard): serve tailwind/htmx/alpine locally instead of from CDNs (#2734) 2026-08-03 06:07:27 -07:00
test_dashboard_cache_ttl_playwright.py fix: publish headroom-opencode in release workflow (#2372) 2026-08-11 23:56:40 -05:00
test_dashboard_static_assets.py fix(dashboard): serve tailwind/htmx/alpine locally instead of from CDNs (#2734) 2026-08-03 06:07:27 -07:00
test_dashboard_token_savings.py fix(dashboard): align token savings headline denominator (#1653) 2026-07-01 23:31:32 -05:00
test_dataset_recall_runner.py feat(evals): weekly HotpotQA answer-recall report on the prose path (#1188) 2026-07-15 21:40:55 +00:00
test_debug_dump_gating.py feat(security): pilot hardening — stateless guarantee, model pinning, CI security gate (#1515) 2026-06-27 17:44:10 -07:00
test_diagnostic_decode_policy.py Extract diagnostic decode policy (#1981) 2026-07-12 12:17:39 -04:00
test_docker_compose_persistence.py fix(docker): report source build version (#1862) 2026-07-08 13:32:04 -05:00
test_error_detection.py fix(router): stop protecting passing build/test output as error traces (#1740) 2026-07-14 13:25:49 -04:00
test_evals_cjk_tokenization.py fix(evals): CJK-aware F1 tokenization + token estimation (#1527) 2026-06-30 14:27:25 -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_evals_multilingual.py feat(evals): register multilingual multi-wiki-qa (zh/ja/ko) dataset (#1530) 2026-07-14 13:25:10 -04:00
test_exceptions.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_force_kompress_all.py feat(proxy): add --force-kompress-all to route all content through kompress-v2-base (#1613) 2026-06-30 15:30:22 -07:00
test_forwarded_headers.py feat(dashboard): persist lifetime proxy metrics (#2198) 2026-07-15 18:18:13 +00:00
test_forwarded_policy.py refactor(proxy): isolate forwarded header policy (#1942) 2026-07-10 17:41:38 -05:00
test_fsutil.py fix: remove rtk and lean-ctx CLI context tools (#2677) 2026-07-30 22:59:41 -07:00
test_gateway_sidecar_ports.py feat(proxy): make /v1/compress usable as a gateway/Kong sidecar (#2458) 2026-07-21 00:27:52 -07:00
test_gemini_compression_offload.py fix(gemini): offload compression to the executor (#1382) 2026-06-26 12:25:15 -05:00
test_gemini_function_response_waste.py fix(proxy/gemini): tolerate malformed parts on the compression path (#2486) 2026-07-22 06:07:15 -07:00
test_gemini_nonjson_status.py fix(proxy): offload OpenAI and Gemini tokenizer counting off the event loop (#2498) 2026-07-22 21:01:05 -07:00
test_google_multimodal.py fix(proxy/gemini): preserve non-text content across the compression round-trip (#2079) 2026-07-13 09:46:35 -04:00
test_google_multimodal_e2e.py Add E2E tests for Google multimodal content preservation 2026-01-24 21:01:25 -08:00
test_graceful_shutdown.py fix(proxy): graceful shutdown and reliable Ctrl+C exit (#621) 2026-08-05 22:33:34 -05:00
test_graph.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_h2_stream_reset_retry.py fix(proxy): retry HTTP/2 stream resets instead of 502ing (#1645) 2026-07-07 11:31:06 -05: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(proxy): dedupe Codex WS request logging for accurate mixed-provider dashboards (#2189) 2026-07-15 18:18:34 +00:00
test_hermes_passthrough_compression.py fix(proxy): compress Hermes scoped coding-agent passthrough (#1815) 2026-07-13 17:22:46 -05:00
test_hermes_tool_call_unwrap.py fix(proxy): unwrap Hermes tool_call bridge in tool name map (#2717) 2026-08-04 22:16:46 -05:00
test_hf_revision_pinning.py feat(security): pilot hardening — stateless guarantee, model pinning, CI security gate (#1515) 2026-06-27 17:44:10 -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_huggingface_tokenizer_timeout.py fix(proxy): accept Codex websocket before upstream retries (#2203) 2026-07-15 18:18:06 +00: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_compression_isolation.py fix(proxy): isolate image compression in a subprocess so a native SIGSEGV can't take down the proxy (#2107) (#2162) 2026-07-14 11:52:20 -04:00
test_image_compression_offload.py fix(proxy): isolate image compression in a subprocess so a native SIGSEGV can't take down the proxy (#2107) (#2162) 2026-07-14 11:52:20 -04:00
test_image_compression_policy.py refactor(proxy): isolate image compression policy (#1958) 2026-07-11 10:25:15 -05:00
test_image_compressor.py fix: release image router models after compression 2026-04-29 01:45:27 -04:00
test_image_compressor_singleton_reuse.py fix(image): reuse image models instead of rebuilding them per request (#2513) (#2536) 2026-07-26 07:33:47 -07: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_image_types_torch_decoupling.py fix(image): decouple routing types from trained_router so importing the compressor doesn't import torch (#2513) (#2537) 2026-08-12 00:22:56 -05:00
test_internal_header_policy.py refactor(proxy): extract internal header policy (#1990) 2026-07-11 21:55:50 -05:00
test_issue_728_empty_tools_injection.py fix(proxy): keep PRE_SEND from reintroducing empty tool arrays (#2015) 2026-07-10 22:38:27 -05:00
test_issue_746_tool_search.py fix(anthropic): strip first-party tool search on custom upstreams (#2539) 2026-08-08 01:55:02 -05:00
test_issue_1601_remote_control_gate.py fix(wrap): surface Claude Remote Control base-URL gate accurately (#1… (#1883) 2026-07-13 14:01:37 -04:00
test_issue_1779_remote_control_gate.py fix(claude): treat non-zero claude --version exit as version-unknown … (#2233) 2026-07-15 18:14:58 +00:00
test_issue_2671_block_growth_cache.py fix(cache): stabilize Anthropic block-growing lineages (#2917) 2026-08-10 22:38:51 -07:00
test_kompress_download_backoff.py perf: cut hot-path latency 27% (token-count memo, startup preloads, JSON scan memo) (#2838) 2026-08-06 17:47:40 -07:00
test_kompress_failsafe.py fix(kompress): reject artifacts that fail at run, and prefetch model files at startup (#2740) 2026-08-03 10:42:48 -07:00
test_kompress_must_keep.py fix(kompress): hard override keeps must-keep tokens regardless of model score (#1400) 2026-06-26 14:15:37 -05:00
test_kompress_preload_deferral.py fix(kompress): reject artifacts that fail at run, and prefetch model files at startup (#2740) 2026-08-03 10:42:48 -07:00
test_kompress_remote_endpoint.py fix(kompress): let orgs run Kompress on their own inference stack (#2736) 2026-08-03 07:26:06 -07:00
test_kompress_request_nonblocking.py fix(proxy): fail open when kompress saturation would exhaust pre-upstream budget (#1430) 2026-06-30 13:41:22 -05:00
test_learn_grok_plugin.py fix(learn/grok): detect a Windows absolute project path (#2283) 2026-08-11 23:45:13 -05:00
test_litellm_callback.py test(litellm): remove unused pytest import 2026-07-09 20:59:12 -05:00
test_litellm_caller_key.py fix(litellm): don't forward a caller key the target cannot accept (#2883) 2026-08-09 20:12:41 -07:00
test_litellm_nonstream_cache_usage.py fix(backends): don't crash the OpenAI->Anthropic converter on empty choices (#2484) 2026-07-22 06:08:10 -07:00
test_litellm_openai_passthrough.py fix(litellm): forward chat_template_kwargs and other vendor top-level fields to OpenAI-compatible backends via extra_body (#2128) (#2163) 2026-07-14 12:00:19 -04:00
test_litellm_optional.py fix(deps): make litellm optional on Python 3.14 (#956) (#993) 2026-06-16 21:11:12 -05:00
test_litellm_upstream_timeout.py perf(proxy): bound upstream calls and hot-path costs (#2852) 2026-08-09 16:24:33 -07:00
test_local_backend_init_race.py fix(memory): singleflight LocalBackend init to stop cold-start races (#1691) 2026-07-02 16:00:55 -07:00
test_log_compressor.py fix: improve error handling and add comprehensive test coverage 2026-01-27 16:08:36 -08:00
test_loop_callback_failure_policy.py Extract loop callback failure policy (#1977) 2026-07-11 10:27:00 -05:00
test_lossless_diff_fold_guard.py fix(transforms): guard the lossless diff fold to diff-shaped content only (#2140) 2026-07-13 23:39:33 -04:00
test_lossless_excluded_compaction.py feat(transforms): pluggable lossless-compaction provider seam (#2433) 2026-07-20 10:44:42 -07:00
test_lossless_first_dispatch.py feat(compress): reach the lossless provider seam on the general path and default /v1/compress to marker-free output (#2691) 2026-07-31 12:31:38 -07:00
test_lossless_mode.py fix(content-router): token-measure lossless folds at the acceptance gate (#1772) 2026-07-03 15:04:07 -07:00
test_lossless_then_lossy.py fix(router): compact JSON evades compression via whitespace token counting (#1857) 2026-07-14 06:54:01 -04:00
test_mcp_registry_grok.py feat(wrap): add first-class Grok CLI support (#1823) 2026-07-15 18:51:38 +00:00
test_mcp_registry_opencode.py fix(opencode): use type=local + environment field for MCP config (#1380) (#1388) 2026-07-15 20:36:14 +00:00
test_mcp_stub.py fix(codex): stop pinning Codex memory MCP to one project db (#1269) 2026-06-23 07:49:07 -05: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 fix(ccr): skip Anthropic marker emission when tool injection is deferred (#1273) 2026-06-23 12:48:05 -05: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_decision_policy.py refactor(memory): isolate injection decision policy (#1952) 2026-07-10 23:45:44 -05:00
test_memory_eval.py fix(evals): default unparseable judge scores below pass threshold (#1892) 2026-07-08 19:31:25 -07:00
test_memory_golden_policy.py refactor(proxy): extract memory golden replay policy (#2007) 2026-07-12 12:19:46 -04:00
test_memory_handler_concurrent_init.py fix(ccr): skip Anthropic marker emission when tool injection is deferred (#1273) 2026-06-23 12:48:05 -05:00
test_memory_handler_native_ops.py fix(memory): preserve semantically similar memories (#2303) 2026-07-16 11:32:38 -07:00
test_memory_handler_null_function.py fix(proxy/memory): don't crash memory tool-call detection on a null function (#2272) 2026-07-16 14:37:41 -07: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_injection_logging.py fix(memory): audit passive context injection (#2212) 2026-07-15 18:17:31 +00:00
test_memory_injection_mode_policy.py Extract memory injection mode policy (#1986) 2026-07-12 12:18:23 -04: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_query_policy.py fix(memory): skip <system-reminder> blocks when building the retrieval query (#2195) (#2541) 2026-08-12 00:22:08 -05:00
test_memory_rank_policy.py refactor(proxy): isolate memory rank policy (#1960) 2026-07-10 23:51:51 -05:00
test_memory_ranker.py refactor(proxy): isolate memory rank policy (#1960) 2026-07-10 23:51:51 -05:00
test_memory_storage_router.py fix(memory): make explicit-project and user store keys collision-resistant (#2231) 2026-08-11 23:39:15 -05:00
test_memory_sync.py fix(memory/sync): don't clobber memories sharing a first line (#1976) 2026-07-10 11:47:31 -04: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_adapter_null_fields.py fix(proxy/memory): don't crash the memory tool adapter on a null function/arguments (#2270) 2026-07-16 14:37:27 -07: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 fix(memory): don't crash inline memory extraction on a non-object <memory> block (#2470) 2026-08-12 00:12:50 -05:00
test_mid_turn_steering.py fix(proxy): gate mid-turn message coalescing to Claude Code clients (#1643) 2026-08-11 23:36:39 -05:00
test_mixed_content_scan_cache.py perf: cut hot-path latency 27% (token-count memo, startup preloads, JSON scan memo) (#2838) 2026-08-06 17:47:40 -07:00
test_mixed_content_sections.py refactor(transforms): isolate mixed content parsing (#1939) 2026-07-10 19:28:21 -05:00
test_ml_model_registry_lifecycle.py feat: headroom wrap opencode / unwrap opencode CLI (#1105) 2026-06-22 11:07:12 -05:00
test_models.py fix(models): version-boundary longest-prefix match in ModelRegistry.get (#1658) 2026-07-10 23:07:31 -05:00
test_netcost_gate.py fix(router): stop counting an image's base64 payload as suffix tokens (#2778) 2026-08-04 11:31:52 -07:00
test_netcost_suffix_image_tokens.py fix(router): stop counting an image's base64 payload as suffix tokens (#2778) 2026-08-04 11:31:52 -07:00
test_network_diff_capture.py feat: add differential network capture harness (#761) 2026-06-08 22:18:31 -07:00
test_no_ccr_lossy.py feat(content-router): lossless-first dispatch, cross-turn dedup, and A7 lossy-after-fold (#1818) 2026-07-06 08:32:06 -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 fix(observability): aggregate tool savings in OTEL (#2936) 2026-08-11 22:54:55 -07:00
test_observability_tracing.py feat(observability): add gen_ai.request.model to the compression span (#1667) 2026-07-11 11:04:54 -05:00
test_observed_wire_shapes.py feat(cache): provider-agnostic cache-mode delta + cc-agnostic prefix comparison (#1868) 2026-07-08 13:29:35 -07:00
test_onnx_runtime.py fix(onnx): stop ONNX thread pools from spinning idle cores (#2495) (#2540) 2026-08-08 01:33:57 -05: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_chat_tool_desc_compaction.py fix(proxy/openai): run tool-description compaction on chat-completions (#2741) 2026-08-03 10:52:05 -07:00
test_openai_chat_turn_hooks.py fix(proxy/cost): record each request's savings exactly once (drop 3 double-counts) (#2545) 2026-07-24 20:40:44 -07:00
test_openai_codex_routing.py fix(proxy): offload OpenAI and Gemini tokenizer counting off the event loop (#2498) 2026-07-22 21:01:05 -07:00
test_openai_codex_ws_lifecycle.py fix(proxy): preserve merged session and quarantine contracts (#2943) 2026-08-12 12:27:05 -05:00
test_openai_codex_ws_timings.py fix(proxy): skip Responses memory tools for ChatGPT auth (#1579) 2026-07-15 20:52:01 +00:00
test_openai_max_completion_tokens.py fix(proxy): skip max_tokens rename for backend-routed openai chat (#2401) 2026-07-18 16:47:10 -07:00
test_openai_model_table_resolution.py fix(providers): stop a shorter model family shadowing a longer one (#2762) 2026-08-04 00:34:38 -07:00
test_openai_pricing_resolution.py refactor(pricing): make LiteLLM the source of truth, not the hardcoded table (#2779) 2026-08-04 11:32:26 -07:00
test_openai_response_cache_key.py fix(proxy/openai): cache under looked-up messages (#2420) 2026-07-19 11:45:41 -07:00
test_openai_responses_buffered_sse.py fix(proxy/openai): replay incremental events in buffered Responses SSE (#2410) (#2415) 2026-07-19 22:18:47 -07:00
test_openai_responses_compression_units.py fix(proxy): preserve content-part array structure in excluded-tool lossless fold write-back (#2261) 2026-07-16 13:51:34 -07:00
test_openai_responses_context_compaction.py fix(proxy/perf): count turn-hook message folds in token accounting (#2520) 2026-07-24 09:38:52 -07:00
test_openai_responses_null_arguments.py fix(proxy/openai): don't crash the Responses memory tool loops on null arguments (#2273) 2026-08-11 23:44:54 -05:00
test_openai_responses_output_shaper.py Wire OpenAI Responses output shaping (#1438) 2026-07-05 13:59:21 -07:00
test_openai_responses_t3_replay_regression.py Rename tool output compression parallelism env 2026-06-04 14:54:21 +10:00
test_openai_responses_traffic_learner.py fix(proxy/openai): feed Codex WS traffic into the traffic learner (#2334) 2026-08-11 23:54:41 -05:00
test_openai_streaming_backend.py fix(proxy): skip max_tokens rename for backend-routed openai chat (#2401) 2026-07-18 16:47:10 -07:00
test_openai_tool_search_deferral.py fix(openai): skip Responses tool-search deferral for clients that cannot execute it (#2696) 2026-08-08 01:32:54 -05:00
test_optional_dependencies.py fix(install): add orjson to [proxy] extra for LiteLLM provider backends (#2074) 2026-07-13 09:37:28 -04:00
test_outcome_dual_ruler_funnel.py fix(telemetry): stop mixing tokenizer scales in RequestOutcome, and fix the overhead framing (#2756) 2026-08-04 13:02:47 -07:00
test_outcome_records_5xx_as_failed.py fix(proxy): count exhausted upstream 5xx as failed across all providers (#1571) 2026-07-09 17:07:08 -05:00
test_outcome_token_scale.py fix(telemetry): stop mixing tokenizer scales in RequestOutcome, and fix the overhead framing (#2756) 2026-08-04 13:02:47 -07:00
test_output_effort_policy.py refactor(proxy): isolate output effort policy (#1961) 2026-07-10 23:53:00 -05:00
test_output_only_request_blocks.py fix: strip output-only fallback blocks from request messages (#1870) 2026-07-13 14:01:48 -04:00
test_output_savings.py Wire OpenAI Responses output shaping (#1438) 2026-07-05 13:59:21 -07:00
test_output_savings_cli.py feat: output-token reduction — verbosity shaper, per-user learning, counterfactual savings (#965) 2026-06-16 21:06:43 -07:00
test_output_savings_policy.py refactor(output): isolate savings policy (#1947) 2026-07-10 23:42:11 -05:00
test_output_shaper.py fix(proxy/openai): apply output shaping on /v1/chat/completions (#2328) 2026-07-17 16:16:29 -07:00
test_output_shaper_responses.py fix: replace computer_call_output with apply_patch_call_output in output_shaper (#2250) 2026-07-15 21:33:25 +00:00
test_output_shaping_rollup.py feat(stats): per-bucket output-shaping savings in /stats-history (#1819) 2026-07-15 19:58:24 +00:00
test_output_steering.py fix(proxy/output-shaping): tolerate a non-string system block text in steering (#2435) 2026-07-22 06:16:20 -07:00
test_output_turn_policy.py refactor(proxy): isolate output turn policy (#1962) 2026-07-11 21:33:48 -05:00
test_output_verbosity_policy.py refactor(proxy): isolate output verbosity policy (#1963) 2026-07-12 21:35:09 -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(version): mark source-checkout builds as -dev (#2072) 2026-07-13 09:38:17 -04:00
test_parser.py fix(agno): tolerate streaming tool-call SDK objects in parser (#1312) (#1336) 2026-06-24 09:52:15 -05:00
test_paths.py fix: remove rtk and lean-ctx CLI context tools (#2677) 2026-07-30 22:59:41 -07:00
test_paths_backward_compat.py fix(wrap): track shared proxy clients with markers (#877) 2026-06-11 19:42:43 -05:00
test_perl_scanner_safety.py fix(code): quarantine Perl parser from code-aware compression (#2204) 2026-07-14 20:18:51 -07:00
test_persistent_metrics.py feat(dashboard): persist lifetime proxy metrics (#2198) 2026-07-15 18:18:13 +00:00
test_persistent_metrics_integration.py feat(dashboard): persist lifetime proxy metrics (#2198) 2026-07-15 18:18:13 +00:00
test_persistent_metrics_persistence.py fix(proxy): repair main lint (ruff-format drift + mypy host_header) (#2268) 2026-07-15 23:18:50 -07:00
test_pid_alive.py fix: harden fd lifecycle and SystemError handling in runtime and proxy kill (#1556) 2026-07-16 13:51:03 -07:00
test_pipeline.py test: apply linux ruff formatting 2026-04-23 08:49:50 -05:00
test_platform_feature_matrix.py fix: harden persistent install startup (#1851) 2026-07-10 00:40:34 -04:00
test_platform_stabilization_functional.py fix(proxy): time-cap the compression timeout-debt quarantine (#2360) (#2412) 2026-08-12 00:05:56 -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 fix(ccr): make headroom_retrieve a hash-only full-content lookup (#1532) 2026-06-28 10:32:43 -07: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 feat(pricing): add DeepSeek V4 model pricing (deepseek-v4-flash, deepseek-v4-pro) (#1168) 2026-06-24 09:44:27 -05:00
test_pricing_cache_ttl.py feat(cli,pricing): add CLI extension seam and prompt-cache TTL pricing (#2802) 2026-08-05 12:24:49 -07:00
test_pricing_from_litellm.py refactor(pricing): make LiteLLM the source of truth, not the hardcoded table (#2779) 2026-08-04 11:32:26 -07:00
test_pricing_litellm.py fix(pricing): resolve MiniMax-M3 (provider prefix + pre-registration) (#1186) 2026-06-30 08:36:36 -05:00
test_pricing_litellm_model_resolution.py fix: Vertex model pricing shows $0.00 for versioned model names and vertex:anthropic provider (#2517) 2026-08-11 23:03:09 -05:00
test_probe_recorder.py feat: probe-based retention scoring of recorded compression events (#862) 2026-06-11 13:02:36 -05:00
test_project_name_policy.py Extract project name policy (#1974) 2026-07-11 10:26:20 -05:00
test_project_policy.py refactor(proxy): isolate project attribution policy (#1957) 2026-07-10 23:50:27 -05:00
test_prometheus_label_escaping.py fix(proxy/metrics): escape label values in the Prometheus export (#2463) 2026-08-12 00:11:06 -05:00
test_prometheus_obs_counters.py fix(proxy): quarantine compression while timed-out workers run (#2292) 2026-07-16 14:30:06 -07: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_claude_vscode_config.py feat(claude): support Claude Code in VS Code (#2752) 2026-08-03 20:14:13 -07:00
test_provider_cloudcode_runtime.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -05:00
test_provider_codex_endpoints.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -05:00
test_provider_codex_headers.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -05:00
test_provider_codex_images.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -05: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_model_metadata.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -05:00
test_provider_codex_responses.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -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_codex_threads.py fix(codex): discover updated Codex state stores (#1889) 2026-07-08 15:21:21 -07:00
test_provider_copilot_vscode_config.py feat(copilot): proxy VS Code models transparently (#2687) 2026-08-03 04:42:48 -07:00
test_provider_copilot_wrap.py fix(wrap): honor Copilot OAuth wire-api override and model default (#2387) 2026-08-12 00:04:42 -05:00
test_provider_cortex_code.py feat(providers): add Cortex Code (Snowflake CoCo) as a supported agent (#1190) 2026-06-21 22:18:47 -07:00
test_provider_counter_content_blocks.py fix(providers): stop pricing modern content blocks at zero (#2760) 2026-08-03 22:40:38 -07: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_display_classification.py feat(proxy): show real upstream provider on dashboard for OpenAI-compatible endpoints (#1594) 2026-07-15 19:09:56 +00:00
test_provider_grok.py fix(grok): preserve business-seat auth while routing only inference (#2514) 2026-07-23 15:43:03 -07:00
test_provider_grok_build.py feat(grok-build): add Grok Build wrap command and MCP integration (#1629) 2026-07-15 20:51:52 +00:00
test_provider_model_fallback.py fix(providers): stop a shorter model family shadowing a longer one (#2762) 2026-08-04 00:34:38 -07:00
test_provider_model_metadata.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -05:00
test_provider_openai_images.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -05:00
test_provider_openai_responses.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -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 fix(codex): route alpha search through the Codex backend (#2538) 2026-08-12 00:22:20 -05:00
test_provider_proxy_targets.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -05:00
test_provider_registry.py fix(proxy): dedupe Codex WS request logging for accurate mixed-provider dashboards (#2189) 2026-07-15 18:18:34 +00:00
test_provider_registry_extended.py fix(bedrock): route ARNs via converse, named AWS profiles, and au. re… (#1456) 2026-07-02 22:51:05 -05:00
test_provider_route_specs.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -05:00
test_provider_tokenizer_one_ruler.py fix(providers): give every model exactly one tokenizer (#2761) 2026-08-03 23:46:27 -07:00
test_provider_vertex_runtime.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -05:00
test_providers_opencode_config.py fix(opencode): keep Claude models off OpenAI provider 2026-08-11 09:46:03 -07:00
test_providers_opencode_install.py fix(opencode): write local MCP config (#1381) 2026-06-26 12:23:54 -05:00
test_providers_opencode_plugin_path.py fix(opencode): ship the transport hook-shim so wheel installs route Node child traffic 2026-08-11 09:10:38 -07:00
test_proxy_anthropic_cache_stability.py fix(proxy): compress cache-mode cold starts and tag prefix-mismatch passthrough (#2365) 2026-08-11 23:55:11 -05: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_anthropic_model_sanitization.py fix(proxy): strip 1m model suffix before upstream forwarding (#1840) 2026-07-06 08:33:45 -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(proxy): preserve signed Anthropic thinking blocks on outbound re-serialize (#2254) 2026-08-11 23:48:56 -05:00
test_proxy_cache_telemetry.py feat(telemetry): record provider cache read/write/uncached tokens per request (#2450) 2026-07-20 11:02:57 -07:00
test_proxy_cache_ttl_metrics.py fix(proxy/cost): price cache savings by most-used model, not first-seen (#2023) 2026-07-13 09:37:58 -04:00
test_proxy_ccr.py fix(ccr): make headroom_retrieve a hash-only full-content lookup (#1532) 2026-06-28 10:32:43 -07:00
test_proxy_codex_route_aliases.py fix(proxy): stamp X-Client: codex on Responses endpoint for unidentified callers (#1036) 2026-06-17 11:45:20 -05:00
test_proxy_compress_endpoint.py fix(ccr): report embedded hashes from compress endpoint (#717) 2026-08-11 23:27:49 -05:00
test_proxy_compression_executor.py fix(proxy): quarantine compression while timed-out workers run (#2292) 2026-07-16 14:30:06 -07:00
test_proxy_compression_headers.py fix(proxy): strip inbound Content-Encoding on messages/chat forward (#1970) 2026-07-10 11:45:58 -04:00
test_proxy_config_qdrant_port.py fix(proxy): fail soft on a bad HEADROOM_QDRANT_PORT during config construction (#2141) 2026-07-14 01:42:15 -04:00
test_proxy_config_rate_limit.py fix(proxy): reject rate_limit_requests_per_minute=0 when limiting is enabled (#2142) 2026-07-14 12:14:06 -04:00
test_proxy_copilot_auth_hooks.py fix(proxy): close the upstream stream when a streaming body is never consumed 2026-08-11 18:16:04 -07:00
test_proxy_cors.py fix(proxy): scope CORS to loopback + gate operator/content endpoints (#1226) 2026-06-21 00:50:55 -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: remove rtk and lean-ctx CLI context tools (#2677) 2026-07-30 22:59:41 -07:00
test_proxy_debug_endpoints.py fix(proxy/debug): reconcile Kompress warmup state in /debug/warmup (#2711) 2026-08-02 13:15:01 -07:00
test_proxy_disable_kompress.py feat: add --disable-kompress-fallback to restore legacy PASSTHROUGH fallback (#1185) 2026-06-22 22:51:55 -05:00
test_proxy_eager_preload_bind.py perf: cut hot-path latency 27% (token-count memo, startup preloads, JSON scan memo) (#2838) 2026-08-06 17:47:40 -07:00
test_proxy_extensions.py fix(proxy): one bad extension no longer aborts proxy startup (#2215) 2026-07-14 22:50:03 -07:00
test_proxy_favicon_route.py fix(proxy): serve /favicon.ico locally instead of tunneling upstream (#1787) (#1847) 2026-07-07 23:36:10 -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(memory): make explicit-project and user store keys collision-resistant (#2231) 2026-08-11 23:39:15 -05:00
test_proxy_handlers_batch.py fix(proxy/batch): don't crash an OpenAI batch on a valid-JSON non-object line (#2316) 2026-08-11 23:47:09 -05:00
test_proxy_hardening.py feat(proxy): pilot hardening — inbound auth, security headers, audit log, air-gap switch (#1537) 2026-06-28 12:09:00 -07:00
test_proxy_health.py fix(health): label kompress as degraded/optional when not yet loaded (#2865) 2026-08-11 23:35:28 -05:00
test_proxy_healthchecks.py fix(docker): report source build version (#1862) 2026-07-08 13:32:04 -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_loop_exception_health.py fix(proxy): surface codex websocket loop failures in livez (#1727) 2026-07-03 13:33:55 -07:00
test_proxy_loopback_gating.py fix(proxy): allow settings routes for trusted gateway/dashboard clients (#2491) 2026-08-11 23:05:22 -05: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_mode_policy.py refactor(proxy): isolate proxy mode policy (#1965) 2026-07-11 00:00:03 -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.py fix(openai): skip Responses tool-search deferral for clients that cannot execute it (#2696) 2026-08-08 01:32:54 -05:00
test_proxy_openai_cache_key_integration.py fix(proxy): include system/tools/sampling in cache key (#1473) 2026-06-30 16:29:20 -05:00
test_proxy_openai_cache_stability.py fix(proxy): compress OpenCode tool schemas and embedded JSON (#1535) 2026-07-15 19:58:42 +00: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: remove rtk and lean-ctx CLI context tools (#2677) 2026-07-30 22:59:41 -07:00
test_proxy_openai_responses_stream_ccr.py fix(proxy): preserve chatgpt responses streaming (#2012) 2026-07-11 00:10:02 -05: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.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -05:00
test_proxy_passthrough_integration.py fix(proxy): allow HEAD method on catch-all passthrough route (#2035) 2026-07-12 13:54:58 -04:00
test_proxy_passthrough_transient_retry.py fix(proxy): retry passthrough on transient upstream connection close (#1513) 2026-07-06 18:35:39 -05:00
test_proxy_per_provider_kompress.py feat(proxy): per-provider Kompress enable/disable (#1119) 2026-06-22 15:07:10 -05:00
test_proxy_pipeline_lifecycle.py fix(proxy): cancel retry backoff on shutdown (#1834) 2026-07-06 06:24:47 -07:00
test_proxy_project_savings.py test: align savings schema assertions 2026-07-15 15:15:24 -05:00
test_proxy_request_scope.py refactor(providers): split proxy route adapters (#1934) 2026-07-12 16:27:45 -05:00
test_proxy_retry_429.py fix(proxy): cancel retry backoff on shutdown (#1834) 2026-07-06 06:24:47 -07:00
test_proxy_savings_history.py feat(code): add PHP support to CodeAwareCompressor (#2423) 2026-07-31 15:54:13 -07:00
test_proxy_scalability.py fix(proxy): support Windows selector loop on uvicorn < 0.36 (#1655) 2026-07-14 01:42:25 -04:00
test_proxy_semantic_cache_key.py fix(proxy): include system/tools/sampling in cache key (#1473) 2026-06-30 16:29:20 -05:00
test_proxy_semantic_cache_key_integration.py fix(proxy): include system/tools/sampling in cache key (#1473) 2026-06-30 16:29:20 -05:00
test_proxy_semantic_cache_key_policy.py refactor(cache): isolate semantic key policy (#1953) 2026-07-10 23:49:27 -05:00
test_proxy_settings_endpoints.py fix(settings): accept documented HEADROOM_* env names as settings keys (#2833) 2026-08-11 17:22:27 -05:00
test_proxy_stats_recent_requests.py fix: remove rtk and lean-ctx CLI context tools (#2677) 2026-07-30 22:59:41 -07:00
test_proxy_streaming_ratelimit_headers.py fix(proxy): close the upstream stream when a streaming body is never consumed 2026-08-11 18:16:04 -07:00
test_proxy_streaming_request_logger.py fix(stats): tag streamed output token source (#2214) 2026-07-15 18:17:24 +00: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 fix(proxy): cancel periodic TOIN task on shutdown 2026-08-11 09:49:07 -07:00
test_proxy_warmup.py fix: align docs and prune dead compatibility surfaces 2026-05-09 14:07:59 -07:00
test_python_forwarder_mode_policy.py Extract Python forwarder mode policy (#1987) 2026-07-11 00:06:37 -05:00
test_quality_retention.py feat(rust): SmartCrusher PR4 — lossless-first default + CCR-Dropped restoration 2026-04-27 16:30:22 -07:00
test_query_log_policy.py Extract query log policy (#1984) 2026-07-12 12:18:01 -04:00
test_quota_registry.py chore: renormalize line endings to LF 2026-04-24 15:33:30 +02:00
test_rate_limit_policy.py refactor(proxy): isolate rate limit policy (#1954) 2026-07-10 23:47:33 -05:00
test_read_maturation.py feat(read-maturation): activity-based hold-back Read maturation (Mechanism B) (#1068) 2026-06-22 22:52:42 -05:00
test_read_maturation_handler_nobust.py feat(read-maturation): activity-based hold-back Read maturation (Mechanism B) (#1068) 2026-06-22 22:52:42 -05:00
test_realignment_live_multi_turn.py fix(security): allowlist GitGuardian-flagged test fixtures 2026-05-02 18:33:22 -07:00
test_recursive_json.py feat(router): route embedded & nested JSON through the compressor dispatch (#2623) 2026-07-27 20:52:18 -07:00
test_release_version.py fix(windows): pin UTF-8 encoding on text-mode subprocess calls (#1311) 2026-06-23 12:52:49 -05:00
test_release_workflows.py fix: publish headroom-opencode in release workflow (#2372) 2026-08-11 23:56:40 -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_relevance_split.py feat(content-router): lossless-first dispatch, cross-turn dedup, and A7 lossy-after-fold (#1818) 2026-07-06 08:32:06 -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_limit_policy.py Extract request limit policy (#1982) 2026-07-10 23:55:11 -05:00
test_request_log_redaction_policy.py Extract request log redaction policy (#1968) 2026-07-10 06:43:04 -07:00
test_request_outcome.py fix(proxy): emit request log timestamps in UTC 2026-08-11 09:53:53 -07:00
test_request_scope_no_fastapi.py fix(proxy): allow request_scope import without fastapi (#2562) 2026-07-25 14:17:40 -07:00
test_reread_attribution.py feat: attribute reread waste to over-compression via marker check (#901) 2026-06-13 10:43:35 -05:00
test_responses_cross_turn_dedup.py fix(proxy): protect WebSearch/WebFetch tool results from lossy compression (#2115) 2026-07-14 11:52:26 -04: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_retry_preserve_upstream_status.py fix(proxy): preserve upstream 5xx status on retry exhaustion (#1570) 2026-07-09 17:07:26 -05:00
test_route_advice.py Per-request backend selection for routing extensions (#2809) 2026-08-05 17:01:32 -07:00
test_router_external_dispatch.py feat(proxy): route selected external compressors through the content router (#2388) 2026-07-18 10:02:10 -07:00
test_router_registry_dispatch.py fix(router): compare token quantities in one unit (#2759) 2026-08-03 22:49:47 -07:00
test_router_registry_smartcrusher.py feat(transforms): dispatch kompress/text via the compressor registry + forward question (#2411) 2026-07-18 22:03:53 -07:00
test_runtime_env.py feat(proxy): hot-reload live env knobs so a reused proxy picks them up without a restart (#1090) 2026-06-18 09:50:50 -07:00
test_rust_core_smoke.py fix: A0 — fail-loud rust core deployment smoke test 2026-05-02 17:52:37 -07:00
test_savings_ledger.py fix(savings): don't bill free models at the $3/M fallback in the ledger (#2147) 2026-07-14 12:19:30 -04:00
test_savings_ledger_before_forwarded.py fix(observability): aggregate tool savings in OTEL (#2936) 2026-08-11 22:54:55 -07:00
test_savings_ledger_offload.py fix(proxy/metrics): move the savings-ledger append off the event loop (#2439) 2026-07-20 11:01:34 -07:00
test_savings_tool_search_aggregation.py feat(proxy/savings): aggregate tool-schema savings into Metrics + all reporting sinks (#2546) 2026-07-24 20:40:46 -07:00
test_savings_tracker_litellm_resolution_cache.py fix(proxy): cache litellm model resolution to stop repeated Provider List spam 2026-08-11 09:55:24 -07:00
test_savings_tracker_zero_price.py fix(savings): don't fabricate output savings for a free (zero-priced) model (#2298) 2026-07-16 14:35:57 -07:00
test_search_compressor.py fix: improve error handling and add comprehensive test coverage 2026-01-27 16:08:36 -08:00
test_search_compressor_cjk.py fix(search-compressor): CJK-aware relevance + harden Rust/Python parity (#1749) 2026-07-09 17:00:30 -05:00
test_security_validations.py Fix security vulnerabilities in memory and CCR systems 2026-02-04 12:05:50 -08:00
test_semantic_cache_key_policy.py refactor(proxy): isolate semantic cache key policy (#1964) 2026-07-11 21:35:52 -05:00
test_semantic_canonicalize.py feat(cache): provider-agnostic cache-mode delta + cc-agnostic prefix comparison (#1868) 2026-07-08 13:29:35 -07: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 fix(shared_context): don't evict an unrelated entry on an update at capacity (#2136) 2026-07-13 19:57:32 -04: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.py fix(compression): honor qualified CCR names across integrations (#2698) 2026-08-03 20:17:39 -07:00
test_smart_crusher_toin_attachment.py fix(smart-crusher): honor enable_ccr_marker on the opaque-blob path (#1130) 2026-06-22 11:11:46 -05: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_byte_buffer_policy.py Extract SSE byte buffer policy (#1979) 2026-07-12 11:46:36 -04:00
test_sse_thinking_blocks.py fix(proxy/streaming): tolerate malformed content in _response_to_sse (#2481) 2026-07-22 06:11:00 -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(tls): add HEADROOM_TLS_STRICT=0 toggle for corporate SSL inspection (#1308) (#1341) 2026-06-24 09:51:30 -05: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_stateless_toin.py feat(security): pilot hardening — stateless guarantee, model pinning, CI security gate (#1515) 2026-06-27 17:44:10 -07:00
test_stateless_writers.py feat(security): pilot hardening — stateless guarantee, model pinning, CI security gate (#1515) 2026-06-27 17:44:10 -07:00
test_stats_new_input_savings_rate.py feat(proxy): report new-content-relative input savings rate in /stats (#2058) 2026-07-12 18:48:19 -04: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_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_subprocess_encoding.py fix: remove rtk and lean-ctx CLI context tools (#2677) 2026-07-30 22:59:41 -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_contribution.py fix(subscription): keep efficiency_pct from exceeding 100% (#2121) 2026-07-14 11:53:13 -04:00
test_subscription_session_tracking.py fix(subscription): dedup transcript usage by message id (#2340 token inflation) (#2408) 2026-08-12 00:05:04 -05:00
test_subscription_tracker.py fix: remove rtk and lean-ctx CLI context tools (#2677) 2026-07-30 22:59:41 -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_system_compaction.py feat: 3-layer context compression pipeline (L1+L2+L3) (#1405) 2026-07-15 19:58:51 +00: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 chore(telemetry): remove Supabase anonymous beacon; fix contact domain to headroomlabs.ai (#1526) 2026-06-27 22:48:26 -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 fix(telemetry): anonymous compression stats — no prompts, no data (#2728) 2026-08-03 05:43:25 -07:00
test_testing_harness.py test: add fluent Headroom harness (#2650) 2026-07-29 09:17:25 -07: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(ccr): make headroom_retrieve a hash-only full-content lookup (#1532) 2026-06-28 10:32:43 -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(toin): publish skip compression recommendations (#1782) 2026-07-07 23:14:54 -05:00
test_toin_retention.py fix(toin): bound private query and pattern retention 2026-08-11 16:10:39 -07:00
test_token_count_cache.py perf: cut hot-path latency 27% (token-count memo, startup preloads, JSON scan memo) (#2838) 2026-08-06 17:47:40 -07:00
test_token_headroom_mode.py fix(cache): extract tool_result content from list-of-blocks format (#2092) 2026-07-13 23:51:01 -04:00
test_tokenizer.py fix(tokenizers): price Claude against a real BPE (tiktoken o200k) not a char estimate (#2543) 2026-07-24 15:06:43 -07:00
test_tokenizer_count_offload.py fix(proxy): preserve merged session and quarantine contracts (#2943) 2026-08-12 12:27:05 -05:00
test_tokenizer_encoding_resolution.py fix(tokenizers): resolve gpt-5 and mixed-case model names to the right encoding (#2776) 2026-08-04 11:31:16 -07:00
test_tokenizer_selection_coverage.py fix(tokenizers): count HuggingFace chat templates, and resolve gpt-5 / gateway-wrapped names (#2758) 2026-08-03 22:28:06 -07:00
test_tokenizers.py fix(tokenizers): price Claude against a real BPE (tiktoken o200k) not a char estimate (#2543) 2026-07-24 15:06:43 -07:00
test_tool_call_arguments_not_a_string.py fix(tokenizer): coerce non-string tool_call fields before counting (#2801) 2026-08-05 08:32:14 -07:00
test_tool_definition_serialization.py refactor(proxy): extract tool definition serialization (#1998) 2026-07-15 18:36:52 +00:00
test_tool_injection_config.py refactor(proxy): extract tool injection config (#2010) 2026-07-11 00:03:15 -05:00
test_tool_injection_logging.py refactor(proxy): extract tool injection logging (#2009) 2026-07-12 12:11:28 -04:00
test_tool_injection_policy.py refactor(proxy): extract tool injection policy (#1995) 2026-07-12 12:09:07 -04:00
test_tool_injection_tracker.py refactor(proxy): extract tool injection tracker (#2002) 2026-07-12 11:48:33 -04:00
test_tool_name_policy.py refactor(proxy): extract tool name policy (#2008) 2026-07-12 11:54:09 -04:00
test_tool_result_interceptors.py fix(proxy): register interceptor in explicit transforms list when HEADROOM_INTERCEPT_ENABLED (#1376) 2026-06-24 20:58:02 -05:00
test_tool_schema_compaction.py feat: 3-layer context compression pipeline (L1+L2+L3) (#1405) 2026-07-15 19:58:51 +00:00
test_tool_schema_savings_policy.py fix(stats): report one "Tokens Saved" headline across every harness (#2737) 2026-08-03 09:03:54 -07:00
test_transforms_config_compressor.py feat(config): fold TOML array-of-tables to csv-schema via SmartCrusher (#1799) 2026-07-15 19:58:27 +00:00
test_transforms_content_detection.py feat(cache): provider-agnostic cache-mode delta + cc-agnostic prefix comparison (#1868) 2026-07-08 13:29:35 -07:00
test_transforms_content_router.py fix(transforms): stop ContentRouter recompressing headroom_retrieve results (#2654) 2026-08-03 20:17:06 -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_transforms_stack_traces.py feat(transforms): language-aware stack-trace collapse for Go/Rust/.NET/Java/Node (#1791) 2026-07-15 19:58:30 +00:00
test_transforms_tabular.py fix(transforms): pass through ragged tables instead of misaligning columns (#1713) 2026-07-07 12:45:46 -05:00
test_turn_hook_usage.py fix(proxy/openai): run response hooks on Responses, and bill their re-drives (#2872) 2026-08-09 10:09:24 -07:00
test_turn_hooks.py feat(proxy/hooks): run fold-only (stream-safe) turn hooks on streaming OpenAI chat (#2549) 2026-07-24 21:13:39 -07:00
test_update_check.py feat(cli): add headroom update command and release banner (#1088) 2026-06-18 11:22:20 -05:00
test_update_helpers.py fix(cli/update): let install ownership win over bare /.dockerenv so venv installs self-update (#2830) 2026-08-11 17:23:29 -05:00
test_usage_reporter_snapshot.py fix(telemetry): only advance usage-report baseline after a 200 (#2149) 2026-07-14 12:19:43 -04:00
test_utils.py test: add missing type hints to FakeProvider in test_utils (#631) 2026-06-10 21:15:16 -05:00
test_verbosity_controller.py feat: output-token reduction — verbosity shaper, per-user learning, counterfactual savings (#965) 2026-06-16 21:06:43 -07:00
test_verbosity_learn.py fix(learn): don't desync verbosity pairing on empty assistant turns (#2123) 2026-07-14 12:04:32 -04:00
test_vertex_claude_compression.py fix(proxy/vertex): route google-publisher requests to the request region (#2069) 2026-07-13 00:46:25 -04:00
test_websearch_tool_result_protection.py fix(proxy): protect WebSearch/WebFetch tool results from lossy compression (#2115) 2026-07-14 11:52:26 -04:00
test_wire_debug_format_policy.py Extract wire debug format policy (#1978) 2026-07-12 12:17:18 -04:00
test_wire_debug_redaction_policy.py Extract wire debug redaction policy (#1972) 2026-07-11 21:36:46 -05:00
test_wrap_code_memory.py fix(wrap/serena): stop creating serena_config.yml, unbricking Serena on fresh installs (#2676) 2026-07-30 20:55:47 -07:00
test_wrap_quiet_cli.py feat(wrap): reduce-at-source — SAFE quiet-CLI env defaults for the launched agent (#2548) 2026-07-24 20:40:52 -07:00
test_ws_http_fallback.py fix(proxy): skip Responses memory tools for ChatGPT auth (#1579) 2026-07-15 20:52:01 +00: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