Skip to Main Content

FactLens AI

Built at Meta Global AI Developer Hackathon · Oct 26, 2026 · Remote

FactLens AI — Demo video

FactLens AI verifies investment claims against Korean DART (OpenDART) annual-report filings, and refuses to answer when a claim cannot be falsified. THE PROBLEM Retail investors in Korea meet performance claims constantly - "Samsung revenue is up 40% and they barely have any debt" - usually as a chat screenshot, not text. Checking it means finding the right annual report, choosing consolidated vs. separate statements, computing the growth rate, and knowing whether "barely any debt" is falsifiable at all. Almost nobody does it, so the claim spreads. WHAT IT DOES 1. Paste a sentence, or upload a screenshot. 2. Meta Muse reads the claim from the image and decomposes it into checkable claims. 3. The agent resolves the company to a DART corp code, fixes the fiscal period, and fetches the statements on both consolidated (CFS) and separate (OFS) basis. 4. Python recomputes the metric with Decimal and fixed rounding. 5. A pure function issues the verdict: match / partial / mismatch / basis undefined / insufficient evidence. 6. The report shows the formula, the filing receipt number, a link to the filing, and its limits. WHY IT IS NOT A RAG WRAPPER The decision that matters is what the model is NOT allowed to do. Muse only reads language and proposes a claim structure. That proposal is validated against a strict JSON schema, and every number it emits is checked against the original sentence - a number absent from the source rejects the run. Company resolution, filing lookup, arithmetic and the verdict are deterministic Python. If validation fails, the system falls back to a rule-based parser and surfaces the reason in the UI instead of hiding it. A hallucinated number cannot reach the verdict, and the same input always yields the same verdict even though the LLM runs every time. It also refuses to rule when a claim is unfalsifiable. "Almost no debt" has no threshold, so it returns "basis undefined" and shows the real debt ratio as reference, rather than inventing a pass/fail line. WHAT I BUILT DURING THE EVENT - factlens/vision.py: image to claim sentence via Muse vision input, with MIME sniffing, downscaling, NONE handling and reasoning-token diagnostics. - MusePlanner in factlens/llm.py: Meta Model API client, strict JSON-schema mode, numeric guard, token accounting, redacted errors. - The image tab, the --image CLI flag, 11 new unit tests, and scenario cases 9-11. The calc / verdict / filing layers underneath are my own earlier work, reused unchanged, and named in the README. VERIFICATION 62 unit tests pass with no network. 11 scenarios run against the live Muse API and OpenDART: correct growth, wrong growth, omitted basis, ambiguous company, qualitative claim, missing filing data, filing API 5xx, invalid model JSON, three image cases. All 11 pass; outputs in tests/results/. LIMITS Annual reports only. One company per claim. Metrics: revenue, operating profit and debt ratio. The 11 scenarios are a functional check, not an accuracy benchmark

Team