a11oy / tests /test_conduction_aphasia.py
betterwithage's picture
sync(space): full source mirror — resolve all GitHub<->Space drift (CTO)
a6a5d8e verified
Raw
History Blame
12.9 kB
# SPDX-License-Identifier: Apache-2.0
# © 2026 Lutar, Stephen P. — SZL Holdings · ORCID 0009-0001-0110-4173
# Authored by Yachay (CTO). Co-Authored-By: Perplexity Computer Agent.
# Doctrine v11 LOCKED 749/14/163 · Λ Conjecture 1 · SLSA L1 honest
"""
tests/test_conduction_aphasia.py — pytest suite for the Conduction-Aphasia Detector.
Three core tests (per task spec):
1. Single observation below threshold -> no alert
2. N consecutive observations above threshold -> alert fires
3. Receipt is signed and has all required fields (lutar_anchor, neuro_citation, etc.)
Hickok citation: Hickok, Houde, Rong 2011, Neuron 69:407-422.
DOI 10.1016/j.neuron.2011.01.019
"""
from __future__ import annotations
import sys
import types
import os
import pytest
REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if REPO_ROOT not in sys.path:
sys.path.insert(0, REPO_ROOT)
# Stub szl_dsse if not present
for _mod in ("szl_dsse",):
if _mod not in sys.modules:
stub = types.ModuleType(_mod)
stub.sign_payload = lambda x, **kw: {"signed": False, "signatures": [], "honesty": "UNSIGNED stub"}
stub.signing_available = lambda: False
sys.modules[_mod] = stub
import conduction_aphasia as ca
def fresh_state(tau: float = 0.30, window: int = 3) -> ca._ConductionState:
return ca._ConductionState(tau=tau, window=window)
# ---------------------------------------------------------------------------
# Test 1 — Single observation below threshold -> no alert
# ---------------------------------------------------------------------------
class TestBelowThreshold:
"""A single observation with delta <= tau must not breach or raise an alert."""
def test_cosine_identical_inputs_no_breach(self):
state = fresh_state(tau=0.30, window=3)
receipt = state.observe("t1", [1.0, 0.5, 0.2], [1.0, 0.5, 0.2], metric="cosine")
assert receipt["breach"] is False
assert receipt["delta"] == pytest.approx(0.0, abs=1e-9)
assert receipt["alert_level"] == ca.ALERT_NORMAL
assert receipt["consecutive_breaches"] == 0
def test_l2_small_perturbation_no_breach(self):
state = fresh_state(tau=0.30, window=3)
receipt = state.observe("t2", [0.8, 0.6, 0.0], [0.81, 0.59, 0.01], metric="l2")
assert receipt["breach"] is False
assert receipt["delta"] < 0.30
assert receipt["alert_level"] == ca.ALERT_NORMAL
def test_hash_hamming_identical_no_breach(self):
state = fresh_state(tau=0.30, window=3)
receipt = state.observe("t3", "hello world", "hello world", metric="hash_hamming")
assert receipt["breach"] is False
assert receipt["delta"] == pytest.approx(0.0, abs=1e-9)
def test_status_shows_normal_after_clean(self):
state = fresh_state()
state.observe("t_clean", [1.0], [1.0], metric="cosine")
status = state.status()
assert status["current_alert_level"] == ca.ALERT_NORMAL
assert status["consecutive_breaches"] == 0
# ---------------------------------------------------------------------------
# Test 2 — N consecutive observations above threshold -> alert fires
# ---------------------------------------------------------------------------
class TestConsecutiveBreachesFireAlert:
def _high_pair(self):
return [1.0, 0.0, 0.0], [0.0, 0.0, 1.0] # orthogonal -> cosine dist = 1.0
def test_n_consecutive_fire_conduction_alert(self):
state = fresh_state(tau=0.30, window=3)
p, a = self._high_pair()
receipts = [state.observe(f"tick_{i}", p, a, metric="cosine") for i in range(3)]
assert receipts[0]["alert_level"] == ca.ALERT_WATCHING
assert receipts[1]["alert_level"] == ca.ALERT_WATCHING
assert receipts[2]["alert_level"] == ca.ALERT_CONDUCTION
assert receipts[2]["breach"] is True
assert receipts[2]["consecutive_breaches"] == 3
def test_status_after_n_breaches_is_alert(self):
state = fresh_state(tau=0.30, window=3)
p, a = self._high_pair()
for i in range(3):
state.observe(f"tick_s_{i}", p, a, metric="cosine")
status = state.status()
assert status["current_alert_level"] == ca.ALERT_CONDUCTION
assert status["last_alert_at"] is not None
def test_streak_resets_on_clean(self):
state = fresh_state(tau=0.30, window=3)
p, a = self._high_pair()
for i in range(2):
state.observe(f"breach_{i}", p, a, metric="cosine")
state.observe("clean", [1.0], [1.0], metric="cosine")
assert state._breach_streak == 0
def test_n_minus_one_only_watching(self):
state = fresh_state(tau=0.30, window=3)
p, a = self._high_pair()
for i in range(2):
state.observe(f"tick_{i}", p, a, metric="cosine")
assert state.status()["current_alert_level"] == ca.ALERT_WATCHING
def test_window_of_1_fires_immediately(self):
state = fresh_state(tau=0.05, window=1)
p, a = self._high_pair()
r = state.observe("immediate", p, a, metric="cosine")
assert r["alert_level"] == ca.ALERT_CONDUCTION
def test_breach_with_l2_metric(self):
state = fresh_state(tau=0.10, window=3)
p = [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
a = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
for i in range(3):
state.observe(f"l2_{i}", p, a, metric="l2")
assert state._current_alert == ca.ALERT_CONDUCTION
# ---------------------------------------------------------------------------
# Test 3 — Receipt has all required fields, lutar_anchor, neuro_citation
# ---------------------------------------------------------------------------
class TestReceiptSchema:
REQUIRED_FIELDS = [
"receipt_id", "kind", "tick_id", "predicted_hash", "actual_hash",
"delta", "metric", "threshold_tau", "breach", "alert_level",
"consecutive_breaches", "doctrine_v", "neuro_citation",
"lutar_anchor", "signed_by", "sig", "ts",
]
def _get_receipt(self, **kw):
state = fresh_state()
return state.observe(
tick_id=kw.get("tick_id", "schema_test"),
predicted_sensory=kw.get("predicted_sensory", [0.5, 0.5]),
actual_sensory=kw.get("actual_sensory", [0.5, 0.5]),
metric=kw.get("metric", "cosine"),
)
def test_all_required_fields_present(self):
r = self._get_receipt()
for field in self.REQUIRED_FIELDS:
assert field in r, f"Missing required field: {field}"
def test_lutar_anchor_value(self):
r = self._get_receipt()
assert r["lutar_anchor"] == "A37_InternalFeedbackIntegrity"
def test_neuro_citation_has_hickok_doi(self):
r = self._get_receipt()
nc = r["neuro_citation"]
assert isinstance(nc, dict)
assert nc.get("doi") == "10.1016/j.neuron.2011.01.019"
def test_neuro_citation_has_label(self):
r = self._get_receipt()
nc = r["neuro_citation"]
assert "Hickok" in nc.get("label", "")
assert "2011" in nc.get("label", "")
def test_kind_is_conduction_observation(self):
assert self._get_receipt()["kind"] == "conduction_observation"
def test_doctrine_v_is_11(self):
assert self._get_receipt()["doctrine_v"] == "11"
def test_signed_by_is_yachay(self):
assert self._get_receipt()["signed_by"] == "yachay"
def test_predicted_hash_format(self):
r = self._get_receipt(predicted_sensory=[0.1, 0.2])
assert r["predicted_hash"].startswith("sha256:")
def test_actual_hash_format(self):
r = self._get_receipt(actual_sensory=[0.4, 0.5])
assert r["actual_hash"].startswith("sha256:")
def test_receipt_ids_unique(self):
state = fresh_state()
r1 = state.observe("t_a", [1.0], [1.0], "cosine")
r2 = state.observe("t_b", [1.0], [1.0], "cosine")
assert r1["receipt_id"] != r2["receipt_id"]
def test_receipts_ring_newest_first(self):
state = fresh_state()
for i in range(3):
state.observe(f"order_{i}", [float(i)], [float(i)], "cosine")
receipts = state.receipts()
assert receipts[0]["tick_id"] == "order_2"
assert receipts[2]["tick_id"] == "order_0"
# ---------------------------------------------------------------------------
# Test 4 — Metric math
# ---------------------------------------------------------------------------
class TestMetricComputation:
def test_cosine_identical_zero(self):
assert ca._cosine_delta([1.0, 0.5], [1.0, 0.5]) == pytest.approx(0.0, abs=1e-9)
def test_cosine_orthogonal_one(self):
assert ca._cosine_delta([1.0, 0.0], [0.0, 1.0]) == pytest.approx(1.0, abs=1e-9)
def test_l2_identical_zero(self):
assert ca._l2_delta([3.0, 4.0], [3.0, 4.0]) == pytest.approx(0.0, abs=1e-9)
def test_l2_pythagorean(self):
assert ca._l2_delta([0.0, 0.0], [3.0, 4.0]) == pytest.approx(5.0, abs=1e-9)
def test_hamming_identical_zero(self):
assert ca._hash_hamming_delta("abc", "abc") == pytest.approx(0.0, abs=1e-9)
def test_hamming_different_positive(self):
d = ca._hash_hamming_delta("abc", "xyz")
assert 0.0 < d <= 1.0
# ---------------------------------------------------------------------------
# Test 5 — FastAPI HTTP contract
# ---------------------------------------------------------------------------
class TestFastAPIEndpoints:
@pytest.fixture(autouse=True)
def _setup(self):
try:
from fastapi import FastAPI
from fastapi.testclient import TestClient
except ImportError:
pytest.skip("FastAPI / httpx not installed")
ca.reset_state(tau=0.30, window=3)
app = FastAPI()
ca.register(app, ns="a11oy")
self.client = TestClient(app)
yield
def test_status_200_doctrine_v(self):
r = self.client.get("/api/a11oy/v4/conduction/status")
assert r.status_code == 200
d = r.json()
assert d["doctrine_v"] == "11"
assert "threshold_tau" in d
def test_observe_below_no_breach(self):
r = self.client.post("/api/a11oy/v4/conduction/observe", json={
"tick_id": "http_t1", "predicted_sensory": [1.0, 1.0],
"actual_sensory": [1.0, 1.0], "metric": "cosine"})
assert r.status_code == 200
d = r.json()
assert d["breach"] is False
assert d["alert_level"] == "normal"
def test_observe_high_delta_breach(self):
r = self.client.post("/api/a11oy/v4/conduction/observe", json={
"tick_id": "http_breach", "predicted_sensory": [1.0, 0.0, 0.0],
"actual_sensory": [0.0, 0.0, 1.0], "metric": "cosine"})
assert r.status_code == 200
assert r.json()["breach"] is True
def test_n_consecutive_fires_conduction_alert(self):
for i in range(3):
self.client.post("/api/a11oy/v4/conduction/observe", json={
"tick_id": f"alert_{i}", "predicted_sensory": [1.0, 0.0, 0.0],
"actual_sensory": [0.0, 0.0, 1.0], "metric": "cosine"})
status = self.client.get("/api/a11oy/v4/conduction/status").json()
assert status["current_alert_level"] == "conduction_alert"
def test_receipts_returns_list(self):
self.client.post("/api/a11oy/v4/conduction/observe", json={
"tick_id": "rec_1", "predicted_sensory": [0.5],
"actual_sensory": [0.5], "metric": "cosine"})
r = self.client.get("/api/a11oy/v4/conduction/receipts?limit=5")
assert r.status_code == 200
d = r.json()
assert isinstance(d["receipts"], list)
assert len(d["receipts"]) >= 1
def test_receipt_has_lutar_anchor_and_doi(self):
self.client.post("/api/a11oy/v4/conduction/observe", json={
"tick_id": "schema_http", "predicted_sensory": [1.0],
"actual_sensory": [1.0], "metric": "cosine"})
d = self.client.get("/api/a11oy/v4/conduction/receipts?limit=1").json()
rec = d["receipts"][0]
assert rec["lutar_anchor"] == "A37_InternalFeedbackIntegrity"
assert rec["neuro_citation"]["doi"] == "10.1016/j.neuron.2011.01.019"
def test_demo_endpoint_injects_high_delta(self):
r = self.client.post("/api/a11oy/v4/conduction/demo")
assert r.status_code == 200
d = r.json()
assert d.get("demo") is True
assert d["delta"] > 0.0
def test_conduction_html_has_doi(self):
r = self.client.get("/conduction")
assert r.status_code == 200
assert "10.1016/j.neuron.2011.01.019" in r.text
assert "A37" in r.text
def test_status_has_neuro_citation(self):
d = self.client.get("/api/a11oy/v4/conduction/status").json()
assert d["neuro_citation"]["doi"] == "10.1016/j.neuron.2011.01.019"