Inspiration

Hiring still assumes the person on the other side of the application is who they say they are. Generative AI broke that.

41% of organizations have hired a fraudulent candidate without knowing it (GetReal Security). Deepfake hiring fraud rose 1,300% in 2024 (Pindrop). A convincing fake candidate takes about 70 minutes and zero technical skill (HR Dive). Humans detect deepfakes at 55.54% accuracy — barely a coin flip (2025 meta-analysis, 56 studies). Gartner projects 1 in 4 candidate profiles worldwide could be fake by 2028.

Recruiters are drowning in volume and fakes: proxy interviews, pasted resumes, three-day-old LinkedIn profiles, the same face applying under two names. The tools meant to help often just rank the noise. We wanted a funnel that answers three questions in order — is this a live human, is this one real story, is this a fit for this job? — and then tells a recruiter exactly who deserves a human’s time first.

The close we kept coming back to: this isn’t one clever trick. It’s a funnel a company sets policy on per job posting.

What it does

TrustFunnel is a hiring-trust layer that sits in front of a recruiter’s queue. Candidates pass through three gated checkpoints. Fail Stage 1 and you never get scored on resume quality.

Stage 1 — Identity. Prove this is a real, specific, live human — not a deepfake or a proxy. Baseline selfie vs. government ID, a live reaction challenge mid-call (“Say the word ‘purple’”), voice/lip-sync consistency, and a cross-application scan for the same face or voice under another name.

Stage 2 — Consistency. Confirm the materials are genuine and internally consistent. A live provenance heatmap colors resume paragraphs green (typed), gold (mixed), or red (pasted). The candidate uploads the LinkedIn PDF they generate themselves; we extract Experience in-browser. Claims are cross-checked across resume, cover letter, and LinkedIn. Thin or brand-new profiles get flagged. AI-polished wording is never penalized — only paste provenance, contradictions, and thin profiles move the score.

Stage 3 — Fit. Weighted match of verified experience against the job, plus prior TrustFunnel history (verified before, first time, or previously flagged).

Each stage produces a 0–100 score. The combined Trust Score ranks a recruiter queue. Fail identity and you are held, not ranked — Stage 2 and 3 never run. Partial completions show as in progress. Per job, a recruiter sets rigor: Stage 1+2 is enough for a high-volume on-site role; all three are required for remote roles with system access. Nothing is silently deleted. The system ranks; a human makes the final call.

The demo has two views: a presenter-controlled candidate walkthrough (Maya Ellison, Staff Engineer) with the score building live, and a recruiter ATS with two postings, a ranked queue, expandable stage breakdowns, and a flagged hold (Victor Lang — same print as “Nathan Cole,” applied 11 days ago).

How we built it

We split into four tracks and assembled them into one Vite + React 18 app (no backend) so the 5-minute demo never depends on a flaky network call.

• Identity is a standalone live camera module: MediaPipe FaceLandmarker (478-point mesh + blendshapes) for blink, expression, and head pose; face-api.js 128-d descriptors for optional ID-photo matching; getUserMedia for camera and a voice check. If models fail to load, it falls back to heuristics so the demo still runs. • Consistency is a game-style flow (Intro → Resume → LinkedIn → Cross-check → Result). Typing rhythm and paste events stay in the browser (timing only, never key identity). pdf.js parses the LinkedIn PDF locally. New candidates can call ChatGPT, Claude, or Gemini with a key in sessionStorage; fixture candidates replay a precomputed result. Score = 0.30·provenance + 0.50·claims + 0.20·profile. Scoring steps can be posted as traces to Block Convey PRISM so judges can see which signal moved the number. • Fit + scoring lives in a single mock data file: job descriptions, per-stage checks, flags, prior history, and the combined score (average of completed stages). Stage 1 failures have no Trust Score. • Recruiter queue is the payoff screen: job rail, rigor toggle, ranked ready list, in-progress, and a visually separate Held — identity not established section.

Presenter controls every step. Live modules open from the walkthrough (/identity.html, /stage2/index.html) so judges can see real camera and a resume turning red on paste, then cut back to the queue.

Challenges we ran into

Four people, one index.html. Identity, consistency, and the Vite dashboard all wanted the repo root. Git rename detection once moved the dashboard into the Stage 1 folder. We learned to keep three copies on purpose: Vite entry at /, Stage 1 at stage1-identity/, and Vite-served copies under public/ so the live links work.

Demo reliability vs. real models. MediaPipe and face-api.js load from CDNs; cameras get denied; LLM keys fail. We built fallbacks and fixture “honest / fraud” paths so the pitch never depends on a model download at 5:55pm.

Gating had to be obvious. “Fail Stage 1 → never ranked” is the product. If Victor Lang still sat in the main list, the story collapsed. Held vs. ranked vs. in-progress had to be a visual fact, not a tooltip.

Don’t punish people who used ChatGPT to polish a resume. Stage 2 only scores paste provenance, factual contradictions, and thin/new profiles. That constraint is written into the scorer on purpose — it matches the challenge’s “don’t false-flag honest candidates.”

What we learned

Trust in hiring is a sequencing problem, not a single-model problem. Identity before consistency before fit is the product. Recruiter time is the scarce resource; wasting it on a fake person’s resume is the failure mode.

A queue is more honest than a filter. TA operators in the room don’t want a black box that deletes people. They want rank, evidence, and a human last mile.

“AI-written” is a terrible signal. Paste timing, title inflation vs. LinkedIn, and a profile created this week are better ones.

Shipping four parallel modules in a day is an integration problem: contracts between stages, a shared visual language, and one data file so numbers can be tweaked without touching UI.

What's next for Trust Funnel

• Wire live Stage 1 and Stage 2 scores into the queue instead of the scripted walkthrough data. • ATS plugins (Greenhouse, iCIMS, Ashby) so this sits in the existing workflow, which is what the judges asked for. • Real LinkedIn connect (not PDF upload) and a production scoring API. • A cross-company verification network: “seen before, no flags” / “previously flagged and why,” with candidate consent. • Side B of the challenge: candidate-facing employer verification — look-alike domains, fake offer letters, deepfake recruiter calls — so trust runs both directions.

Built With

Share this project:

Updates

Submission history