62 lines
1.8 KiB
Python
62 lines
1.8 KiB
Python
|
|
"""Plan 03-02 Task 2 Step 7: M6 context-repeat-rate LIVE tests."""
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
from iai_mcp.events import write_event
|
||
|
|
from iai_mcp.store import MemoryStore
|
||
|
|
from iai_mcp.trajectory import m6_context_repeat_rate_live
|
||
|
|
|
||
|
|
|
||
|
|
def test_m6_zero_on_empty_store(tmp_path):
|
||
|
|
store = MemoryStore(path=tmp_path)
|
||
|
|
assert m6_context_repeat_rate_live(store) == 0.0
|
||
|
|
|
||
|
|
|
||
|
|
def test_m6_repeat_rate_three_repeats_in_ten(tmp_path):
|
||
|
|
"""10 sessions, 3 repeated hashes -> repeat rate 0.3.
|
||
|
|
|
||
|
|
Layout: 7 distinct hashes + 3 reuses of one prior hash.
|
||
|
|
total=10, unique=7, (10-7)/10 = 0.3.
|
||
|
|
"""
|
||
|
|
store = MemoryStore(path=tmp_path)
|
||
|
|
distinct = [f"h{i}" for i in range(7)]
|
||
|
|
for h in distinct:
|
||
|
|
write_event(
|
||
|
|
store, kind="session_started",
|
||
|
|
data={"session_state_hash": h, "session_id": "s"},
|
||
|
|
severity="info",
|
||
|
|
)
|
||
|
|
# 3 reuses of "h0"
|
||
|
|
for _ in range(3):
|
||
|
|
write_event(
|
||
|
|
store, kind="session_started",
|
||
|
|
data={"session_state_hash": "h0", "session_id": "s"},
|
||
|
|
severity="info",
|
||
|
|
)
|
||
|
|
val = m6_context_repeat_rate_live(store)
|
||
|
|
assert val == pytest.approx(0.3, abs=1e-6)
|
||
|
|
|
||
|
|
|
||
|
|
def test_m6_all_unique_returns_zero(tmp_path):
|
||
|
|
store = MemoryStore(path=tmp_path)
|
||
|
|
for i in range(5):
|
||
|
|
write_event(
|
||
|
|
store, kind="session_started",
|
||
|
|
data={"session_state_hash": f"u{i}"},
|
||
|
|
severity="info",
|
||
|
|
)
|
||
|
|
assert m6_context_repeat_rate_live(store) == 0.0
|
||
|
|
|
||
|
|
|
||
|
|
def test_m6_all_repeats_returns_high(tmp_path):
|
||
|
|
store = MemoryStore(path=tmp_path)
|
||
|
|
for _ in range(5):
|
||
|
|
write_event(
|
||
|
|
store, kind="session_started",
|
||
|
|
data={"session_state_hash": "same"},
|
||
|
|
severity="info",
|
||
|
|
)
|
||
|
|
val = m6_context_repeat_rate_live(store)
|
||
|
|
assert val == pytest.approx(0.8, abs=1e-6) # (5-1)/5
|