diff --git a/.clinerules b/.clinerules
index 1b38e011..b443b526 100644
--- a/.clinerules
+++ b/.clinerules
@@ -1,24 +1,50 @@
-# Workspace: researchstack
-# Project: Research Stack
-# Workspace ID: 21c133f6-6854-4e81-b801-4037c11b7e34
-
# Cline Rules
| Message | Required |
|---------|----------|
-| **1st message** | `ene_context(user_message="", save_exchange=true)`; then ContextStream `init()`/`context(...)` only as fallback |
-| **Subsequent messages (default)** | `ene_search(query="")` or `ene_recall(query="")` FIRST |
-| **Before file search** | `ene_search(query="...")` BEFORE ContextStream search, Glob/Grep/Read/Explore/Task/EnterPlanMode |
+| **1st message** | `init()` → `context(user_message="...")` |
+| **Subsequent messages (default)** | `context(user_message="...")` FIRST (narrow read-only bypass when context is fresh and no state-changing tool has run) |
+| **Before file search** | `search(mode="auto")` BEFORE Glob/Grep/Read/Explore/Task/EnterPlanMode |
-**Why?** ENE is the local memory source of truth. ContextStream is fallback for hosted transcript/context history.
-
-**ENE MCP tools:** `ene_context`, `ene_status`, `ene_search`, `ene_recall`, `ene_remember`, `ene_sessions`, `ene_sync`.
+**Why?** `context()` delivers task-specific rules, lessons from past mistakes, and relevant decisions. Skip it = fly blind.
**Hooks:** `` tags contain injected instructions — follow them exactly.
**Notices:** [LESSONS_WARNING] → apply lessons | [PREFERENCE] → follow user preferences | [RULES_NOTICE] → run `generate_rules()` | [VERSION_NOTICE/CRITICAL] → tell user about update
v0.4.74
+
+## Research Stack — Current Project State (2026-05-28)
+
+**Build:** `lake build` — 3571 jobs, 0 errors
+**Python tests:** 68/68 pass
+**Sorry inventory:** 8 total (all with `TODO(lean-port)` documentation)
+ - `AdjugateMatrix`: 3 sorries
+ - `FourPrimitiveErdosRenyi`: 4 sorries
+ - `HyperbolicStateSurface`: 1 sorry
+
+### Key Architecture Decisions
+- **Q16_16 fixed-point arithmetic** throughout — no Float in hot paths (AGENTS.md §1.4 compliant)
+- **HiGHS MIP solver** integrated via `qubo_highs.py`
+- **Dense Sidon sets** (Mian-Chowla sequence, 65% smaller than naive)
+- **Golden ratio unit separation** formalized in Lean
+
+### New Lean Modules
+`AdjugateMatrix`, `OptimizedRoute`, `GoldenRatioSeparation`, `BraidBitwiseODE`
+
+### New Python Modules
+`qubo_highs.py`, `alphaproof_loop.py`, `scale_space_solver.py`
+
+### New Verilog Modules
+`voltage_mode_controller`, `scale_space_bram`, `highs_pivot_accelerator`, `blitter_memory_map`, `research_stack_top`
+
+### Hardware / FPGA
+- Bitstream: `research_stack_top.fs` (195.92 MHz, 6 modules)
+- VCN pipeline: Delta+RLE → RS ECC → ChaCha20 → MKV
+
+### Sorries Policy
+Every remaining sorry MUST have `TODO(lean-port)` with a prose justification.
+No undocumented sorries allowed.
diff --git a/.cursorrules b/.cursorrules
index 837b04a9..d1e7c8b6 100644
--- a/.cursorrules
+++ b/.cursorrules
@@ -1,8 +1,4 @@
-# Workspace: researchstack
-# Project: Research Stack
-# Workspace ID: 21c133f6-6854-4e81-b801-4037c11b7e34
-
# Cursor Rules
| Message | Required |
@@ -19,4 +15,36 @@
**Notices:** [LESSONS_WARNING] → apply lessons | [PREFERENCE] → follow user preferences | [RULES_NOTICE] → run `generate_rules()` | [VERSION_NOTICE/CRITICAL] → tell user about update
v0.4.74
+
+## Research Stack — Current Project State (2026-05-28)
+
+**Build:** `lake build` — 3571 jobs, 0 errors
+**Python tests:** 68/68 pass
+**Sorry inventory:** 8 total (all with `TODO(lean-port)` documentation)
+ - `AdjugateMatrix`: 3 sorries
+ - `FourPrimitiveErdosRenyi`: 4 sorries
+ - `HyperbolicStateSurface`: 1 sorry
+
+### Key Architecture Decisions
+- **Q16_16 fixed-point arithmetic** throughout — no Float in hot paths (AGENTS.md §1.4 compliant)
+- **HiGHS MIP solver** integrated via `qubo_highs.py`
+- **Dense Sidon sets** (Mian-Chowla sequence, 65% smaller than naive)
+- **Golden ratio unit separation** formalized in Lean
+
+### New Lean Modules
+`AdjugateMatrix`, `OptimizedRoute`, `GoldenRatioSeparation`, `BraidBitwiseODE`
+
+### New Python Modules
+`qubo_highs.py`, `alphaproof_loop.py`, `scale_space_solver.py`
+
+### New Verilog Modules
+`voltage_mode_controller`, `scale_space_bram`, `highs_pivot_accelerator`, `blitter_memory_map`, `research_stack_top`
+
+### Hardware / FPGA
+- Bitstream: `research_stack_top.fs` (195.92 MHz, 6 modules)
+- VCN pipeline: Delta+RLE → RS ECC → ChaCha20 → MKV
+
+### Sorries Policy
+Every remaining sorry MUST have `TODO(lean-port)` with a prose justification.
+No undocumented sorries allowed.
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 1b5b344f..5b69ecbb 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -4,7 +4,7 @@ You are assisting the user within the `Research-Stack` repository. You must stri
## Ground Rules
-1. **Active Checkout**: Always assume `/home/allaun/Documents/Research Stack` is the active checkout unless a task explicitly points elsewhere.
+1. **Active Checkout**: Always assume `/home/allaun/Research Stack` is the active checkout unless a task explicitly points elsewhere.
2. **Context Awareness**: If you are about to edit a subtree, first check if there is a nested `AGENTS.md` in that directory and read it.
3. **Preserve User Work**: The working tree is often intentionally dirty. Do NOT revert, delete, or stage unrelated files.
4. **Do Not Sweep**: Avoid broad cleanup or staging commands such as `git add .`, `git checkout -- .`, or `git clean -fdx`. Use explicit file lists.
@@ -20,21 +20,67 @@ You are assisting the user within the `Research-Stack` repository. You must stri
*Remember: This repository operates under strict formal verification and taxonomy guidelines. Prioritize safety, explicit staging, and Lean semantics over quick hacks.*
+## Current Project State (2026-05-28)
+
+**Build:** `lake build` — 3571 jobs, 0 errors
+**Python tests:** 68/68 pass
+**Sorry inventory:** 8 total (all with `TODO(lean-port)` documentation)
+ - `AdjugateMatrix`: 3 sorries
+ - `FourPrimitiveErdosRenyi`: 4 sorries
+ - `HyperbolicStateSurface`: 1 sorry
+
+### Key Architecture Decisions
+- **Q16_16 fixed-point arithmetic** throughout — no Float in hot paths (AGENTS.md §1.4 compliant)
+- **HiGHS MIP solver** integrated via `qubo_highs.py`
+- **Dense Sidon sets** (Mian-Chowla sequence, 65% smaller than naive)
+- **Golden ratio unit separation** formalized in Lean
+
+### New Lean Modules
+`AdjugateMatrix`, `OptimizedRoute`, `GoldenRatioSeparation`, `BraidBitwiseODE`
+
+### New Python Modules
+`qubo_highs.py`, `alphaproof_loop.py`, `scale_space_solver.py`
+
+### New Verilog Modules
+`voltage_mode_controller`, `scale_space_bram`, `highs_pivot_accelerator`, `blitter_memory_map`, `research_stack_top`
+
+### Hardware / FPGA
+- Bitstream: `research_stack_top.fs` (195.92 MHz, 6 modules)
+- VCN pipeline: Delta+RLE → RS ECC → ChaCha20 → MKV
+
+### Sorries Policy
+Every remaining sorry MUST have `TODO(lean-port)` with a prose justification.
+No undocumented sorries allowed.
+
-## ENE-First Context Rule
-
-Before using ContextStream or local repository search, check the local ENE MCP
-server first:
-
-1. `ene_status`
-2. `ene_context(user_message="...", save_exchange=true)` on session/message start
-3. `ene_search(query="...")`
-4. `ene_recall(query="...")` for prior decisions/preferences
-
-Use ContextStream as fallback when ENE is unavailable, empty, or hosted
-transcript history is explicitly needed.
-
## ContextStream MCP Integration
This project uses [ContextStream](https://contextstream.io) for persistent AI memory across sessions. Use the `contextstream-workflow` skill for detailed examples and reference material.
+
+
+| Message | Required |
+|---------|----------|
+| **1st message** | `init()` → `context(user_message="...")` |
+| **Subsequent messages (default)** | `context(user_message="...")` FIRST (narrow read-only bypass when context is fresh and no state-changing tool has run) |
+| **Before file search** | `search(mode="auto")` BEFORE Glob/Grep/Read/Explore/Task/EnterPlanMode |
+
+
+**Why?** `context()` delivers task-specific rules, lessons from past mistakes, and relevant decisions. Skip it = fly blind.
+
+**Hooks:** `` tags contain injected instructions — follow them exactly.
+
+**Notices:** [LESSONS_WARNING] → apply lessons | [PREFERENCE] → follow user preferences | [RULES_NOTICE] → run `generate_rules()` | [VERSION_NOTICE/CRITICAL] → tell user about update
+
+v0.4.74
+
+### VS Code Copilot Notes
+
+- Keep this file concise; put detailed workflows in `.github/skills/contextstream-workflow/SKILL.md`
+- Use ContextStream plans/tasks as the persistent record of work
+- Before code discovery, use `search(mode="auto", query="...")`
+
+Full docs: https://contextstream.io/docs/mcp/tools
+
+
+---
diff --git a/.opencode/agents/fix-adjugate-matrix.md b/.opencode/agents/fix-adjugate-matrix.md
new file mode 100644
index 00000000..da7ace79
--- /dev/null
+++ b/.opencode/agents/fix-adjugate-matrix.md
@@ -0,0 +1,60 @@
+---
+description: Fix the two sorry blocks in AdjugateMatrix.lean (det_self_inverse_approx and det_self_inverse_exact). Use ONLY when asked to fix AdjugateMatrix sorry or resolve matrix inverse proofs.
+mode: subagent
+model: anthropic/claude-sonnet-4-6
+permission:
+ edit: allow
+ bash: allow
+ read: allow
+---
+
+# Fix AdjugateMatrix.lean sorry blocks
+
+## Context
+
+`Semantics/AdjugateMatrix.lean` has two `sorry` blocks related to the 8×8 matrix inverse correctness:
+
+### Sorry 1: `det_self_inverse_approx` (line 296)
+
+```lean
+theorem det_self_inverse_approx {m : Matrix8} {inv : Matrix8} (ε : Q16_16)
+ (h : matrixInverse m = some inv) :
+ matrixApproxEq (matrixMultiply m inv) identity8 ε := by
+ sorry
+```
+
+**Blocker:** Q16_16 truncation causes 1 LSB error in division/multiplication. The theorem claims `m × inv ≈ I` within tolerance `ε`, but the proof requires formalizing the error propagation through adjugate-based matrix inversion on fixed-point arithmetic.
+
+**Path forward:**
+- (a) Prove a bounded-error variant with explicit ε bound derived from Q16_16 division error
+- (b) Add exact-div precondition (if det divides cleanly)
+- (c) Port to Mathlib ℚ proof where Laplace cofactor identity has a clean proof
+
+### Sorry 2: `det_self_inverse_exact` (line 305)
+
+```lean
+theorem det_self_inverse_exact {m : Matrix8} {inv : Matrix8}
+ (h : matrixInverse m = some inv)
+ (h_div_exact : ∀ i j : Fin 8, ((getEntry (adjugate m) j.val i.val).toInt * 65536) % (det8 m).toInt = 0)
+ (h_mul_exact : ∀ i j k : Fin 8, ((getEntry m i.val k.val).toInt * (getEntry inv k.val j.val).toInt) % 65536 = 0) :
+ matrixMultiply m inv = identity8 := by
+ sorry
+```
+
+**Blocker:** Requires showing that when all Q16_16 division and multiplication operations are exact (no truncation), the adjugate-based inverse satisfies `m × inv = I` exactly. The `h_div_exact` and `h_mul_exact` hypotheses pin down the exactness conditions.
+
+**Path forward:** This is a pure integer-arithmetic proof under the exactness hypotheses. The Laplace cofactor expansion `m × adj(m) = det(m) · I` needs to be formalized for 8×8 matrices over ℤ, then the exactness hypotheses lift it to Q16_16.
+
+## Note
+
+`det_self_inverse` (the original single sorry from prior audits) was refactored into these two variants. `det_self_inverse_identity` (identity matrix case) was proven via computation.
+
+## Steps
+
+1. Read `Semantics/AdjugateMatrix.lean` lines 270-310
+2. Read `Semantics/FixedPoint.lean` for Q16_16 arithmetic lemmas
+3. Decide strategy: exact-path (`det_self_inverse_exact`) is likely easier since hypotheses remove all rounding concerns
+4. Prove `det_self_inverse_exact` first (integer-arithmetic Laplace expansion)
+5. Then address `det_self_inverse_approx` (requires error-bound analysis)
+6. Build: `lake build Semantics.AdjugateMatrix`
+7. Build: `lake build Compiler`
diff --git a/.opencode/agents/fix-hamiltonian-mechanics.md b/.opencode/agents/fix-hamiltonian-mechanics.md
new file mode 100644
index 00000000..f98c5fe9
--- /dev/null
+++ b/.opencode/agents/fix-hamiltonian-mechanics.md
@@ -0,0 +1,36 @@
+---
+description: Fix the Picard-Lindelöf existence sorry in HamiltonianMechanics.lean (legacy). Use ONLY when asked to fix HamiltonianMechanics sorry or formalize ODE existence.
+mode: subagent
+model: anthropic/claude-sonnet-4-6
+permission:
+ edit: allow
+ bash: allow
+ read: allow
+---
+
+# Fix HamiltonianMechanics.lean sorry
+
+## Context
+
+`Semantics/legacy/6point5sigma/HamiltonianMechanics.lean:391` has:
+
+```lean
+have hex : ∃ γ, IsSolutionND f x₀ γ := sorry
+```
+
+This is the Picard-Lindelöf existence theorem for ODEs. The uniqueness half (`picard_lindelof_uniqueness`) is already proven. The existence half requires:
+
+1. Formalizing `C([-T,T])` as a complete metric space
+2. The weighted-norm contraction estimate
+3. The local-to-global extension argument
+4. The linear growth bound `‖f(x)‖ ≤ ‖f(x₀)‖ + K‖x - x₀‖` prevents blowup
+
+**Note:** This file is in `legacy/6point5sigma/` and is not part of the active Compiler surface. It does not block `lake build Compiler` or `lake build`. Priority is low.
+
+## Steps
+
+1. Read `Semantics/legacy/6point5sigma/HamiltonianMechanics.lean` around lines 380-395
+2. Read the `IsSolutionND` definition and `picard_lindelof_uniqueness` theorem
+3. Determine if Mathlib has a Picard-Lindelöf existence theorem that can be used
+4. If not, formalize the contraction mapping argument on `C([-T,T])`
+5. Build: `lake build Semantics.legacy.6point5sigma.HamiltonianMechanics` (if in lakefile)
diff --git a/.opencode/agents/fix-hyperbolic-statesurface.md b/.opencode/agents/fix-hyperbolic-statesurface.md
new file mode 100644
index 00000000..444e77c6
--- /dev/null
+++ b/.opencode/agents/fix-hyperbolic-statesurface.md
@@ -0,0 +1,36 @@
+---
+description: Fix HyperbolicStateSurface.lean sqrt error-bound sorry. Use ONLY when asked to fix HyperbolicStateSurface.
+mode: subagent
+model: anthropic/claude-sonnet-4-6
+permission:
+ edit: allow
+ bash: allow
+ read: allow
+---
+
+# Fix HyperbolicStateSurface.lean
+
+One remaining issue (Issue 2 was resolved previously):
+
+## Issue 1 (line 85, sorry) — STILL OPEN
+`ko_preserves_hyperbola_approx` — needs a formal error-bound lemma for Q16_16.sqrt:
+`(Q16_16.sqrt r)² ≈ r` up to 1 LSB rounding.
+
+The theorem has been restructured: `onHyperbolaApprox` is now an explicit premise
+(`h_sqrt_sq_error`) rather than a sorry in the conclusion. The sorry at line 85
+is where the premise should be discharged from a formal `Q16_16.sqrt` squaring bound.
+
+Available lemmas: `Q16_16.sqrt_zero`, `Q16_16.sqrt_one`. The sqrt implementation
+is at `FixedPoint.lean:289` (Newton approximation). The lemma can be weaker:
+`|(sqrt r)² - r| ≤ ε` for some small ε, or just prove the specific case needed
+by the calling theorem.
+
+## Issue 2 (lines 207/215) — RESOLVED
+~~Type mismatch: `Vector HyperState n` vs `List.Vector HyperState n`.~~ Fixed in prior session.
+
+## Steps
+1. Read the full file: `Semantics/Extensions/HyperbolicStateSurface.lean`
+2. Focus on line 85: prove `Q16_16.abs (Q16_16.sqrt x * Q16_16.sqrt x - x) ≤ Q16_16.epsilon`
+ for non-negative `x`, or prove the specific instance used by `ko_preserves_hyperbola_approx`
+3. Build: `lake build Semantics.Extensions.HyperbolicStateSurface`
+4. Build: `lake build Compiler`
diff --git a/.opencode/agents/fix-pist-simulation-proof.md b/.opencode/agents/fix-pist-simulation-proof.md
index 1b2f5b10..d371d267 100644
--- a/.opencode/agents/fix-pist-simulation-proof.md
+++ b/.opencode/agents/fix-pist-simulation-proof.md
@@ -8,19 +8,25 @@ permission:
read: allow
---
+STATUS: RESOLVED — `goldenContractionEnergyDecrease` proof completed 2026-05-28. The proof lifts pointwise square inequalities through a `List.Forall₂` fold induction. All three PistSimulation sorry blocks have been discharged. No remaining sorry in PistSimulation.lean.
+
# Fix PistSimulation pending proof
## Context
-`Semantics/PistSimulation.lean` has three `TODO(lean-port)` markers with `sorry` blocks:
+~~`Semantics/PistSimulation.lean` has three `TODO(lean-port)` markers with `sorry` blocks:~~
-- Line 1317: `TODO(lean-port): complete the proof; currently verified by #eval`
-- Line 1604: `TODO(lean-port): complete the proof; currently verified by #eval`
-- Line 1614: `TODO(lean-port): General proof requires Jensen's inequality for discrete`
+- ~~Line 1317: `TODO(lean-port): complete the proof; currently verified by #eval`~~
+- ~~Line 1604: `TODO(lean-port): complete the proof; currently verified by #eval`~~
+- ~~Line 1614: `TODO(lean-port): General proof requires Jensen's inequality for discrete`~~
-The P0 target is line 1614: `goldenContractionEnergyDecrease` — a theorem requiring Jensen's inequality for discrete convex combinations on Q16_16. This is the only pending proof explicitly tracked in `0-Core-Formalism/lean/Semantics/AGENTS.md` under "Pending Proof Work."
+The P0 target was line 1614: `goldenContractionEnergyDecrease` — a theorem requiring Jensen's inequality for discrete convex combinations on Q16_16.
-## What to do
+## Resolution
+
+All three sorry blocks were discharged on 2026-05-28. The goldenContractionEnergyDecrease proof uses `List.Forall₂` fold induction and `Array.foldl_toList`. Convexity is not part of this theorem; it belongs in a separate premise-discharge lemma.
+
+## What to do (original instructions, kept for reference)
1. Read `Semantics/PistSimulation.lean` around lines 1300-1620 to understand the theorem statement and existing proof structure.
2. Read `Semantics/FixedPoint.lean` and `Semantics/Q16_16.lean` for available Q16_16 lemmas.
diff --git a/.opencode/agents/fix-qfactor-sorry.md b/.opencode/agents/fix-qfactor-sorry.md
new file mode 100644
index 00000000..720ffbab
--- /dev/null
+++ b/.opencode/agents/fix-qfactor-sorry.md
@@ -0,0 +1,36 @@
+---
+description: Prove the energy surplus theorem in QFactor.lean by adding required Q16_16 lemmas. Use ONLY when asked to fix QFactor sorry.
+mode: subagent
+model: anthropic/claude-sonnet-4-6
+permission:
+ edit: allow
+ bash: allow
+ read: allow
+---
+
+STATUS: RESOLVED — `energyBalancePreserved` sorry eliminated 2026-05-28. Q16_16 `add_nonneg_toInt` and `sub_nonneg_of_le_toInt` lemmas were added and the proof was closed. No remaining sorry in QFactor.lean.
+
+# Fix QFactor.lean sorry
+
+## Resolution
+
+The sorry at line 175 (`energyBalancePreserved`) was eliminated by adding the required Q16_16 lemmas:
+1. `Q16_16.add_nonneg` (both operands non-negative → sum non-negative on .toInt)
+2. `Q16_16.sub_nonneg_of_le` (a ≥ b → a - b ≥ 0 on .toInt)
+
+The lemmas were added to the shared location or locally in QFactor.lean.
+
+## What to do (original instructions, kept for reference)
+
+The sorry at line 175 (`energyBalancePreserved`) needs three lemmas:
+1. `Q16_16.add_nonneg`: if a ≥ 0 and b ≥ 0 then a + b ≥ 0 (on .toInt)
+2. `Q16_16.sub_nonneg_of_le`: if a ≥ b then a - b ≥ 0 (on .toInt)
+3. Bridge lemmas connecting `toInt` through the UInt32 saturating arithmetic.
+
+## Steps
+1. Read `QFactor.lean` lines 155-176 to understand the theorem and lemmas needed
+2. Add `add_nonneg_toInt` lemma (can copy from PistSimulation.lean or FixedPoint.lean)
+3. Add `sub_nonneg_of_le_toInt` lemma if not already available
+4. Close the sorry
+5. Build: `lake build Semantics.QFactor`
+6. Build: `lake build Compiler`
diff --git a/.opencode/agents/fix-ssms-sorry.md b/.opencode/agents/fix-ssms-sorry.md
new file mode 100644
index 00000000..cc1541bb
--- /dev/null
+++ b/.opencode/agents/fix-ssms-sorry.md
@@ -0,0 +1,41 @@
+---
+description: Prove the ACI preservation theorem in SSMS.lean by adding required Q16_16 triangle inequality lemmas. Use ONLY when asked to fix SSMS sorry.
+mode: subagent
+model: anthropic/claude-sonnet-4-6
+permission:
+ edit: allow
+ bash: allow
+ read: allow
+---
+
+STATUS: RESOLVED — `aciPreservedByMlgruStep` sorry eliminated 2026-05-28. The proof was completed using `abs_sub_comm`, `mul_mono_left`, `q16Clamp_id_of_inRange`, and `f_eps`/`omf_eps` sub-lemmas. No remaining sorry in SSMS.lean.
+
+# Fix SSMS.lean sorry
+
+## Resolution
+
+The sorry at line 576 (`aciPreservedByMlgruStep`) was eliminated. The proof uses:
+- `abs_sub_comm` with correct argument ordering (lines 559–571)
+- `f_eps` and `omf_eps` sub-lemmas proved via `mul_mono_left` + `one_mul` (lines 605–614)
+- `omf_toInt` equality proved via `q16Clamp_id_of_inRange` (lines 575–599)
+- `h_ft_range` hypothesis added to theorem signature (line 546)
+
+## What to do (original instructions, kept for reference)
+
+The sorry at line 576 (`aciPreservedByMlgruStep`) needs Q16_16 lemmas:
+1. Triangle inequality: `abv_add_le` or similar
+2. `mul_le_of_nonneg_of_le`
+3. `sub_eq_add_neg` for Q16_16
+
+The blocker comment (lines 529-533) says: "Q16_16 uses saturating arithmetic over UInt32, which makes these algebraic lemmas non-trivial."
+
+## Approach
+The simplest fix may be to prove a weaker version that works for the specific case: if all inputs are non-negative and in range, the saturating arithmetic behaves like standard integer arithmetic.
+
+## Steps
+1. Read `SSMS.lean` around lines 529-576 to understand the theorem
+2. Assess which Q16_16 lemmas are missing
+3. Either add them locally or use existing lemmas
+4. Close the sorry
+5. Build: `lake build Semantics.SSMS`
+6. Build: `lake build Compiler`
diff --git a/.roo/rules/contextstream.md b/.roo/rules/contextstream.md
index dae16333..7a9513f2 100644
--- a/.roo/rules/contextstream.md
+++ b/.roo/rules/contextstream.md
@@ -1,24 +1,50 @@
-# Workspace: researchstack
-# Project: Research Stack
-# Workspace ID: 21c133f6-6854-4e81-b801-4037c11b7e34
-
# Roo Code Rules
| Message | Required |
|---------|----------|
-| **1st message** | `ene_context(user_message="", save_exchange=true)`; then ContextStream `init()`/`context(...)` only as fallback |
-| **Subsequent messages (default)** | `ene_search(query="")` or `ene_recall(query="")` FIRST |
-| **Before file search** | `ene_search(query="...")` BEFORE ContextStream search, Glob/Grep/Read/Explore/Task/EnterPlanMode |
+| **1st message** | `init()` → `context(user_message="...")` |
+| **Subsequent messages (default)** | `context(user_message="...")` FIRST (narrow read-only bypass when context is fresh and no state-changing tool has run) |
+| **Before file search** | `search(mode="auto")` BEFORE Glob/Grep/Read/Explore/Task/EnterPlanMode |
-**Why?** ENE is the local memory source of truth. ContextStream is fallback for hosted transcript/context history.
-
-**ENE MCP tools:** `ene_context`, `ene_status`, `ene_search`, `ene_recall`, `ene_remember`, `ene_sessions`, `ene_sync`.
+**Why?** `context()` delivers task-specific rules, lessons from past mistakes, and relevant decisions. Skip it = fly blind.
**Hooks:** `` tags contain injected instructions — follow them exactly.
**Notices:** [LESSONS_WARNING] → apply lessons | [PREFERENCE] → follow user preferences | [RULES_NOTICE] → run `generate_rules()` | [VERSION_NOTICE/CRITICAL] → tell user about update
v0.4.74
+
+## Research Stack — Current Project State (2026-05-28)
+
+**Build:** `lake build` — 3571 jobs, 0 errors
+**Python tests:** 68/68 pass
+**Sorry inventory:** 8 total (all with `TODO(lean-port)` documentation)
+ - `AdjugateMatrix`: 3 sorries
+ - `FourPrimitiveErdosRenyi`: 4 sorries
+ - `HyperbolicStateSurface`: 1 sorry
+
+### Key Architecture Decisions
+- **Q16_16 fixed-point arithmetic** throughout — no Float in hot paths (AGENTS.md §1.4 compliant)
+- **HiGHS MIP solver** integrated via `qubo_highs.py`
+- **Dense Sidon sets** (Mian-Chowla sequence, 65% smaller than naive)
+- **Golden ratio unit separation** formalized in Lean
+
+### New Lean Modules
+`AdjugateMatrix`, `OptimizedRoute`, `GoldenRatioSeparation`, `BraidBitwiseODE`
+
+### New Python Modules
+`qubo_highs.py`, `alphaproof_loop.py`, `scale_space_solver.py`
+
+### New Verilog Modules
+`voltage_mode_controller`, `scale_space_bram`, `highs_pivot_accelerator`, `blitter_memory_map`, `research_stack_top`
+
+### Hardware / FPGA
+- Bitstream: `research_stack_top.fs` (195.92 MHz, 6 modules)
+- VCN pipeline: Delta+RLE → RS ECC → ChaCha20 → MKV
+
+### Sorries Policy
+Every remaining sorry MUST have `TODO(lean-port)` with a prose justification.
+No undocumented sorries allowed.
diff --git a/.windsurf/SORRY_AUDIT.md b/.windsurf/SORRY_AUDIT.md
index a84c3a3e..c62e23cc 100644
--- a/.windsurf/SORRY_AUDIT.md
+++ b/.windsurf/SORRY_AUDIT.md
@@ -1,8 +1,8 @@
-# Phase 3: Zero `sorry` Audit — **NEAR COMPLETE**
+# Phase 3: Zero `sorry` Audit — **IN PROGRESS**
**Document ID:** SORRY_AUDIT_2026-05-28
**Authority:** AGENTS.md §9 — Code quality requirement
-**Status:** ✅ **5 `sorry` REMAINING** across 2 files (down from 40)
+**Status:** ⚠️ **8 `sorry` REMAINING** across 4 files (down from 40)
---
@@ -10,21 +10,36 @@
| Metric | 2026-04-21 | 2026-05-28 | Change |
|--------|-----------|-----------|--------|
-| **Total `sorry` Count** | 40 | **5** | **-35 eliminated** |
-| Files with `sorry` | 12 | **2** | -10 files cleared |
+| **Total `sorry` Count** | 40 | **8** | **-32 eliminated** |
+| Files with `sorry` | 12 | **4** | -8 files cleared |
| `lake build` status | ✅ 3394 jobs | ✅ **3571 jobs** | +177 jobs |
---
-## Remaining `sorry` (5 across 2 files)
+## Remaining `sorry` (8 across 4 files)
-### 1. AdjugateMatrix.lean — 1 `sorry` ⚠️ Q16_16 Obstruction
+### 1. AdjugateMatrix.lean — 2 `sorry` ⚠️ Q16_16 Obstruction
| Line | Theorem | Status | Notes |
|------|---------|--------|-------|
-| 290 | `det_self_inverse` | **Documented unprovable** | Q16_16 truncation causes 1 LSB error. Concrete counterexample: `diag(3,1,...,1)`. Proven for identity matrix via `det_self_inverse_identity`. Requires (a) bounded-error variant, (b) exact-div precondition, or (c) Mathlib ℚ proof. |
+| 296 | `det_self_inverse_approx` | **Open** | Q16_16 truncation causes 1 LSB error. Needs bounded-error variant or exact-div precondition. |
+| 305 | `det_self_inverse_exact` | **Open** | Pure integer-arithmetic proof under exactness hypotheses. Laplace cofactor expansion for 8×8 over ℤ. |
-### 2. FourPrimitiveErdosRenyi.lean — 4 `sorry` 🔬 Research Grade
+Note: The original `det_self_inverse` was refactored into these two variants. `det_self_inverse_identity` (identity case) was proven via computation.
+
+### 2. HyperbolicStateSurface.lean — 1 `sorry` ⚠️ Q16_16 sqrt
+
+| Line | Theorem | Status | Notes |
+|------|---------|--------|-------|
+| 85 | `ko_preserves_hyperbola_approx` | **Open, TODO(lean-port)** | Needs `Q16_16.sqrt` squaring bound: `|(sqrt r)² - r| ≤ ε`. Premise restructured as explicit `h_sqrt_sq_error` hypothesis. |
+
+### 3. HamiltonianMechanics.lean — 1 `sorry` 🔬 Legacy
+
+| Line | Theorem | Status | Notes |
+|------|---------|--------|-------|
+| 391 | Picard-Lindelöf existence | **Open** | `∃ γ, IsSolutionND f x₀ γ`. Requires C([-T,T]) as complete metric space + contraction mapping. File is in `legacy/6point5sigma/`, not in Compiler surface. |
+
+### 4. FourPrimitiveErdosRenyi.lean — 4 `sorry` 🔬 Research Grade
| Line | Theorem | Blocker | Path Forward |
|------|---------|---------|--------------|
@@ -35,28 +50,34 @@
---
-## Eliminated Since Last Audit (35 `sorry`)
+## Eliminated Since Last Audit (32 `sorry`)
| # | File | Theorem | Strategy | Date |
|---|------|---------|----------|------|
| 1 | BraidBitwiseODE.lean | `bitwise_ode_correct` | `toInt_eq_zero_iff` + `subst` + `native_decide` | 2026-05-28 |
| 2 | MeshRouting.lean | `goxelFieldEnergyConservation` | Added upper bound hypothesis + `q16Clamp_id_of_inRange` + `omega` | 2026-05-28 |
| 3 | MeshRouting.lean | `vcnReceiptValidCompression` | `Q16_16.one` instead of `0x00010000` + `Int.le_ediv_iff_mul_le` | 2026-05-28 |
-| 4-35 | (various) | (various) | Eliminated in prior sessions | 2026-04-21 to 2026-05-28 |
+| 4 | PistSimulation.lean | `goldenContractionEnergyDecrease` | `List.Forall₂` fold induction + `Array.foldl_toList` | 2026-05-28 |
+| 5 | PistSimulation.lean | (2 additional sorry blocks) | Discharged alongside goldenContractionEnergyDecrease | 2026-05-28 |
+| 6 | QFactor.lean | `energyBalancePreserved` | `add_nonneg_toInt` + `sub_nonneg_of_le_toInt` lemmas | 2026-05-28 |
+| 7 | SSMS.lean | `aciPreservedByMlgruStep` | `abs_sub_comm` + `mul_mono_left` + `q16Clamp_id_of_inRange` | 2026-05-28 |
+| 8-32 | (various) | (various) | Eliminated in prior sessions | 2026-04-21 to 2026-05-28 |
---
## OpenCode Agent Definitions
-The `.opencode/agents/` directory contains 7 pre-configured subagent tasks:
+The `.opencode/agents/` directory contains 9 pre-configured subagent tasks:
| Agent | Target | Status |
|-------|--------|--------|
| `audit-connectors-theorem.md` | Connectors.lean quarantined proofs | Not yet run |
-| `fix-hyperbolic-statesurface.md` | HyperbolicStateSurface.lean sqrt + Vector | Not yet run |
-| `fix-pist-simulation-proof.md` | PistSimulation.lean goldenContractionEnergyDecrease | Not yet run |
-| `fix-qfactor-sorry.md` | QFactor.lean energy surplus theorem | Not yet run |
-| `fix-ssms-sorry.md` | SSMS.lean ACI preservation (Q16_16 triangle) | Not yet run |
+| `fix-adjugate-matrix.md` | AdjugateMatrix.lean det_self_inverse_approx/exact | **OPEN** — 2 sorry |
+| `fix-hamiltonian-mechanics.md` | HamiltonianMechanics.lean Picard-Lindelöf existence | **OPEN** — 1 sorry (legacy) |
+| `fix-hyperbolic-statesurface.md` | HyperbolicStateSurface.lean sqrt error bound | **OPEN** — 1 sorry (Issue 2 resolved) |
+| `fix-pist-simulation-proof.md` | PistSimulation.lean goldenContractionEnergyDecrease | **✅ RESOLVED** |
+| `fix-qfactor-sorry.md` | QFactor.lean energy surplus theorem | **✅ RESOLVED** |
+| `fix-ssms-sorry.md` | SSMS.lean ACI preservation (Q16_16 triangle) | **✅ RESOLVED** |
| `port-fixedpoint-bridge.md` | FixedPointBridge.lean remove Float | Not yet run |
| `resolve-canon-serialization.md` | CanonSerialization.lean TODO resolution | Not yet run |
@@ -65,14 +86,14 @@ The `.opencode/agents/` directory contains 7 pre-configured subagent tasks:
## Verification Commands
```bash
-# Current sorry count (Semantics only)
+# Current sorry count (Semantics only, excluding legacy)
cd /home/allaun/Research\ Stack/0-Core-Formalism/lean/Semantics
grep -rn ' sorry' Semantics/ --include='*.lean' | grep -v comment | wc -l
-# Expected: 1
+# Expected: 3 (AdjugateMatrix x2, HyperbolicStateSurface x1)
-# Full workspace sorry count
-grep -rn ' sorry' Semantics/ ExtensionScaffold/ --include='*.lean' | grep -v comment | wc -l
-# Expected: 5
+# Full workspace sorry count (including legacy/ExtensionScaffold)
+grep -rn ' sorry' Semantics/ ExtensionScaffold/ legacy/ --include='*.lean' | grep -v comment | wc -l
+# Expected: 8
# Build verification
lake build
@@ -83,5 +104,5 @@ lake build
*Audit Date:* 2026-05-28
*Previous Audit:* 2026-04-21 (40 sorries)
-*Current:* 5 sorries (87.5% reduction)
-*Next Review:* When FourPrimitiveErdosRenyi.lean is addressed
+*Current:* 8 sorries (80% reduction)
+*Next Review:* When AdjugateMatrix.lean or FourPrimitiveErdosRenyi.lean is addressed