Headroom 0.34 圧縮・取得契約:フィールド、モード、実エンドポイント検証
技術ノート
公開 / DavidHLPL
Headroom 0.34.0 の API は、dashboard、型名、mock から推測せず、バージョン付き契約として扱う。/v1/compress には model と messages が必要で、圧縮統計は response のトップレベルにあり、/v1/retrieve は original_content を返す。この三点を誤っていても、実装と mock が同じ誤りを共有すればテストは成功してしまう。
契約の要点
POST /v1/compress
{
"model": "<MODEL_NAME>",
"messages": [{ "role": "user", "content": "..." }],
"config": {}
}
非空 messages が通常の圧縮経路を通る場合、成功 response には次のトップレベルフィールドがある。
messages
tokens_before
tokens_after
tokens_saved
compression_ratio
transforms_applied
transforms_summary
ccr_hashes
境界は次のとおりである。
modelまたはmessagesがなければ HTTP 400。- この endpoint が読むのは
messagesである。Codex Responses のinput配列は先に変換する。 tokens_savedはトップレベルであり、statsの下ではない。- 空の message 配列は config 検証より先に fast return し、response に
transforms_summaryを含まない。業務上有効かは caller が判断する。
POST /v1/retrieve
{ "hash": "<CCR_HASH>" }
成功 response は次のフィールドを含む。
hash
original_content
original_tokens
original_item_count
compressed_item_count
tool_name
retrieval_count
hash がなければ HTTP 400、存在しないか期限切れなら HTTP 404。adapter は original_content を読み、存在しない content や found を前提にしない。
圧縮 mode は同じスイッチではない
config.mode |
Marker | Store write | 条件 |
|---|---|---|---|
| 省略 | なし | なし | デフォルト。CCR 取得ループは不要 |
ccr |
条件付き | 条件付き | caller が取得 tool を注入し、loopback /v1/retrieve に到達できる |
lossy_inline |
なし | なし | lossless fold の後、残りを Kompress |
lossless_then_lossy |
なし | なし | lossy_inline の互換 alias |
ccr_hashes は実際に挿入した marker だけを表す。ccr mode でも通常の text や一般的な function message が marker を生成するとは限らない。structured tool output に対する SmartCrusher row-drop は、確認済みの marker 生成経路である。したがって「ccr を有効にした」ことと「ccr_hashes が必ず非空」を同一視しない。
Provider cache prefix の固定
非空 messages が通常の圧縮経路に入る場合、config.frozen_message_count は 0 以上の整数でなければならない。provider prompt cache に入った先頭 N messages を固定し、cross-message 分析には見せながら、response では byte-for-byte で変更しない。これにより既に支払った cache prefix の書き換えを防ぐ。空の message 配列はこの検証より先に fast return する。
recent message の保護とは方向が逆である。
frozen_message_countは先頭の provider-cache prefix を固定する。protect_recentは末尾側の最近の messages を保護する。
混同すると cache miss を起こすか、本来圧縮すべき古い messages を残し続ける。
Mock が false positive を生む理由
次の三つの、内部では整合するが誤った mock 仮定が確認された。
stats.tokens_savedを読む。- retrieve response から
contentまたはfoundを読む。 modelの省略を許す。
実装と mock が同じ仮定なら unit test は成功する。最小の修正は、固定 release の source から schema を抽出し、mock と loopback contract test の両方に同じ契約を課すことである。
最小 contract test
少なくとも次の四点を検証する。
modelなしの/v1/compressが 400 を返す。- 正常 response の
tokens_savedがトップレベルにある。 /v1/retrieveの本文フィールドがoriginal_contentである。- 実際に marker を挿入する fixture だけが、非空の
ccr_hashesを期待する。
実 loopback endpoint を呼ぶ場合は transport 環境も分離する。一部環境では Bun fetch が HTTP_PROXY を利用し、期待どおり loopback を除外しない。test process で proxy 変数を消すか、loopback を明示的に proxy しない client を使う。そうしないと接続失敗を API 契約の失敗と誤診する。
適用範囲、リスク、ロールバック
本ページは headroom-ai==0.34.0 に限定する。upgrade 後は固定 tag の source を読み直し、必須フィールド、response 階層、mode alias、CCR store 動作について同じ contract tests を再実行する。
ロールバックでデータを削除する必要はない。新しい request をデフォルトの marker-free mode に戻す。既に CCR marker を含む進行中の会話では、会話境界を越えるまで取得 tool を維持するか、新しい会話を開始してから /v1/retrieve に依存する tool injection を無効化する。CCR store に entry がある場合は内部ファイルを手動編集せず、Headroom の lifecycle で整理する。
関連ページ
出典と関連文書
- headroom-0-34-compress-retrieve-contract
- Headroom 単一ポートの総合:入口、動的上流、検証の境界
- Headroom ルート永続化の総合:Named Profile、model_cache、復旧
- Headroom と cc-switch / Claude Code の共存:単一の整理責任とセキュリティ境界
- OMP Headroom Bridge:外部ルーティングコントローラとネイティブ Codex/OMP プロキシ境界
- OMP Hook 拡張の概念:意思決定ポイントのヒント、ハードブロック、ステータス橋渡し
- LLM-Wiki パターン:LLM で蓄積する個人 AI ナレッジベース
研究記録
- 元の文書: src/content/note/ja/headroom-compress-retrieve-contract.md
- 出典リビジョン: f49953fb0d4bd52a39bf81167b0c4b7dd7d78a64
- 証拠の状態: 有効