# Q/K Bone Orientation — Completion Summary **Completed:** 23 February 2026 **Repos:** go-inference, go-mlx, go-ml, LEM **Status:** All 7 tasks complete, 14 files changed (+917 lines), all tests passing ## What Was Built ### go-inference — AttentionSnapshot types (Task 1) `AttentionSnapshot` struct and `AttentionInspector` optional interface. Backends expose attention data via type assertion — no breaking changes to `TextModel`. ### go-mlx — KV cache extraction (Task 2) `InspectAttention` on `metalAdapter` runs a single prefill pass and extracts post-RoPE K vectors from each layer's KV cache. Tested against real Gemma3-1B (26 layers, 1 KV head via GQA, 256 head dim). ### go-ml — Adapter pass-through (Task 3) `InspectAttention` on `InferenceAdapter` type-asserts the underlying `TextModel` to `AttentionInspector`. Returns clear error for unsupported backends. ### LEM — Analysis engine (Task 4) Pure Go CPU math in `pkg/lem/attention.go`. Computes 5 BO metrics from raw K tensors: - **Mean Coherence** — pairwise cosine similarity of K vectors within each layer - **Cross-Layer Alignment** — cosine similarity of mean K vectors between adjacent layers - **Head Entropy** — normalised Shannon entropy of K vector magnitudes across positions - **Phase-Lock Score** — fraction of head pairs above coherence threshold (0.7) - **Joint Collapse Count** — layers where cross-alignment drops below threshold (0.5) Composite score: 30% coherence + 25% cross-alignment + 20% phase-lock + 15% entropy + 10% joint stability → 0-100 scale. ### LEM — CLI command (Task 5) `lem score attention -model -prompt [-json]` loads a model, runs InspectAttention, and prints BO metrics. ### LEM — Distill integration (Task 6) Opt-in attention scoring in the distill pipeline. Gated behind `scorer.attention: true` and `scorer.attention_min_score` in ai.yaml. Costs one extra prefill per probe. ### LEM — Feature vectors (Task 7) 19D full feature vector: 6D grammar + 8D heuristic + 5D attention (`mean_coherence`, `cross_alignment`, `head_entropy`, `phase_lock`, `joint_stability`). Ready for Poindexter KDTree spatial indexing. ## Key Decisions - **Optional interface** — `AttentionInspector` via type assertion, not added to `TextModel` - **Named `BOResult`** — avoids collision with `metal.AttentionResult` in go-mlx - **Opt-in for distill** — extra prefill per probe is expensive, off by default - **Pure Go analysis** — zero CGO deps in the analysis engine; GPU data extracted once via `.Floats()` ## Commits | Repo | SHA | Message | |------|-----|---------| | go-inference | `0f7263f` | feat: add AttentionInspector optional interface | | go-mlx | `c2177f7` | feat: implement AttentionInspector via KV cache extraction | | go-ml | `45e9fed` | feat: add InspectAttention pass-through | | LEM | `28309b2` | feat: add Q/K Bone Orientation analysis engine | | LEM | `e333192` | feat: add 'lem score attention' CLI | | LEM | `fbc636e` | feat: integrate attention scoring into distill pipeline | | LEM | `b621baa` | feat: add 19D full feature vector |