🧭 New here?
Take a guided tour of the site.

1. Request flow

A user request lands on Fly.io's edge proxy, then on a single Flask process running in a shared-cpu-1x 256 MB Docker container. The Flask app reads from a single SQLite file mounted at data/registry.db. There's no separate database server. A background verification worker thread drains the verification_queue table forever, upgrading fact confidence asynchronously.

User browser researcher / API HTTPS Fly.io edge bom.fly.dev auto-stops idle :8080 Routes (33) /families · /family/<id> /verify · /api/v2/* Verification worker daemon thread, polls every 2 s verification_worker.py Jinja2 templates + Canvas charts No JS framework, no build step SQL SQLite data/registry.db ~7 MB · WAL mode 19 tables single-process, no external DB server drains queue
Why SQLite? The registry is read-heavy and writes are bounded by verification throughput (≪1 write/second). One file, no separate DB process. Backups are cp registry.db registry.db.bak.<date>.
The worker thread starts on Flask boot (start_background_worker() in verification_worker.py). It polls verification_queue every 2 s, claims the highest-priority pending row with BEGIN IMMEDIATE, runs the tier, and writes back.
Fly auto-stop means the machine sleeps when idle and wakes on incoming request (cold start ~1 s). Background worker resumes on wake; jobs that were running at sleep get re-claimed.

2. The verification engine, inside out

The boundary-circle verifier certifies whether Re(z·f'(z)/f(z)) > 0 on the disk |z| ≤ r. It's sound in both directions: a proven verdict really proves the property; a disproven verdict comes with a certified counterexample point. Below is what happens when you call POST /api/v2/verify_sandbox with a closed form.

Closed form input "z*exp(z/2)" SymPy parse + validate requires f(0)=0, f'(0)=1 add_family._build_iv_g_* Derive g(z) = z·f'/f SymPy: f', f", S(f), T(f) Verify limit at z=0 Compile to mpmath.iv Taylor + fingerprint 20 coefficients via SymPy SHA-256 of rotation-norm form A. Argument-principle zero check winding# of p(z)=f/z on |z|=r if ≠ 0 → f has a zero in D → DISPROVE (not even univalent) B. Partition |z|=r into arcs initial: 2π in one box best-first priority queue (min Re g first) C. Centered eval on arc p(Z) ⊆ p(c) + (Z-c)·p'(box) tightens vs naive Horner [lo, hi] of Re(z·f'/f) at <30 dps precision D. Branch on the interval lo > 0 → arc proven ✓ hi < 0 → witness ✗ straddles 0 → bisect arc bisect until 0-budget or all arcs resolved proven all arcs: lo>0 → certified r disproven some arc: hi<0 → witness z, Re g ≤ ε inconclusive box budget hit → partial proof up to r-1 Return verdict to caller {direction, disk_radius, witness?, confidence, runtime_ms} · NOT persisted (sandbox)
Soundness contract The verifier never says "proven" by sampling - only when interval arithmetic certifies lo(Re g) > 0 on every arc. Sample-based negativity (hi<0) is sound only because interval arithmetic guarantees the bound holds across the whole arc, not just at a point.
Centered form vs naive Naive Horner evaluates the polynomial with z as a single interval - each occurrence of z gets enlarged independently, producing exponentially wide bounds on slowly-decaying truncations. The centered form anchors at the arc midpoint (a thin interval) and bounds only the variation across the arc by the derivative, scaling with arc width rather than polynomial degree.
Why exact-form-first matters A 20-term truncation of z/(1-z) = z+z²+z³+… has zeros near |z|=1 and genuinely isn't starlike there - the polynomial is a different function than f. When a SymPy closed form is available we verify the true f, not its truncation.

3. Tiered async pipeline

When you submit a function via the admin form, three verifier tiers run - Tier 1 synchronously so you get an immediate verdict, Tiers 2 and 3 in the background. A fact's confidence is monotonically upgraded as higher tiers complete: numerical_strongrigorous_verifiedproven. A higher-tier disprove is terminal - a sound counterexample always supersedes a numerical pass.

POST /admin/add closed_form + name Insert family + instance unscreened fact Tier 1: float-grid screen ~5-20 ms, synchronous tiered_verify.tier_screen() conf: numerical_strong 200 OK to user ~50–250 ms total enqueue tiers 2 + 3 verification_queue (SQLite table) priority 3: rigorous_exact (closed form) priority 5: rigorous_poly (20-term truncation) claim Worker thread polls every 2 s verification_worker.py daemon=True Tier 3: exact closed-form interval arith on SymPy g(z), ~0.1–2 s Upgrade fact → confidence: proven if supersedes() returns True Tier 2: polynomial rigorous centered form on truncation, ~0.1–10 s Write verification_run audit trail - every tier recorded supersedes() rule disprove always wins · same direction needs higher confidence · larger certified radius wins ties
Tier 1 / screen Sampled grid on 80×40 points. Float arithmetic. Returns numerical_strong or numerical_weak. Fast (<20 ms) but never authoritative - clearly labeled as screening, not proof.
Tier 2 / rigorous polynomial Centered-form interval arithmetic on the 20-term Taylor truncation, with argument-principle zero check. Returns rigorous_verified on the truncation object, NOT necessarily the original f.
Tier 3 / rigorous exact Same engine, but on the symbolically-derived g(z) = z·f'/f from the closed form. Returns proven - the strongest level, because it operates on the actual function rather than a truncation.

4. Data model

The encyclopedia centers on function_families - the canonical mathematical entities. Concrete points in parameter space become function_instances. Statements about them become facts. Every verifier run leaves a record in verification_runs. Papers cited in support attach via evidence. No NULL-link tombstones: every paper claim's provenance is preserved.

function_families 151 rows · the unit of identity name, canonical_key, closed_form param_spec_json, coeff_decay application_areas_json is_parametric, family_group gft_properties 19 rows · the property dictionary starlike, convex, univalent, nehari_univalent, becker, mobius, schwarzian_norm, ma_minda, … property_implications 12 edges · containment lattice convex → starlike → univalent function_instances 418 rows · concrete parameter points param_values_json, coefficients_json, coeff_fingerprint facts 939 rows · what's known fact_kind: membership | radius | bound | functional status, confidence, holds, disk_radius, fact_hash UNIQUE verification_runs 849 rows · audit trail verifier, direction, outcome, domain_radius, witness_json, engine_version, runtime_ms never deleted - full history verification_queue async tier scheduling tier, priority, status, started_at, runtime_ms evidence 7514 rows · facts ↔ papers theorem_number, page_number, statement_text, evidence_type paper_claim_id (provenance) papers 1,088 rows · the literature title, authors, year, structured_json has instance has fact verified by proven in references implies
immutable runs, monotonic facts Verification runs are appended, never deleted. A fact's confidence increases monotonically (numerical → rigorous → proven) as higher tiers complete. A higher-tier disprove is terminal, overriding any prior proven status.
Fingerprint deduplication Every instance has a SHA-256 fingerprint based on its rotation-normalized coefficient sequence. Before inserting a new family, add_family checks for fingerprint collisions and surfaces merge candidates.
Paper → evidence → fact A paper claim (extracted by text mining) becomes a piece of evidence when a human curator or an automated matcher links it to an existing fact. This creates the cross-tab between literature and the encyclopedia.
↑↓ navigate openesc close
✦ You're explorer #3,563 to wander the registry - thanks for stopping by. Tell us what you'd like to see →
💬 Feedback