1\section{Methods}2\label{sec:methods}34All methods are implemented in one Python package (\texttt{src/wp30}) on top of \texttt{mlx-lm}~0.32.2 \citep{mlxlm2026}, whose5KV cache for a layer is a pair of tensors $K,V\in\mathbb{R}^{B\times H_{KV}\times T\times d_h}$ with keys stored \emph{after} rotary6position embedding (RoPE) and a logical offset that drives the positions of new tokens. We distinguish \emph{official} code7(run as released), \emph{faithful re-implementations} (same rule and defaults, re-coded for MLX), \emph{adapted}, \emph{inspired}8and \emph{custom} baselines; the label of every method is in Table~\ref{tab:taxonomy} and in \texttt{literature/method\_notes.md}.910\subsection{Track A: text, structured messages and evidence}11\begin{description}[leftmargin=1.4em,style=nextline]12\item[A0 no message.] The receiver gets the question only (prior/guessing floor).13\item[A1 full raw context.] The document is placed in the receiver prompt; receiver prefill is counted.14\item[A2 head/tail truncation.] Fixed rule (half the token budget from the head, half from the tail, under the receiver tokenizer).15\item[A3 extractive selection.] Deterministic sentence selection under a token budget: BM25 of the question over sentences16 (question-aware) or a centrality score weighted by the density of digits and identifiers (question-blind).17\item[A4 abstractive summary.] Generated by the sender with a fixed prompt and a hard output cap equal to the budget; the prompt asks for18 verbatim identifiers, numbers, dates and negations and, in the blind regime, for everything concrete because the questions are unknown.19\item[A5 structured evidence.] The sender emits JSON facts \{entity, attribute, value, quote\} plus optional \texttt{notes} and20 \texttt{unknowns}; each quote is resolved to a character span of the source, and unresolved quotes are counted. The receiver sees21 values and spans. Truncated JSON is repaired at the last complete object.22\item[A6 references plus retrieval.] The message is A5 \emph{without values}: a reference index \{entity, attribute, span\}. At answer23 time the receiver ranks references by BM25 of the question and fetches at most six spans ($\pm$40/160 characters) under a 2\,000-byte24 budget; every lookup and fetched byte is recorded and added to the message bytes.25\item[A7 lossless transport codec.] The raw text is compressed with Zstandard (level~3) for transport and decompressed at the receiver;26 the receiver prefill is unchanged. Codec times are measured.27\item[A8 learned prompt compression.] LLMLingua-2 \citep{pan2024llmlingua2}, official package (\texttt{llmlingua}~0.2.2) with the28 released XLM-RoBERTa-large MeetingBank compressor, rate $=$ budget/source tokens, run on the Metal backend of PyTorch29 (fp32). It is question-agnostic by construction.30\end{description}31A4 and A5 use the same sender checkpoint, the same budget and prompts of comparable length; both prompts were tuned on development32data only. Receiver prompts are identical across methods except for the label of the material slot (Appendix~\ref{app:prompts}).3334\subsection{Track B: within-model KV compression and reuse}35Every Track-B condition manipulates the receiver's real cache tensors and runs receiver inference from the resulting state. The36receiver prefix is the chat-templated system prompt plus the document; the fresh input is the question and the assistant header,37so that the cache boundary is identical for all conditions (\emph{no duplicated boundary token} is a tested property).38\begin{description}[leftmargin=1.4em,style=nextline]39\item[B0 native cache.] The dense bf16 cache, branched (deep-copied) for every question.40\item[B1 serialized reuse.] B0 serialized to \texttt{safetensors} with a compatibility manifest (checkpoint revision, config,41 tokenizer and chat-template hashes, prefix-token hash and count, per-layer shapes/dtypes/quantization, positional semantics,42 runtime versions) and loaded back; the loader rejects a mismatching manifest before any model execution.43\item[B2 packed quantization.] \texttt{mx.quantize} along the head dimension (groups of 64 channels; 32 for 2-bit), asymmetric affine44 with a scale and a bias per group, packed into \texttt{uint32} words, and consumed by the quantized attention kernel---so the compressed45 storage is the execution representation, not a transport format that is expanded before attention. Bits $\in\{8,4,2\}$.46\item[B3 sink+recent.] Keep the first four positions and the most recent positions up to the budget. Unlike StreamingLLM, retained keys47 keep their original positions and the logical offset is preserved (new tokens see a positional gap); it is a retention \emph{pattern},48 labelled ``inspired''.49\item[B4 random.] Uniformly random positions at the same budget (seeded control).50\item[B5 attention-informed.] SnapKV's rule: per KV head, the attention of an observation window onto prefix positions (softmax,51 averaged over the window's queries and over the query heads of the GQA group), 1-D max-pooled with kernel~7, top-$k$ per head, window52 always kept. The window is the fresh question (aware) or a generic 32-token instruction (blind). Window queries are computed in a53 separate pass over a copy of the cache, whose cost is recorded as compression time, so the main attention kernel stays fused.54\item[B6 pyramid budgets.] PyramidKV's per-layer budget rule (verified against the KVCache-Factory code) with B5 scoring inside each55 layer; because layers retain different lengths, the fresh query is processed token by token (recorded).56\item[B9 selection then quantization.] B5 followed by B2 (8-bit).57\end{description}58Selection produces a \emph{sparse cache}: a subclass that stores only retained positions (per-head gathers are allowed), keeps the59logical offset, and supplies an explicit boolean mask when several fresh tokens are appended (retained positions visible to all,60causal among the new tokens). Correctness is established before any comparison (Section~\ref{sec:correctness}).6162\subsection{Track C: cross-checkpoint transfer}63Level~1 of the compatibility ladder (same checkpoint, separate processes and separate nodes) is B1 executed through a TCP worker64(Section~\ref{sec:network}). Level~2 (same family, different size) uses a \emph{linear KV mapper}: for each receiver layer $\ell_r$ of65Qwen2.5-3B we align a sender layer $\ell_s=\mathrm{round}(\ell_r\,(L_s-1)/(L_r-1))$ of Qwen2.5-1.5B (both have two KV heads of66dimension~128 and identical RoPE parameters, and they share the tokenizer, so sender and receiver caches are token-aligned), un-rotate67the sender keys with their known positions, and fit by ridge regression a map from $[K_s,V_s]\in\mathbb{R}^{512}$ (plus bias) to68$[K_r,V_r]\in\mathbb{R}^{512}$ on train-split caches only; mapped keys are re-rotated. The loss is reconstruction only69($\lambda_{\text{task}}=\lambda_{\text{distill}}=0$); the mapper has $36\times513\times512\approx9.5$M parameters and is saved with a70manifest (training documents, tokens, seconds, held-out reconstruction error). C0 feeds the sender cache into the receiver \emph{without}71mapping (shapes coincide): an incompatible-state negative control. C3 applies B5 selection to the mapped cache (mapping then compaction).72This is not SwaT \citep{alabdulkareem2026swat}, which trains a $\sim$300M mapper with generation and distillation terms across families;73no SwaT checkpoint or licence was available (Appendix~\ref{app:audit}). Level~3 (cross-family) was therefore not executed.7475\subsection{Track D: hosted receivers}76A0--A6 messages built by the local sender are answered by two hosted models (Anthropic \texttt{claude-haiku-4-5}; OpenAI77\texttt{gpt-5-nano}) through their documented APIs, with streaming to measure the time to the first content token, provider usage78fields, documented prompt caching (Anthropic \texttt{cache\_control}; OpenAI automatic prefix caching) and an estimated cost from the79published price tables. The provider's cached-token field is reported as billing information, never as ``KV bytes saved''.80