JD Davis
b88b9078d8
chore: release 0.36.0 ( #3067 )
...
🤖 I have created a release *beep* *boop*
---
##
[0.36.0](https://github.com/headroomlabs-ai/headroom/compare/v0.35.0...v0.36.0 )
(2026-08-20)
### Features
* add deterministic runtime rollout controls
([#1490 ](https://github.com/headroomlabs-ai/headroom/issues/1490 ))
([3077ac8 ](3077ac81e8 ))
* **proxy:** let extensions report cost savings and their own latency
([#3051 ](https://github.com/headroomlabs-ai/headroom/issues/3051 ))
([f9807fd ](f9807fd69e ))
* **proxy:** unify savings attribution across stats, perf, metrics, and
dashboard
([1b0b0b8 ](1b0b0b89a4 )),
closes [#2976 ](https://github.com/headroomlabs-ai/headroom/issues/2976 )
* **wrap/claude:** make the --1m fallback model configurable via
HEADROOM_1M_MODEL
([#2983 ](https://github.com/headroomlabs-ai/headroom/issues/2983 ))
([2a84725 ](2a8472525d ))
### Bug Fixes
* **anthropic:** honor the [1m] 1M-context tier, and price it correctly
([#3073 ](https://github.com/headroomlabs-ai/headroom/issues/3073 ))
([6d2254d ](6d2254dfb5 ))
* **ccr:** make --no-ccr disable server-side response handling too
([#3101 ](https://github.com/headroomlabs-ai/headroom/issues/3101 ))
([131b119 ](131b119c05 )),
closes [#3082 ](https://github.com/headroomlabs-ai/headroom/issues/3082 )
* **ccr:** make StreamingCCRHandler work on OpenAI streams
([#3069 ](https://github.com/headroomlabs-ai/headroom/issues/3069 ))
([7ef736f ](7ef736fb1a ))
* **ccr:** only buffer a stream when a marker is actually redeemable
([#3092 ](https://github.com/headroomlabs-ai/headroom/issues/3092 ))
([c502087 ](c502087db7 ))
* **ccr:** re-inject headroom_retrieve when history references it on the
sessionless path
([942af56 ](942af56f11 ))
* **ccr:** relay a successful upstream turn when post-processing fails
([#3094 ](https://github.com/headroomlabs-ai/headroom/issues/3094 ))
([0ec73fa ](0ec73faa28 ))
* **ccr:** send Accept: application/json on a buffered stream:false turn
([#3102 ](https://github.com/headroomlabs-ai/headroom/issues/3102 ))
([139c7cb ](139c7cbdde )),
closes [#3078 ](https://github.com/headroomlabs-ai/headroom/issues/3078 )
* **ccr:** verify a scanned marker's hash before advertising it
([#2908 ](https://github.com/headroomlabs-ai/headroom/issues/2908 ))
([41dab2d ](41dab2d099 ))
* **ci:** prevent native detector from hanging test shards
([#2996 ](https://github.com/headroomlabs-ai/headroom/issues/2996 ))
([a708c05 ](a708c0571e ))
* **ci:** scope the release credential and stop persisting it to disk
([#3062 ](https://github.com/headroomlabs-ai/headroom/issues/3062 ))
([ac8646a ](ac8646aa3c ))
* **ci:** unjam release and Docker publishing
([#2958 ](https://github.com/headroomlabs-ai/headroom/issues/2958 ))
([e269afb ](e269afb935 ))
* **claude:** reject conflicting auth before proxy startup
([#2993 ](https://github.com/headroomlabs-ai/headroom/issues/2993 ))
([2d88e31 ](2d88e31a40 ))
* **cli/install:** resolve the deployment profile instead of dead-ending
on default
([#2832 ](https://github.com/headroomlabs-ai/headroom/issues/2832 ))
([8252619 ](82526191a1 ))
* **cli:** stop the macOS malloc re-exec replacing an embedder's process
([#3064 ](https://github.com/headroomlabs-ai/headroom/issues/3064 ))
([96c25f5 ](96c25f5181 ))
* **copilot:** route VS Code inline completions to Copilot, not OpenAI
([#3077 ](https://github.com/headroomlabs-ai/headroom/issues/3077 ))
([204e751 ](204e751d2f ))
* **copilot:** send VS Code inline completions to the host that serves
them ([#3112 ](https://github.com/headroomlabs-ai/headroom/issues/3112 ))
([b77d612 ](b77d612913 ))
* **deps:** bump datasets past PYSEC-2026-3716
([#3136 ](https://github.com/headroomlabs-ai/headroom/issues/3136 ))
([df6ff6b ](df6ff6bd5b ))
* **deps:** clear the two Rust advisories and make cargo audit blocking
([#3121 ](https://github.com/headroomlabs-ai/headroom/issues/3121 ))
([93c474e ](93c474e84b ))
* **deps:** raise the GitPython floor to 3.1.58 to clear 9 open
advisories
([#3120 ](https://github.com/headroomlabs-ai/headroom/issues/3120 ))
([8156d4d ](8156d4dc3a ))
* **docker:** publish compose ports on loopback only
([#3061 ](https://github.com/headroomlabs-ai/headroom/issues/3061 ))
([481e0b8 ](481e0b83d5 ))
* **docker:** ship Bedrock auth and current registry
([#2982 ](https://github.com/headroomlabs-ai/headroom/issues/2982 ))
([eafdf11 ](eafdf11a2c ))
* **doctor:** surface that Claude Desktop agent sessions bypass the
proxy ([#2987 ](https://github.com/headroomlabs-ai/headroom/issues/2987 ))
([be5b26d ](be5b26d807 ))
* **install:** consolidate Windows fallback and cleanup safety
([#2980 ](https://github.com/headroomlabs-ai/headroom/issues/2980 ))
([ddd2a25 ](ddd2a259ec ))
* **install:** honor HEADROOM_PORT in install apply and deploy
([#3085 ](https://github.com/headroomlabs-ai/headroom/issues/3085 ))
([58f28dc ](58f28dc7a6 ))
* **install:** stop the PowerShell installer leaking temp dirs into the
real user PATH
([#2985 ](https://github.com/headroomlabs-ai/headroom/issues/2985 ))
([ddd9f76 ](ddd9f76729 ))
* **learn:** include stdout in CLI failure messages, not just stderr
([#3080 ](https://github.com/headroomlabs-ai/headroom/issues/3080 ))
([c5563d3 ](c5563d3a7d ))
* **mcp:** restore SDK v1 compatibility cap
([#2978 ](https://github.com/headroomlabs-ai/headroom/issues/2978 ))
([6077e5a ](6077e5a149 ))
* **memory:** sanitize entity_refs to prevent dict-shaped entries
crashing search
([#2951 ](https://github.com/headroomlabs-ai/headroom/issues/2951 ))
([2d1e96b ](2d1e96b85c ))
* **onnx:** enforce Rust API-24 runtime compatibility
([#2979 ](https://github.com/headroomlabs-ai/headroom/issues/2979 ))
([a3fe5cb ](a3fe5cb65b ))
* **openclaw-plugin:** circuit breaker + per-request timeout for proxy
resilience
([#639 ](https://github.com/headroomlabs-ai/headroom/issues/639 ))
([6576ef6 ](6576ef639c ))
* **opencode:** send x-headroom-project header on all proxied requests
([#2868 ](https://github.com/headroomlabs-ai/headroom/issues/2868 ))
([eeb038b ](eeb038bc0c ))
* **policy:** price net-cost mutations with the 1h cache-write tier
([#2780 ](https://github.com/headroomlabs-ai/headroom/issues/2780 ))
([ef7e07e ](ef7e07e0f5 ))
* **providers:** don't crash on a non-object HEADROOM_MODEL_LIMITS /
models.json
([#3089 ](https://github.com/headroomlabs-ai/headroom/issues/3089 ))
([3ed8f76 ](3ed8f76019 ))
* **proxy/anthropic:** don't buffer a CCR stream when passthrough
discards the stream flip
([#2953 ](https://github.com/headroomlabs-ai/headroom/issues/2953 ))
([f1c34d3 ](f1c34d336c ))
* **proxy/anthropic:** don't replay recorded prefix over live history
([#3026 ](https://github.com/headroomlabs-ai/headroom/issues/3026 ))
([#3052 ](https://github.com/headroomlabs-ai/headroom/issues/3052 ))
([c16be9b ](c16be9bbbe ))
* **proxy/anthropic:** repair headroom_retrieve history references the
tools array cannot support
([#2876 ](https://github.com/headroomlabs-ai/headroom/issues/2876 ))
([7de3573 ](7de35739c6 ))
* **proxy/anthropic:** stop answering a non-streaming turn with an event
stream
([#3142 ](https://github.com/headroomlabs-ai/headroom/issues/3142 ))
([0e26fb8 ](0e26fb80de ))
* **proxy/cache:** strip cache_control from messages in the semantic
cache key
([#3086 ](https://github.com/headroomlabs-ai/headroom/issues/3086 ))
([2cae0f8 ](2cae0f8eaf ))
* **proxy/gemini:** guard CCR continuation usage against present-null
counts
([#3035 ](https://github.com/headroomlabs-ai/headroom/issues/3035 ))
([a01897c ](a01897c791 ))
* **proxy/openai:** propagate provider usage on the Responses
WS->HTTP fallback
([#2988 ](https://github.com/headroomlabs-ai/headroom/issues/2988 ))
([536c949 ](536c949a69 ))
* **proxy:** adapt 200 SSE upstream replies on buffered /v1/responses
instead of 502
([#2622 ](https://github.com/headroomlabs-ai/headroom/issues/2622 ))
([d76fce0 ](d76fce04a3 ))
* **proxy:** align signed-thinking wire accounting
([#3015 ](https://github.com/headroomlabs-ai/headroom/issues/3015 ))
([b3f4436 ](b3f443636d ))
* **proxy:** complete stateless Responses and buffered CCR lifecycle
([#2997 ](https://github.com/headroomlabs-ai/headroom/issues/2997 ))
([8a1d38b ](8a1d38bc5d ))
* **proxy:** guard feedback endpoints and add CSRF checks to loopback
writes
([#3060 ](https://github.com/headroomlabs-ai/headroom/issues/3060 ))
([a6ab359 ](a6ab359a5d ))
* **proxy:** keep prefixed core tools resident
([#3046 ](https://github.com/headroomlabs-ai/headroom/issues/3046 ))
([2f4d001 ](2f4d001c9f ))
* **proxy:** preserve Codex WebSocket model attribution
([#3029 ](https://github.com/headroomlabs-ai/headroom/issues/3029 ))
([a06a51e ](a06a51eca6 ))
* **proxy:** relocate stray system-role messages to the top-level system
param ([#765 ](https://github.com/headroomlabs-ai/headroom/issues/765 ))
([#1357 ](https://github.com/headroomlabs-ai/headroom/issues/1357 ))
([9fde127 ](9fde127534 ))
* **proxy:** restore the buffered-CCR heartbeat behind a grace window
([#3091 ](https://github.com/headroomlabs-ai/headroom/issues/3091 ))
([a29d201 ](a29d2015e5 ))
* **proxy:** scope the signed-thinking lock to blocks that actually
changed
([#3124 ](https://github.com/headroomlabs-ai/headroom/issues/3124 ))
([17522fb ](17522fb0a1 ))
* **proxy:** stop a lone surrogate turning a thinking body into a 500
([#3134 ](https://github.com/headroomlabs-ai/headroom/issues/3134 ))
([284ff31 ](284ff31947 ))
* **proxy:** stop cached responses replaying the producing turn's wire
framing
([#3024 ](https://github.com/headroomlabs-ai/headroom/issues/3024 ))
([9d37059 ](9d370592b0 ))
* **proxy:** stop operator secrets following a client-chosen upstream
([#3122 ](https://github.com/headroomlabs-ai/headroom/issues/3122 ))
([05f5ef4 ](05f5ef47cb ))
* **proxy:** tune macOS libmalloc and trim allocator pages so long-lived
RSS stays bounded
([#2879 ](https://github.com/headroomlabs-ai/headroom/issues/2879 ))
([6d87825 ](6d87825f62 ))
* **reporting:** show net vs gross savings, real skip thresholds, and
the effective profile
([#3123 ](https://github.com/headroomlabs-ai/headroom/issues/3123 ))
([250ede2 ](250ede2f7f ))
* tool_search_tool_regex deferred and falsely resolved on
direct-Anthropic path
([#2971 ](https://github.com/headroomlabs-ai/headroom/issues/2971 ))
([8ea87e7 ](8ea87e7804 ))
* **vscode:** persist compatible Claude modes and route Copilot CAPI
([#2986 ](https://github.com/headroomlabs-ai/headroom/issues/2986 ))
([1aa701a ](1aa701adaa ))
* **wrap:** set xAI upstream for grok-build proxy
([#2772 ](https://github.com/headroomlabs-ai/headroom/issues/2772 ))
([c831081 ](c8310819a4 ))
* **wrap:** stop the Serena pre-index stalling the launch path for 300s
([#2945 ](https://github.com/headroomlabs-ai/headroom/issues/2945 ))
([6147883 ](6147883d5e ))
* **wrap:** verify proxy deps before mutating Codex config
([#1628 ](https://github.com/headroomlabs-ai/headroom/issues/1628 ))
([b7f342c ](b7f342c153 ))
### Performance Improvements
* **perf:** skip rotated logs outside the requested window
([#3081 ](https://github.com/headroomlabs-ai/headroom/issues/3081 ))
([6c9f41e ](6c9f41e08c ))
### Dependencies
* bump axum from 0.7.9 to 0.8.9
([#2966 ](https://github.com/headroomlabs-ai/headroom/issues/2966 ))
([5731be7 ](5731be7e68 ))
* bump criterion from 0.5.1 to 0.8.2
([#2965 ](https://github.com/headroomlabs-ai/headroom/issues/2965 ))
([b30f339 ](b30f339d69 ))
* bump ruff from 0.15.22 to 0.16.2 in the pip-minor-patch group across 1
directory
([#2962 ](https://github.com/headroomlabs-ai/headroom/issues/2962 ))
([ff17961 ](ff17961cd7 ))
* bump sha2 from 0.10.9 to 0.11.0
([#2288 ](https://github.com/headroomlabs-ai/headroom/issues/2288 ))
([322425c ](322425c43b ))
* bump the cargo-minor-patch group across 1 directory with 4 updates
([#2964 ](https://github.com/headroomlabs-ai/headroom/issues/2964 ))
([888a9f4 ](888a9f4e14 ))
* bump tokio-tungstenite from 0.24.0 to 0.30.0
([#2967 ](https://github.com/headroomlabs-ai/headroom/issues/2967 ))
([bbe9013 ](bbe901319d ))
* update mcp requirement from <2.0.0,>=1.28.1 to
>=1.28.1,<3.0.0
([#2963 ](https://github.com/headroomlabs-ai/headroom/issues/2963 ))
([d6fb536 ](d6fb5365f6 ))
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please ). See
[documentation](https://github.com/googleapis/release-please#release-please ).
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-19 21:14:59 -07:00
Tejas Chopra
93f2d7a2da
chore: release main ( #2792 )
...
🤖 I have created a release *beep* *boop*
---
<details><summary>0.35.0</summary>
##
[0.35.0](https://github.com/headroomlabs-ai/headroom/compare/v0.34.0...v0.35.0 )
(2026-08-12)
### Features
* **beacon:** allowlist the routing summary key
([#2818 ](https://github.com/headroomlabs-ai/headroom/issues/2818 ))
([7940c05 ](7940c05ebf ))
* **beacon:** hourly R2 compaction, per-strategy savings, and a stack
that reports
([#2853 ](https://github.com/headroomlabs-ai/headroom/issues/2853 ))
([e0870ef ](e0870ef931 ))
* **cli,pricing:** add CLI extension seam and prompt-cache TTL pricing
([#2802 ](https://github.com/headroomlabs-ai/headroom/issues/2802 ))
([6ec3e34 ](6ec3e3478a ))
### Bug Fixes
* **anthropic:** strip first-party tool search on custom upstreams
([#2539 ](https://github.com/headroomlabs-ai/headroom/issues/2539 ))
([7f6950b ](7f6950be34 ))
* **backends/anyllm:** convert Anthropic tools and tool_choice to OpenAI
shape
([0d6866b ](0d6866b91a ))
* **backends/anyllm:** stream tool_use blocks and map finish_reason on
the streaming path
([e4904e2 ](e4904e23a6 ))
* **backends/litellm:** None-guard core token counts in OpenAI usage
block ([#2324 ](https://github.com/headroomlabs-ai/headroom/issues/2324 ))
([12f9f58 ](12f9f58cb3 ))
* **beacon:** report all-layers savings, not context-compression only
([#2796 ](https://github.com/headroomlabs-ai/headroom/issues/2796 ))
([e9a24f3 ](e9a24f3ec1 ))
* **beacon:** split session failures by status code
([#2815 ](https://github.com/headroomlabs-ai/headroom/issues/2815 ))
([2954e37 ](2954e37048 ))
* **cache:** bound compression cache bookkeeping
([0ae948c ](0ae948c151 ))
* **cache:** enforce Anthropic's 1h-before-5m cache_control ordering
before forwarding
([#2941 ](https://github.com/headroomlabs-ai/headroom/issues/2941 ))
([3752458 ](3752458022 ))
* **cache:** mirror client cache_control positions instead of
single-marker consolidation
([def3d76 ](def3d76e5a ))
* **cache:** stabilize Anthropic block-growing lineages
([#2917 ](https://github.com/headroomlabs-ai/headroom/issues/2917 ))
([1a04c95 ](1a04c957f5 ))
* **ccr:** avoid injecting tool on chat streaming
([d0c1f5b ](d0c1f5b8ad ))
* **ccr:** preserve exact SQLite TTL boundary
([#2669 ](https://github.com/headroomlabs-ai/headroom/issues/2669 ))
([d0a86d4 ](d0a86d409f ))
* **ccr:** report embedded hashes from compress endpoint
([#717 ](https://github.com/headroomlabs-ai/headroom/issues/717 ))
([685ebe4 ](685ebe457d ))
* **ccr:** resolve <<ccr:...>> markers inline when no
retrieve-tool path exists
([#2512 ](https://github.com/headroomlabs-ai/headroom/issues/2512 ))
([ce8ce83 ](ce8ce8313f ))
* **ccr:** tolerate null/malformed OpenAI data in response handling
([#2467 ](https://github.com/headroomlabs-ai/headroom/issues/2467 ))
([e583e08 ](e583e082d8 ))
* **ci:** publish latest from the root Docker manifest
([#2252 ](https://github.com/headroomlabs-ai/headroom/issues/2252 ))
([5568d73 ](5568d738af ))
* **claude:** stop forcing tool search on Foundry
([#2477 ](https://github.com/headroomlabs-ai/headroom/issues/2477 ))
([7981396 ](798139608c ))
* **cli/update:** let install ownership win over bare /.dockerenv so
venv installs self-update
([#2830 ](https://github.com/headroomlabs-ai/headroom/issues/2830 ))
([7092b53 ](7092b53c46 ))
* **codex:** route alpha search through the Codex backend
([#2538 ](https://github.com/headroomlabs-ai/headroom/issues/2538 ))
([a540eb2 ](a540eb2c61 ))
* **content-router:** protect custom-tag blocks before mixed-content
section split
([d7bc1e2 ](d7bc1e275f ))
* **deps:** bump h2 to 4.4.1 for CVE-2026-71554
([#2839 ](https://github.com/headroomlabs-ai/headroom/issues/2839 ))
([564e0a8 ](564e0a8d0f ))
* **deps:** enforce audited transitive dependency floors
([#2791 ](https://github.com/headroomlabs-ai/headroom/issues/2791 ))
([64e2039 ](64e203931b ))
* **doctor:** flag `ollama launch claude` proxy bypass instead of
misdirecting
([#2566 ](https://github.com/headroomlabs-ai/headroom/issues/2566 ))
([7f24d69 ](7f24d695ee ))
* emit SSE ping before message_start on Bedrock streaming path (issue
[#902 ](https://github.com/headroomlabs-ai/headroom/issues/902 ))
([#1080 ](https://github.com/headroomlabs-ai/headroom/issues/1080 ))
([4dab254 ](4dab254d52 ))
* **gemini:** resolve native CCR retrieval calls
([#2253 ](https://github.com/headroomlabs-ai/headroom/issues/2253 ))
([2483f57 ](2483f57002 ))
* **health:** label kompress as degraded/optional when not yet loaded
([#2865 ](https://github.com/headroomlabs-ai/headroom/issues/2865 ))
([8949371 ](89493714d2 ))
* **image:** decouple routing types from trained_router so importing the
compressor doesn't import torch
([#2513 ](https://github.com/headroomlabs-ai/headroom/issues/2513 ))
([#2537 ](https://github.com/headroomlabs-ai/headroom/issues/2537 ))
([d7cf981 ](d7cf981093 ))
* **install/windows:** register persistent-task from S4U hidden XML
([#2453 ](https://github.com/headroomlabs-ai/headroom/issues/2453 ))
([#2459 ](https://github.com/headroomlabs-ai/headroom/issues/2459 ))
([1edaeb8 ](1edaeb8b76 ))
* **install:** don't crash the PowerShell installer when $PROFILE is
unset ([#2469 ](https://github.com/headroomlabs-ai/headroom/issues/2469 ))
([fc5c4e2 ](fc5c4e239c ))
* **install:** trust Docker bridge for dashboard metadata
([e044139 ](e044139001 ))
* **install:** use --userns=keep-id under Podman so bind-mount writes
don't fail
([#2846 ](https://github.com/headroomlabs-ai/headroom/issues/2846 ))
([3488f8d ](3488f8d4b5 ))
* **learn/gemini:** stop double-counting session tokens
([#2230 ](https://github.com/headroomlabs-ai/headroom/issues/2230 ))
([29d8a5e ](29d8a5e563 ))
* **learn/grok:** detect a Windows absolute project path
([#2283 ](https://github.com/headroomlabs-ai/headroom/issues/2283 ))
([e240df2 ](e240df2b69 ))
* **learn:** stop classifying a successful exit code 0 as an error
([#2289 ](https://github.com/headroomlabs-ai/headroom/issues/2289 ))
([a24fe7d ](a24fe7dcbf ))
* **litellm:** add async_post_call_success_hook to HeadroomCallback
([#1322 ](https://github.com/headroomlabs-ai/headroom/issues/1322 ))
([3107994 ](3107994aed ))
* **litellm:** don't forward a caller key the target cannot accept
([#2883 ](https://github.com/headroomlabs-ai/headroom/issues/2883 ))
([2f2950a ](2f2950a626 ))
* **memory:** bound the TrafficLearner pending-pattern accumulator
(memory leak)
([#2579 ](https://github.com/headroomlabs-ai/headroom/issues/2579 ))
([1f5feff ](1f5fefffd3 ))
* **memory:** close DirectMem0 resources
([6596182 ](65961827cf ))
* **memory:** close MCP backend on shutdown
([4bd8ecd ](4bd8ecd1e3 ))
* **memory:** don't crash inline memory extraction on a non-object
<memory> block
([#2470 ](https://github.com/headroomlabs-ai/headroom/issues/2470 ))
([e00c6ff ](e00c6ff81c ))
* **memory:** keep vector metadata in sync
([#2295 ](https://github.com/headroomlabs-ai/headroom/issues/2295 ))
([c471800 ](c471800e8e ))
* **memory:** make explicit-project and user store keys
collision-resistant
([#2231 ](https://github.com/headroomlabs-ai/headroom/issues/2231 ))
([f840d5f ](f840d5f2fe ))
* **memory:** skip <system-reminder> blocks when building the
retrieval query
([#2195 ](https://github.com/headroomlabs-ai/headroom/issues/2195 ))
([#2541 ](https://github.com/headroomlabs-ai/headroom/issues/2541 ))
([4e5a67a ](4e5a67a342 ))
* **memory:** sync FTS5 and vector indexes on CLI
delete/edit/prune/purge
([fd4628d ](fd4628d821 ))
* **oauth2:** make repository lint checks pass
([c85abf7 ](c85abf7a87 ))
* **observability:** aggregate tool savings in OTEL
([#2936 ](https://github.com/headroomlabs-ai/headroom/issues/2936 ))
([941c25d ](941c25d31e ))
* **onnx:** stop ONNX thread pools from spinning idle cores
([#2495 ](https://github.com/headroomlabs-ai/headroom/issues/2495 ))
([#2540 ](https://github.com/headroomlabs-ai/headroom/issues/2540 ))
([5c561bd ](5c561bd913 ))
* **openai:** skip Responses tool-search deferral for clients that
cannot execute it
([#2696 ](https://github.com/headroomlabs-ai/headroom/issues/2696 ))
([54ea28d ](54ea28d983 ))
* **opencode:** ship the transport hook-shim so wheel installs route
Node child traffic
([702dbc5 ](702dbc5902 ))
* **providers/anthropic:** don't crash token estimation on null
tool_calls
([#2472 ](https://github.com/headroomlabs-ai/headroom/issues/2472 ))
([08466f3 ](08466f3cae ))
* **providers/openai:** bound tiktoken vocab loads with the guarded
loader
([#2554 ](https://github.com/headroomlabs-ai/headroom/issues/2554 ))
([0805e8e ](0805e8e410 ))
* **proxy/anthropic:** inject headroom_retrieve whenever a CCR marker is
present, not only for new markers
([#2848 ](https://github.com/headroomlabs-ai/headroom/issues/2848 ))
([3808f60 ](3808f60ca6 ))
* **proxy/anthropic:** None-guard usage token counts on the direct
buffered path
([#2434 ](https://github.com/headroomlabs-ai/headroom/issues/2434 ))
([2b5ee7c ](2b5ee7cde8 ))
* **proxy/anthropic:** run tool-search history repair after turn hooks
([c6f9948 ](c6f99482e1 ))
* **proxy/batch:** don't crash an OpenAI batch on a valid-JSON
non-object line
([#2316 ](https://github.com/headroomlabs-ai/headroom/issues/2316 ))
([1f2c681 ](1f2c681c0b ))
* **proxy/bedrock:** report uncached input tokens from backend usage,
not the live-zone count
([#2318 ](https://github.com/headroomlabs-ai/headroom/issues/2318 ))
([c19e412 ](c19e412b33 ))
* **proxy/gemini:** keep streaming-parity baseline so eligible_pct can't
exceed 100
([#2824 ](https://github.com/headroomlabs-ai/headroom/issues/2824 ))
([b97c7c6 ](b97c7c6e99 ))
* **proxy/metrics:** cap client-supplied model label cardinality
([#2480 ](https://github.com/headroomlabs-ai/headroom/issues/2480 ))
([e24a7e6 ](e24a7e66b9 ))
* **proxy/metrics:** escape label values in the Prometheus export
([#2463 ](https://github.com/headroomlabs-ai/headroom/issues/2463 ))
([6a53861 ](6a53861063 ))
* **proxy/openai:** don't crash the Responses memory tool loops on null
arguments
([#2273 ](https://github.com/headroomlabs-ai/headroom/issues/2273 ))
([a30db2c ](a30db2cae4 ))
* **proxy/openai:** feed Codex WS traffic into the traffic learner
([#2334 ](https://github.com/headroomlabs-ai/headroom/issues/2334 ))
([f669149 ](f669149769 ))
* **proxy/openai:** run response hooks on Responses, and bill their
re-drives
([#2872 ](https://github.com/headroomlabs-ai/headroom/issues/2872 ))
([675d13f ](675d13f08d ))
* **proxy:** allow settings routes for trusted gateway/dashboard clients
([#2491 ](https://github.com/headroomlabs-ai/headroom/issues/2491 ))
([a5b0a8f ](a5b0a8f4cc ))
* **proxy:** cache litellm model resolution to stop repeated Provider
List spam
([99f07e7 ](99f07e7bbd ))
* **proxy:** cancel periodic TOIN task on shutdown
([739fdef ](739fdef423 ))
* **proxy:** close the upstream stream when a streaming body is never
consumed
([0951663 ](0951663562 ))
* **proxy:** compress cache-mode cold starts and tag prefix-mismatch
passthrough
([#2365 ](https://github.com/headroomlabs-ai/headroom/issues/2365 ))
([aaeba0a ](aaeba0a319 ))
* **proxy:** emit request log timestamps in UTC
([620028f ](620028fa18 ))
* **proxy:** enable tool search by default and repair poisoned
transcripts
([#2807 ](https://github.com/headroomlabs-ai/headroom/issues/2807 ))
([0237cbf ](0237cbffbb ))
* **proxy:** gate mid-turn message coalescing to Claude Code clients
([#1643 ](https://github.com/headroomlabs-ai/headroom/issues/1643 ))
([a4bd2e6 ](a4bd2e62a5 ))
* **proxy:** give each Codex /v1/responses WS turn a unique request_id
([#2164 ](https://github.com/headroomlabs-ai/headroom/issues/2164 ))
([d02df10 ](d02df10758 ))
* **proxy:** graceful shutdown and reliable Ctrl+C exit
([#621 ](https://github.com/headroomlabs-ai/headroom/issues/621 ))
([17cdb18 ](17cdb185bc ))
* **proxy:** guard telemetry and TOIN endpoints
([cde1513 ](cde1513c91 ))
* **proxy:** include tool_search_deferral savings in the savings ledger
([12149f7 ](12149f7446 ))
* **proxy:** pass through cross-region prefixed Bedrock model IDs
directly
([#2330 ](https://github.com/headroomlabs-ai/headroom/issues/2330 ))
([64cb46e ](64cb46e24b ))
* **proxy:** port session-sticky beta headers to the Rust proxy
([#2381 ](https://github.com/headroomlabs-ai/headroom/issues/2381 ))
([f6398a6 ](f6398a6476 ))
* **proxy:** preserve merged session and quarantine contracts
([#2943 ](https://github.com/headroomlabs-ai/headroom/issues/2943 ))
([039cd24 ](039cd2431a ))
* **proxy:** preserve signed Anthropic thinking blocks on outbound
re-serialize
([#2254 ](https://github.com/headroomlabs-ai/headroom/issues/2254 ))
([dc163bc ](dc163bcd1c ))
* **proxy:** stop discarding compressed Codex WS later-frame payloads
([#2823 ](https://github.com/headroomlabs-ai/headroom/issues/2823 ))
([4ec416d ](4ec416df88 ))
* **proxy:** time-cap the compression timeout-debt quarantine
([#2360 ](https://github.com/headroomlabs-ai/headroom/issues/2360 ))
([#2412 ](https://github.com/headroomlabs-ai/headroom/issues/2412 ))
([c5a08d2 ](c5a08d22e0 ))
* **proxy:** unwrap Hermes tool_call bridge in tool name map
([#2717 ](https://github.com/headroomlabs-ai/headroom/issues/2717 ))
([a97b824 ](a97b82413b ))
* publish headroom-opencode in release workflow
([#2372 ](https://github.com/headroomlabs-ai/headroom/issues/2372 ))
([7859154 ](78591545ce ))
* **settings:** accept documented HEADROOM_* env names as settings keys
([#2833 ](https://github.com/headroomlabs-ai/headroom/issues/2833 ))
([de9e052 ](de9e0523da ))
* **subscription:** dedup transcript usage by message id
([#2340 ](https://github.com/headroomlabs-ai/headroom/issues/2340 ) token
inflation)
([#2408 ](https://github.com/headroomlabs-ai/headroom/issues/2408 ))
([74275b7 ](74275b7c3e ))
* **toin:** bound private query and pattern retention
([8cd1380 ](8cd138039e ))
* **tokenizer:** coerce non-string tool_call fields before counting
([#2801 ](https://github.com/headroomlabs-ai/headroom/issues/2801 ))
([b6f9877 ](b6f9877c78 ))
* **tokenizer:** price CJK in the Rust fixed-ratio estimator (Python
parity)
([#2260 ](https://github.com/headroomlabs-ai/headroom/issues/2260 ))
([6840153 ](6840153473 ))
* **transforms/adaptive-sizer:** honor max_k on small-input fast path
([#2319 ](https://github.com/headroomlabs-ai/headroom/issues/2319 ))
([8a90523 ](8a90523209 ))
* **transforms/smart_crusher:** don't crash on a tool call with a null
function
([#2232 ](https://github.com/headroomlabs-ai/headroom/issues/2232 ))
([3bb02f8 ](3bb02f8f75 ))
* Vertex model pricing shows $0.00 for versioned model names and
vertex:anthropic provider
([#2517 ](https://github.com/headroomlabs-ai/headroom/issues/2517 ))
([eb5b5e4 ](eb5b5e4198 ))
* **wrap/claude:** keep --1m effective when an explicit --model is
passed through
([c093bf1 ](c093bf11eb ))
* **wrap/opencode:** verify the opencode binary before mutating config
([ae38486 ](ae384862a4 ))
* **wrap/serena:** install Serena from the serena-agent PyPI wheel, not
the git source
([d7b25ae ](d7b25ae3bb ))
* **wrap:** honor Copilot OAuth wire-api override and model default
([#2387 ](https://github.com/headroomlabs-ai/headroom/issues/2387 ))
([1db6d88 ](1db6d88ab4 ))
* **wrap:** serialize shared proxy startup
([#2946 ](https://github.com/headroomlabs-ai/headroom/issues/2946 ))
([e540d64 ](e540d64feb ))
* **wrap:** stop the launch cwd from shadowing the installed package in
the proxy subprocess
([#2843 ](https://github.com/headroomlabs-ai/headroom/issues/2843 ))
([c49be26 ](c49be269a1 ))
### Performance Improvements
* cut hot-path latency 27% (token-count memo, startup preloads, JSON
scan memo)
([#2838 ](https://github.com/headroomlabs-ai/headroom/issues/2838 ))
([53af90d ](53af90d68c ))
* **proxy:** bound upstream calls and hot-path costs
([#2852 ](https://github.com/headroomlabs-ai/headroom/issues/2852 ))
([f624d3a ](f624d3a00a ))
* **subscription:** skip transcripts older than the window in
compute_window_tokens
([#2861 ](https://github.com/headroomlabs-ai/headroom/issues/2861 ))
([91d6bf3 ](91d6bf33cd ))
### Dependencies
* bump brace-expansion from 5.0.7 to 5.0.9 in /docs
([#2751 ](https://github.com/headroomlabs-ai/headroom/issues/2751 ))
([56ee57b ](56ee57be98 ))
* bump bytesize from 1.3.3 to 2.4.2
([#2286 ](https://github.com/headroomlabs-ai/headroom/issues/2286 ))
([6448545 ](6448545a7f ))
* bump hf-hub from 0.4.3 to 0.5.0
([#2285 ](https://github.com/headroomlabs-ai/headroom/issues/2285 ))
([4925bf6 ](4925bf6a82 ))
* bump next from 16.2.10 to 16.3.0 in /docs
([#2750 ](https://github.com/headroomlabs-ai/headroom/issues/2750 ))
([0fd0b99 ](0fd0b996a4 ))
* bump postcss from 8.5.19 to 8.5.25 in /plugins/openclaw
([#2749 ](https://github.com/headroomlabs-ai/headroom/issues/2749 ))
([cd60ee9 ](cd60ee9ae8 ))
* bump postcss from 8.5.19 to 8.5.25 in /plugins/opencode
([#2748 ](https://github.com/headroomlabs-ai/headroom/issues/2748 ))
([ff4e016 ](ff4e0167bb ))
* bump postcss from 8.5.19 to 8.5.25 in /sdk/typescript
([#2747 ](https://github.com/headroomlabs-ai/headroom/issues/2747 ))
([267c2bd ](267c2bdcb5 ))
* bump postcss from 8.5.19 to 8.5.26 in /docs
([#2881 ](https://github.com/headroomlabs-ai/headroom/issues/2881 ))
([e6e5826 ](e6e5826423 ))
* bump ruff from 0.15.17 to 0.15.22 in the pip-minor-patch group
([#2501 ](https://github.com/headroomlabs-ai/headroom/issues/2501 ))
([ecf130d ](ecf130d3ac ))
* bump rusqlite from 0.32.1 to 0.40.1
([#2287 ](https://github.com/headroomlabs-ai/headroom/issues/2287 ))
([522faa1 ](522faa1a59 ))
* bump the cargo-minor-patch group across 1 directory with 22 updates
([#2916 ](https://github.com/headroomlabs-ai/headroom/issues/2916 ))
([148d860 ](148d8605e2 ))
</details>
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please ). See
[documentation](https://github.com/googleapis/release-please#release-please ).
---------
Co-authored-by: JD Davis <mxjerrett@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-12 19:02:51 -05:00
Tejas Chopra
9fd5ae3d53
chore: release main ( #2679 )
...
🤖 I have created a release *beep* *boop*
---
<details><summary>0.34.0</summary>
##
[0.34.0](https://github.com/headroomlabs-ai/headroom/compare/v0.33.0...v0.34.0 )
(2026-08-05)
### Features
* **claude:** support Claude Code in VS Code
([#2752 ](https://github.com/headroomlabs-ai/headroom/issues/2752 ))
([13a310a ](13a310a00d ))
* **code:** add PHP support to CodeAwareCompressor
([#2423 ](https://github.com/headroomlabs-ai/headroom/issues/2423 ))
([6d5516d ](6d5516dcb8 ))
* **compress:** accept config.frozen_message_count on /v1/compress
([#2718 ](https://github.com/headroomlabs-ai/headroom/issues/2718 ))
([2797099 ](2797099bec ))
* **compress:** reach the lossless provider seam on the general path and
default /v1/compress to marker-free output
([#2691 ](https://github.com/headroomlabs-ai/headroom/issues/2691 ))
([f2c48e2 ](f2c48e26c6 ))
* **copilot:** proxy VS Code models transparently
([#2687 ](https://github.com/headroomlabs-ai/headroom/issues/2687 ))
([007446c ](007446c73a ))
### Bug Fixes
* **ccr:** stop persisting retrieval markers as original content
([#2694 ](https://github.com/headroomlabs-ai/headroom/issues/2694 ))
([#2703 ](https://github.com/headroomlabs-ai/headroom/issues/2703 ))
([3e348f3 ](3e348f327f ))
* **ci:** restrict Codecov shard uploads
([#2745 ](https://github.com/headroomlabs-ai/headroom/issues/2745 ))
([3f2ca99 ](3f2ca99fe1 ))
* **compression:** honor qualified CCR names across integrations
([#2698 ](https://github.com/headroomlabs-ai/headroom/issues/2698 ))
([dcb674b ](dcb674b5e4 ))
* **compress:** resolve the /v1/compress tokenizer per model, and
document the real contract
([#2743 ](https://github.com/headroomlabs-ai/headroom/issues/2743 ))
([6422a80 ](6422a80a58 ))
* **cost:** send litellm the total prompt so --budget stops seeing $0
([#2757 ](https://github.com/headroomlabs-ai/headroom/issues/2757 ))
([a033ac4 ](a033ac4176 ))
* **deps:** bump aiohttp and cryptography to clear the CVEs blocking
0.34.0
([#2753 ](https://github.com/headroomlabs-ai/headroom/issues/2753 ))
([0221e7f ](0221e7f240 ))
* **kompress:** let orgs run Kompress on their own inference stack
([#2736 ](https://github.com/headroomlabs-ai/headroom/issues/2736 ))
([3d23d76 ](3d23d76248 ))
* **kompress:** load merged.pt for the v2 checkpoint instead of the
unmerged PEFT safetensors
([#2716 ](https://github.com/headroomlabs-ai/headroom/issues/2716 ))
([46da91b ](46da91b2f1 ))
* **kompress:** reject artifacts that fail at run, and prefetch model
files at startup
([#2740 ](https://github.com/headroomlabs-ai/headroom/issues/2740 ))
([224578e ](224578e80b ))
* **learn:** filter ambient user-role scaffolding
([#2275 ](https://github.com/headroomlabs-ai/headroom/issues/2275 ))
([3eb0122 ](3eb0122068 ))
* **learn:** run project discovery off the event loop
([#2731 ](https://github.com/headroomlabs-ai/headroom/issues/2731 ))
([a70e5ff ](a70e5ff78d ))
* normalize /p/<project> prefix on WebSocket upgrades so the
Responses WS route is not rejected with 403
([#2379 ](https://github.com/headroomlabs-ai/headroom/issues/2379 ))
([789a4f3 ](789a4f3060 ))
* **providers:** give every model exactly one tokenizer
([#2761 ](https://github.com/headroomlabs-ai/headroom/issues/2761 ))
([cd92ed5 ](cd92ed52ff ))
* **providers:** stop a shorter model family shadowing a longer one
([#2762 ](https://github.com/headroomlabs-ai/headroom/issues/2762 ))
([0cb72f4 ](0cb72f45b2 ))
* **providers:** stop pricing modern content blocks at zero
([#2760 ](https://github.com/headroomlabs-ai/headroom/issues/2760 ))
([06add9e ](06add9e9d8 ))
* **proxy/cost:** mark estimated-basis budget records and add an
enforcement policy
([#2713 ](https://github.com/headroomlabs-ai/headroom/issues/2713 ))
([#2725 ](https://github.com/headroomlabs-ai/headroom/issues/2725 ))
([01df245 ](01df245252 ))
* **proxy/debug:** reconcile Kompress warmup state in /debug/warmup
([#2711 ](https://github.com/headroomlabs-ai/headroom/issues/2711 ))
([3a27c4d ](3a27c4dacb ))
* **proxy/openai:** run tool-description compaction on chat-completions
([#2741 ](https://github.com/headroomlabs-ai/headroom/issues/2741 ))
([f9db5b5 ](f9db5b5060 ))
* **proxy:** route Codex Live voice through a dedicated /v1/live
transport
([#2709 ](https://github.com/headroomlabs-ai/headroom/issues/2709 ))
([232fb49 ](232fb49c73 ))
* **proxy:** skip OpenAI tool_search deferral for Codex client
([#2729 ](https://github.com/headroomlabs-ai/headroom/issues/2729 ))
([56b3e4c ](56b3e4c1b1 ))
* **proxy:** stop toggling headroom_retrieve in the Anthropic tools
array ([#2672 ](https://github.com/headroomlabs-ai/headroom/issues/2672 ))
([08fce29 ](08fce29b47 ))
* remove rtk and lean-ctx CLI context tools
([#2677 ](https://github.com/headroomlabs-ai/headroom/issues/2677 ))
([e0ce4b1 ](e0ce4b1d48 ))
* **router:** stop counting an image's base64 payload as suffix tokens
([#2778 ](https://github.com/headroomlabs-ai/headroom/issues/2778 ))
([f03cc6d ](f03cc6d88b ))
* **savings:** surface request growth the tok_saved clamp swallows
([#2708 ](https://github.com/headroomlabs-ai/headroom/issues/2708 ))
([184146b ](184146b688 ))
* **stats:** report one "Tokens Saved" headline across every harness
([#2737 ](https://github.com/headroomlabs-ai/headroom/issues/2737 ))
([8262a4a ](8262a4a321 ))
* **telemetry:** anonymous compression stats — no prompts, no data
([#2728 ](https://github.com/headroomlabs-ai/headroom/issues/2728 ))
([9cfb008 ](9cfb00838a ))
* **telemetry:** stop mixing tokenizer scales in RequestOutcome, and fix
the overhead framing
([#2756 ](https://github.com/headroomlabs-ai/headroom/issues/2756 ))
([04e1517 ](04e1517ede ))
* **tokenizers:** count HuggingFace chat templates, and resolve gpt-5 /
gateway-wrapped names
([#2758 ](https://github.com/headroomlabs-ai/headroom/issues/2758 ))
([0ed306b ](0ed306b22b ))
* **tokenizers:** resolve gpt-5 and mixed-case model names to the right
encoding
([#2776 ](https://github.com/headroomlabs-ai/headroom/issues/2776 ))
([fc4680b ](fc4680b37a ))
* **transforms:** stop ContentRouter recompressing headroom_retrieve
results
([#2654 ](https://github.com/headroomlabs-ai/headroom/issues/2654 ))
([677e097 ](677e09735a ))
* **wrap/serena:** stop creating serena_config.yml, unbricking Serena on
fresh installs
([#2676 ](https://github.com/headroomlabs-ai/headroom/issues/2676 ))
([759209c ](759209cff3 ))
### Code Refactoring
* **pricing:** make LiteLLM the source of truth, not the hardcoded table
([#2779 ](https://github.com/headroomlabs-ai/headroom/issues/2779 ))
([0e1d6bf ](0e1d6bfa79 ))
* remove the dead headroom/prediction module
([#2692 ](https://github.com/headroomlabs-ai/headroom/issues/2692 ))
([b7a79ac ](b7a79ac31a ))
</details>
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please ). See
[documentation](https://github.com/googleapis/release-please#release-please ).
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-04 19:39:34 -07:00
Tejas Chopra
79d8056fd7
fix(mcp): regenerate stale server.json (0.27.0 -> 0.32.0) ( #2218 )
...
## Description
The committed `server.json` pinned version `0.27.0` while
`pyproject.toml` is at `0.32.0`.
`tests/test_mcp_registry/test_server_json.py::test_root_server_json_matches_builder`
asserts the committed artifact equals `render_server_json()`, so it
fails on `main`. This regenerates `server.json` from the current
metadata.
Found while getting the security PR (#2207 ) CI green. The two other
pre-existing failures it was grouped with were **already fixed on
`main`** by recent commits — `test_cold_start_fast_pass`
(`record_compression_failed` added to the metrics double) and
`test_cli/test_wrap_zcode` (watcher mock now passes the port) — so this
PR only needs the `server.json` regen.
## Type of Change
- [x] Bug fix (non-breaking change that fixes an issue)
## Changes Made
- Regenerated `server.json` from `render_server_json()` so the committed
artifact matches the current package version (`0.32.0`).
## Testing
- [x] Unit tests pass (`pytest`) — the previously-failing tests
- [x] Linting passes (`ruff check`)
### Test Output
```text
$ pytest tests/test_mcp_registry/test_server_json.py::test_root_server_json_matches_builder \
tests/test_cold_start_fast_pass.py::test_fast_pass_failure_falls_back_to_full_deferral \
tests/test_cli/test_wrap_zcode.py::test_wrap_prints_proxy_urls -q
3 passed
```
## Real Behavior Proof
- Environment: branch off current `main` (`ea3d5a86`), Python 3.12,
project `.venv`.
- Steps: `python -c "from headroom.mcp_registry import
render_server_json;
open('server.json','w').write(render_server_json())"`, then ran the MCP
registry test.
- Observed: `server.json` `version` → `0.32.0`;
`test_root_server_json_matches_builder` passes.
- Not tested: full suite (single generated-artifact change).
## 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
- [ ] Documentation changes (N/A)
- [x] My changes generate no new warnings
- [ ] Tests added (N/A — regenerates an artifact an existing test
already guards)
- [x] New and existing unit tests pass locally
- [ ] CHANGELOG (N/A)
## Additional Notes
`server.json` is a generated artifact
(`headroom/mcp_registry/server_json.py`) — regenerate with
`render_server_json()` after any version bump.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
2026-07-14 22:49:39 -07:00
Rod Boev
8522fcbc40
fix(code): quarantine Perl parser from code-aware compression ( #2204 )
...
## Description
`headroom proxy` can wedge when code-aware compression enters the
tree-sitter Perl external scanner and the native scan keeps the GIL
indefinitely. Current main still has two routes into that scanner:
explicit `perl` or `pl` hints flow through `CodeAwareCompressor`, and
`detect_language()` can nominate Perl on non-Perl code because its
prefilter matches generic sigils such as decorators, JSDoc tags, and
shell variables before phase 2 parses every surviving candidate grammar.
This change quarantines Perl at the code-aware compression funnel
without widening scope. Perl remains recognized at the input boundary,
but live proxy compression no longer requests a Perl parser. Non-Perl
code keeps its existing code-aware behavior. Real Perl falls back
through the existing safe Kompress or passthrough contract instead of
entering tree-sitter. The diff stays inside
`headroom/transforms/code_compressor.py` plus focused parser-safety
regressions.
Refs #2185
## 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
- Added a Perl quarantine list in
`headroom/transforms/code_compressor.py` and used it to stop Perl
candidate parsing during language detection.
- Added a hard `_get_parser()` guard so no live code-aware path can
construct a Perl parser.
- Routed resolved explicit Perl hints through the existing safe fallback
or passthrough contract before AST compression.
- Added focused parser-safety regressions for non-Perl candidate bleed,
explicit `perl` and `pl`, inferred real Perl, mixed fenced Perl content,
fallback-disabled passthrough, and non-Perl negative space.
## Testing
- [x] Unit tests pass (`uv run pytest tests/test_perl_scanner_safety.py
-q`)
- [x] Linting passes (`uv run ruff check
headroom/transforms/code_compressor.py
tests/test_perl_scanner_safety.py`)
- [ ] Type checking passes (`uv run mypy headroom`)
- [x] New tests added for new functionality when applicable
- [ ] Manual testing performed
### Test Output
```text
uv run pytest tests/test_perl_scanner_safety.py -q
8 passed in 1.93s
uv run ruff check headroom/transforms/code_compressor.py tests/test_perl_scanner_safety.py
All checks passed!
uv run ruff format headroom/transforms/code_compressor.py tests/test_perl_scanner_safety.py --check
2 files already formatted
```
## Real Behavior Proof
- Environment: Windows, Python from the synced `uv` environment, `dev`
and `code` extras installed, no provider call
- Exact command / steps: Run `uv run pytest
tests/test_perl_scanner_safety.py -q`.
- Observed result: `8 passed in 1.93s`; the suite proves explicit `perl`
and `pl`, inferred real Perl, mixed fenced Perl, and non-Perl
negative-space routes all avoid Perl parser entry.
- Not tested: the reporter's macOS payload and long-running concurrent
workload
## 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
- [ ] 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 have updated the CHANGELOG.md if applicable
## Additional Notes
- Use `Refs #2185`, not `Closes #2185`. The wedge surface is this PR's
scope, but #2185 also carries a separate orphaned `headroom mcp serve`
report that this slice does not address.
- This is a reachability fix. It does not repair the upstream Perl
scanner and it does not harden other grammars against the same class of
native wedge.
- `CHANGELOG.md` remains unchanged because Headroom generates release
notes from conventional commits.
- Merged PR https://github.com/headroomlabs-ai/headroom/pull/2114
addresses a different cooperative compression stall and stays separate
from this native parser-entry slice.
---------
Co-authored-by: JerrettDavis <mxjerrett@gmail.com>
2026-07-14 20:18:51 -07:00
Rod Boev
e9e9cd55b7
feat(mcp): publish canonical server.json ( #1510 )
...
## Description
Headroom can launch its MCP server, but did not publish a canonical
`server.json` that registries and MCP hosts can consume directly. This
PR adds a shared descriptor builder, commits a root `server.json`,
parity-tests that artifact against the builder and existing runtime
spec, and updates docs so registry authors do not need to reconstruct
`headroom mcp serve` from prose.
Closes #929 .
## Type of Change
- [ ] Bug fix (non-breaking change that fixes an issue)
- [x] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [x] Documentation update
- [ ] Performance improvement
- [ ] Code refactoring (no functional changes)
## Changes Made
- Added a shared `server_json.py` descriptor builder for Headroom MCP
publication metadata.
- Published a canonical root `server.json` and parity-tested it against
the builder.
- Encoded the publishable uvx contract as `headroom-ai[mcp]` plus
`headroom mcp serve`.
- Updated README and MCP docs to point registry authors at the canonical
descriptor.
- Added the README ownership marker used by MCP Registry verification.
- Kept existing registrars and `headroom mcp install` behavior
unchanged.
## Testing
- [x] Unit tests pass
- [x] Linting passes
- [x] Type checking passes
- [x] New tests added for new functionality when applicable
- [x] Manual testing performed
### Test Output
```text
Focused registry/server-json tests and reviewer approval were completed on this PR before the governance body cleanup. The current body update is documentation-only metadata for PR governance.
```
## Real Behavior Proof
- Environment: Headroom development checkout with MCP test dependencies.
- Exact command / steps: Inspected the generated `server.json` contract
and parity coverage against the descriptor builder and runtime MCP spec.
- Observed result: The committed descriptor matches the builder/runtime
contract and advertises the intended `headroom-ai[mcp]` / `headroom mcp
serve` launch path.
- Not tested: live publication to third-party registries
## Review Readiness
- [x] I have performed a self-review
- [x] This PR is ready for human review
## Additional Notes
This body was normalized by a maintainer after approval so the
governance parser reflects the already-reviewed PR state.
2026-07-14 13:25:29 -04:00