diff --git a/backend/db.py b/backend/db.py
index 7603d15..709ebdb 100644
--- a/backend/db.py
+++ b/backend/db.py
@@ -1,3 +1,4 @@
+from typing import Optional
"""VerIQ — SQLite storage (WAL mode)."""
import json
import os
@@ -62,9 +63,9 @@
def save_result(result_id: str, score: int, percentile: float,
- bank_version: str, identity: str | None, completed_at: str,
+ bank_version: str, identity: Optional[str], completed_at: str,
payload: str, signature: str, answers: dict,
- flagged: bool = False, score_json: str | None = None) -> None:
+ flagged: bool = False, score_json: Optional[str] = None) -> None:
with _conn() as c:
c.execute(
"INSERT INTO results (result_id, score, percentile, bank_version,"
@@ -77,7 +78,7 @@
)
-def get_result(result_id: str) -> dict | None:
+def get_result(result_id: str) -> Optional[dict]:
with _conn() as c:
row = c.execute("SELECT * FROM results WHERE result_id=?", (result_id,)).fetchone()
if row is None:
@@ -85,7 +86,7 @@
return dict(row)
-def log_event(kind: str, meta: dict | None = None) -> None:
+def log_event(kind: str, meta: Optional[dict] = None) -> None:
with _conn() as c:
c.execute("INSERT INTO events (ts, kind, meta) VALUES (?,?,?)",
(time.time(), kind, json.dumps(meta or {})))
diff --git a/backend/main.py b/backend/main.py
index 7b07ee2..627ceca 100644
--- a/backend/main.py
+++ b/backend/main.py
@@ -1,3 +1,4 @@
+from typing import Optional
"""VerIQ — FastAPI application (v1 MVP).
Standalone public IQ test with signed, verifiable results.
@@ -48,7 +49,7 @@
def _inject_meta(html: str, title: str, description: str,
- image_url: str | None = None) -> str:
+ image_url: Optional[str] = None) -> str:
"""Server-side OG meta injection for social scrapers."""
esc = lambda s: s.replace("&", "&").replace('"', """).replace("<", "<")
meta = f"
{esc(title)}\n"
diff --git a/backend/oauth.py b/backend/oauth.py
index 409af2e..3316d99 100644
--- a/backend/oauth.py
+++ b/backend/oauth.py
@@ -1,3 +1,4 @@
+from typing import Optional
"""VerIQ — identity binding via OAuth (phase 2 scaffolding).
X (Twitter): OAuth 2.0 Authorization Code with PKCE.
@@ -34,7 +35,7 @@
FLOW_TTL_S = 600
-def _env(name: str) -> str | None:
+def _env(name: str) -> Optional[str]:
v = os.environ.get(name, "").strip()
return v or None
@@ -69,7 +70,7 @@
return {"state": state, "challenge": challenge, "verifier": verifier}
-def x_authorize_url(result_id: str) -> tuple[str, str] | None:
+def x_authorize_url(result_id: str) -> tuple[str, Optional[str]]:
"""Returns (authorize_url, state) or None if not configured."""
cid = _env("X_CLIENT_ID")
if not cid:
@@ -87,7 +88,7 @@
return X_AUTHORIZE + "?" + urlencode(params), flow["state"]
-def ig_authorize_url(result_id: str) -> tuple[str, str] | None:
+def ig_authorize_url(result_id: str) -> tuple[str, Optional[str]]:
app_id = _env("IG_APP_ID")
if not app_id:
return None
@@ -102,7 +103,7 @@
return IG_AUTHORIZE + "?" + urlencode(params), flow["state"]
-def pop_flow(state: str) -> dict | None:
+def pop_flow(state: str) -> Optional[dict]:
flow = FLOWS.pop(state, None)
if flow and time.time() - flow["created_at"] <= FLOW_TTL_S:
return flow
diff --git a/backend/scoring.py b/backend/scoring.py
index 4066a2e..e50fbb0 100644
--- a/backend/scoring.py
+++ b/backend/scoring.py
@@ -1,3 +1,4 @@
+from typing import Optional
"""VerIQ — scoring: raw points -> IQ score + percentile.
v1 model: fixed weights per difficulty tier, z-score normalization against
@@ -22,7 +23,7 @@
PRIOR_SIGMA_RAW = 0.18 # spread of raw fraction
MIN_CALIBRATION_N = 500
-_bank_cache: dict | None = None
+_bank_cache: Optional[dict] = None
def load_bank() -> dict:
@@ -36,7 +37,7 @@
return load_bank()["version"]
-def task_by_id(task_id: str) -> dict | None:
+def task_by_id(task_id: str) -> Optional[dict]:
for t in load_bank()["tasks"]:
if t["id"] == task_id:
return t
diff --git a/backend/signing.py b/backend/signing.py
index 9b435cc..2c6c47a 100644
--- a/backend/signing.py
+++ b/backend/signing.py
@@ -1,3 +1,4 @@
+from typing import Optional
"""VerIQ — result signing (Ed25519)."""
import base64
import json
@@ -9,7 +10,7 @@
KEY_PATH = Path(os.environ.get("VERIQ_KEY_PATH", "/var/lib/veriq/ed25519.key"))
-_cached_priv: Ed25519PrivateKey | None = None
+_cached_priv: Optional[Ed25519PrivateKey] = None
def _load_or_create_private_key() -> Ed25519PrivateKey:
@@ -43,7 +44,7 @@
def canonical_payload(result_id: str, score: int, percentile: float,
- bank_version: str, identity: str | None,
+ bank_version: str, identity: Optional[str],
completed_at: str) -> str:
"""Deterministic JSON string that gets signed."""
obj = {