26382a7ac6
CI / Clippy (push) Failing after 15m13s
CI / Test (ubuntu-latest) (push) Failing after 16m1s
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Build (no embeddings / no ORT) (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Cookbook (Node) (push) Has been cancelled
CI / Pi Extension (Node) (push) Has been cancelled
CI / Rust SDK (lean-ctx-client) (push) Has been cancelled
CI / Embed SDK (lean-ctx-sdk) (push) Has been cancelled
CI / Python SDK (leanctx) (push) Has been cancelled
CI / Hermes Plugin (Python) (push) Has been cancelled
CI / SDK Conformance Matrix (push) Has been cancelled
CI / Coverage (push) Has been cancelled
CI / cargo-deny (push) Has been cancelled
CI / Adversarial Safety (push) Has been cancelled
CI / Benchmarks (push) Has been cancelled
CI / Output-Quality Gate (eval A/B) (push) Has been cancelled
CI / Documentation (push) Has been cancelled
CI / CI Green (push) Has been cancelled
JetBrains Plugin / Actionlint (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CodeQL / Analyze (rust) (push) Has been cancelled
JetBrains Plugin / Validation (push) Has been cancelled
JetBrains Plugin / Build (push) Has been cancelled
JetBrains Plugin / Test (push) Has been cancelled
Security Check / Security Scan (push) Has been cancelled
189 lines
7.6 KiB
Lean4
189 lines
7.6 KiB
Lean4
/-
|
||
LeanCTX Formal Verification — Terse Compression Engine Invariants
|
||
|
||
Proves correctness properties of the 4-layer terse compression engine:
|
||
- Passthrough guarantee for Off level
|
||
- Structural marker protection
|
||
- Filler/decoration removal rules
|
||
- Max-to-Standard fallback correctness
|
||
- Threshold ordering across levels
|
||
|
||
Mirrors: rust/src/core/terse/engine.rs, rust/src/core/terse/pipeline.rs
|
||
Enterprise guarantee: these proofs ensure the compression engine
|
||
never silently destroys information.
|
||
|
||
Scientific basis:
|
||
- Surprisal-based information density (Shannon 1948)
|
||
- Structural marker preservation (analogous to Named Entity Recognition)
|
||
-/
|
||
import LeanCtxProofs.Basic
|
||
|
||
namespace LeanCtxProofs.Compression.TerseEngine
|
||
|
||
-- ============================================================================
|
||
-- Core Types (mirror rust/src/core/config.rs + engine.rs)
|
||
-- ============================================================================
|
||
|
||
/-- Compression levels, ordered by aggressiveness.
|
||
Mirrors `CompressionLevel` in config.rs. -/
|
||
inductive CompressionLevel where
|
||
| off
|
||
| lite
|
||
| standard
|
||
| max
|
||
deriving DecidableEq, Repr
|
||
|
||
/-- A scored text line with information density metadata. -/
|
||
structure ScoredLine where
|
||
content : String
|
||
score : Nat
|
||
hasStructuralMarker : Bool
|
||
isEmpty : Bool
|
||
isPureDecoration : Bool
|
||
isFiller : Bool
|
||
deriving DecidableEq, Repr
|
||
|
||
/-- Whether a compression level is active (not Off). -/
|
||
def CompressionLevel.isActive : CompressionLevel → Bool
|
||
| .off => false
|
||
| _ => true
|
||
|
||
/-- Score threshold for each level (scaled ×10 for Nat precision).
|
||
Mirrors constants in engine.rs: 2.5→25, 3.0→30, 3.5→35. -/
|
||
def scoreThreshold : CompressionLevel → Nat
|
||
| .off => 0
|
||
| .lite => 25
|
||
| .standard => 30
|
||
| .max => 35
|
||
|
||
-- ============================================================================
|
||
-- Line Filtering (mirrors engine.rs filter logic)
|
||
-- ============================================================================
|
||
|
||
/-- A line should be removed if: empty, pure decoration, unprotected filler,
|
||
or below score threshold without structural markers. -/
|
||
def shouldRemove (level : CompressionLevel) (line : ScoredLine) : Bool :=
|
||
line.isEmpty ||
|
||
line.isPureDecoration ||
|
||
(line.isFiller && !line.hasStructuralMarker) ||
|
||
(line.score < scoreThreshold level && !line.hasStructuralMarker)
|
||
|
||
/-- The core filter: keep lines that should NOT be removed. -/
|
||
def filterLines (level : CompressionLevel) (lines : List ScoredLine) : List ScoredLine :=
|
||
lines.filter (! shouldRemove level ·)
|
||
|
||
/-- Max-level with fallback to Standard on quality failure. -/
|
||
def compressWithFallback (lines : List ScoredLine)
|
||
(maxQualityPassed : Bool) : List ScoredLine :=
|
||
if maxQualityPassed then filterLines .max lines
|
||
else filterLines .standard lines
|
||
|
||
-- ============================================================================
|
||
-- Engine Correctness Theorems
|
||
-- ============================================================================
|
||
|
||
/-- **Theorem 1 (Off Never Removes): Off level marks non-filler content for keeping.
|
||
(Off threshold is 0, so only empty/decoration/unprotected-filler lines are removed.) -/
|
||
theorem off_never_removes (line : ScoredLine)
|
||
(h_ne : line.isEmpty = false)
|
||
(h_nd : line.isPureDecoration = false)
|
||
(h_nf : line.isFiller = false) :
|
||
shouldRemove .off line = false := by
|
||
simp [shouldRemove, scoreThreshold, h_ne, h_nd, h_nf]
|
||
|
||
/-- **Theorem 2 (Structural Marker Safety): Lines with structural markers
|
||
are NEVER removed, regardless of compression level.** -/
|
||
theorem structural_markers_preserved (level : CompressionLevel) (line : ScoredLine)
|
||
(h_marker : line.hasStructuralMarker = true)
|
||
(h_not_empty : line.isEmpty = false)
|
||
(h_not_deco : line.isPureDecoration = false) :
|
||
shouldRemove level line = false := by
|
||
simp [shouldRemove, h_not_empty, h_not_deco, h_marker]
|
||
|
||
/-- **Theorem 3 (Empty Lines Always Removed): Empty lines are removed
|
||
at any compression level.** -/
|
||
theorem empty_lines_always_removed (level : CompressionLevel) (line : ScoredLine)
|
||
(h_empty : line.isEmpty = true) :
|
||
shouldRemove level line = true := by
|
||
simp [shouldRemove, h_empty]
|
||
|
||
/-- **Theorem 4 (Decoration Always Removed): Pure decoration lines are
|
||
removed at any compression level.** -/
|
||
theorem decoration_always_removed (level : CompressionLevel) (line : ScoredLine)
|
||
(h_deco : line.isPureDecoration = true) :
|
||
shouldRemove level line = true := by
|
||
simp [shouldRemove, h_deco]
|
||
|
||
/-- **Theorem 5 (Filler With Markers Kept): Filler lines that have structural
|
||
markers are NOT removed — the marker protects them.** -/
|
||
theorem filler_with_marker_kept (level : CompressionLevel) (line : ScoredLine)
|
||
(h_filler : line.isFiller = true)
|
||
(h_marker : line.hasStructuralMarker = true)
|
||
(h_not_empty : line.isEmpty = false)
|
||
(h_not_deco : line.isPureDecoration = false) :
|
||
shouldRemove level line = false := by
|
||
simp [shouldRemove, h_not_empty, h_not_deco, h_filler, h_marker]
|
||
|
||
/-- **Theorem 6 (Filter is Subset): Filtered output is always a subset of input.** -/
|
||
theorem filter_subset (level : CompressionLevel) (lines : List ScoredLine) :
|
||
∀ l ∈ filterLines level lines, l ∈ lines := by
|
||
intro l hl
|
||
simp [filterLines, List.mem_filter] at hl
|
||
exact hl.1
|
||
|
||
/-- **Theorem 7 (Threshold Monotonicity): Lite ≤ Standard threshold.** -/
|
||
theorem lite_le_standard : scoreThreshold .lite ≤ scoreThreshold .standard := by
|
||
native_decide
|
||
|
||
/-- **Theorem 8 (Threshold Monotonicity): Standard ≤ Max threshold.** -/
|
||
theorem standard_le_max : scoreThreshold .standard ≤ scoreThreshold .max := by
|
||
native_decide
|
||
|
||
/-- **Theorem 9 (Threshold Monotonicity): Lite ≤ Max threshold.** -/
|
||
theorem lite_le_max : scoreThreshold .lite ≤ scoreThreshold .max := by
|
||
native_decide
|
||
|
||
/-- **Theorem 10 (Fallback Returns Standard): When Max quality fails,
|
||
fallback returns Standard compression.** -/
|
||
theorem fallback_on_failure (lines : List ScoredLine) :
|
||
compressWithFallback lines false = filterLines .standard lines := by
|
||
simp [compressWithFallback]
|
||
|
||
/-- **Theorem 11 (Fallback Uses Max): When Max quality passes,
|
||
fallback returns Max compression.** -/
|
||
theorem fallback_on_success (lines : List ScoredLine) :
|
||
compressWithFallback lines true = filterLines .max lines := by
|
||
simp [compressWithFallback]
|
||
|
||
/-- **Theorem 12 (Off Not Active): Off level is never active.** -/
|
||
theorem off_not_active : CompressionLevel.isActive .off = false := by rfl
|
||
|
||
/-- **Theorem 13 (Lite Active): Lite level is active.** -/
|
||
theorem lite_is_active : CompressionLevel.isActive .lite = true := by rfl
|
||
|
||
/-- **Theorem 14 (Standard Active): Standard level is active.** -/
|
||
theorem standard_is_active : CompressionLevel.isActive .standard = true := by rfl
|
||
|
||
/-- **Theorem 15 (Max Active): Max level is active.** -/
|
||
theorem max_is_active : CompressionLevel.isActive .max = true := by rfl
|
||
|
||
/-- **Theorem 16 (Filter Empty): Filtering an empty list produces an empty list.** -/
|
||
theorem filter_empty (level : CompressionLevel) :
|
||
filterLines level [] = [] := by rfl
|
||
|
||
/-- **Theorem 17 (High Score Protected): A non-empty, non-decoration line with
|
||
score above Max threshold is never removed at any level.** -/
|
||
theorem high_score_kept (level : CompressionLevel) (line : ScoredLine)
|
||
(h_score : scoreThreshold .max ≤ line.score)
|
||
(h_not_empty : line.isEmpty = false)
|
||
(h_not_deco : line.isPureDecoration = false)
|
||
(h_not_filler : line.isFiller = false) :
|
||
shouldRemove level line = false := by
|
||
simp [shouldRemove, h_not_empty, h_not_deco, h_not_filler]
|
||
intro h_lt
|
||
have h_le : scoreThreshold level ≤ scoreThreshold .max := by
|
||
cases level <;> simp [scoreThreshold] <;> omega
|
||
omega
|
||
|
||
end LeanCtxProofs.Compression.TerseEngine
|