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 = {