Inspiration
Every student hears the same three lines: apply early, build skills, don't get replaced by AI. Nobody tells a sophomore in accounting or biology which of today's postings is worth their time, or which VT course closes the gap. Job boards show everyone the same list with a score and no reason.
So we asked one question: what is actually true, and checkable, about a student's next step? A posting is open or it isn't. A course is in the catalog or it isn't. A task is measured as automatable in published data or it isn't. Prospect only says what it can check, and says "not measured" where it can't.
What it does
Upload a resume and an unofficial transcript, pick role types and a target term, write your goal in one sentence. Four agents run, you watch five named steps with real counts, and you land on your journey:
- A live feed, ranked for you. About a thousand public company job boards, scanned every 30 minutes. Every role says why it fits, which requirements you meet, and which ones the posting never states. Sponsorship language is a label, never a filter. Apply opens the employer's real page; nothing is auto-submitted.
- Human Edge labels. Each posting is split into duties, each duty matched to an O*NET task and labeled Human-led, AI-assisted or Automatable from the Anthropic Economic Index. Unmeasured tasks say "not measured". We don't guess.
- A semester roadmap. Real VT courses and clubs from the catalog, projects marked "suggested", certifications with a source link. Your top postings show the roadmap steps to do before you apply. Edit, mark done, re-plan.
Plus an applications tracker, light and dark themes, and an MCP endpoint a judge's own agent can call with a read-only key. All 214 VT majors, every function and level.
How we built it
Databricks is the only data backend. Lakebase (managed Postgres) holds every table. An hourly Job mirrors it into Delta. Vector Search maps postings to career archetypes, duties to O*NET tasks, and goals to courses and clubs, four indexes online. A second hourly Job, the Orchestrator, re-ranks every profile when new postings land. A Genie space answers "why" questions at script level.
The model does not decide what matters. Ranking is a printed function in code: archetype fit, level fit, dream-tier fit, recency. "Met" versus "unknown" is decided in code. Gemini does the language work inside those rails: reads the PDFs, confirms the archetype, extracts duties, plans the roadmap. Temperature 0, a fixed seed, a JSON schema on every structured call, a timeout per step that fails by name, job text fenced as data.
Four agents that check their own work. A rejected answer goes back to the model once with the exact reason; a second failure is a named error. An invented course is dropped and named, never shipped. Match waits for Roadmap, then links postings to roadmap steps: "N roles ranked, M linked to your roadmap".
Verified identity (GoDaddy ANS). Profile, Match, Roadmap and Orchestrator each hold a domain-anchored identity under prospect.courses, registered through a Registration Authority and Transparency Log we ran ourselves, badge records live in public DNS. An impostor that never finishes verification is refused by the same gate. That refusal runs as a script, because the log lives on a laptop.
Next.js on Vercel, GitHub Actions for ingestion, email and password sign-in. Written with Claude Code and Codex; every merge gated on type checks, lint, tests and a build.
Data: O*NET 31.0 (CC-BY 4.0), the Anthropic Economic Index, the catalog.vt.edu 2026-27 catalog, GobblerConnect club listings, public ATS job APIs, Simple Icons, public-domain museum art.
Challenges we ran into
- One store for everything. Per-user scoping had to be airtight. A test fails the build if any query forgets it.
- Databricks Free Edition limits. psycopg2 crashed the serverless kernel, so the sync uses pure-Python pg8000. Vector Search 429s pushed bulk work off the user path.
- Speed. First ranking was far too slow. Bulk assignment moved out of the request, the VT catalog into Lakebase, similarity scored by rank. Now 11 to 16 seconds on production, the whole setup about 20.
- Agents crashing on their own output. On demo morning a run died over a definition a few characters too long. The fix was not a bigger cap. It was the self-correction loop, for every agent.
- Being honest about ANS. The in-app identity check is off in production because the log is local.
Accomplishments that we're proud of
- A ranked feed over 7,500+ live postings from 900+ companies, not a demo list.
- A roadmap that can't invent a course: 5,956 courses and 765 clubs, or the run fails by name.
- Task labels tied to a published dataset, with an honest "not measured" for the 87% it doesn't cover.
- Four agents that catch their own mistakes and hand work to each other.
- 1,243 passing tests, and a sign-in-to-roadmap flow that works on the deployed build.
- Accessibility checked, not assumed: contrast in both themes, 44 px targets, visible focus, reduced motion.
- Four agent identities on a real ANS Registration Authority, with badge records in public DNS.
What we learned
Green tests aren't evidence, the production path is. The bugs that mattered, a server card redirecting to sign-in, an unset owner id, a definition three characters too long, were invisible to the suite. An honest label beats a confident guess. And an agent that can hear "no" once is worth more than a bigger limit.
Built With
- anthropic-economic-index
- claude-code
- databricks-genie
- databricks-jobs
- delta-lake
- gemini-api
- github-actions
- godaddy-ans
- lakebase
- model-context-protocol
- motion
- next.js
- onet
- postgresql
- python
- react
- resend
- supabase
- tailwind-css
- typescript
- unity-catalog
- vector-search
- vercel
Log in or sign up for Devpost to join the conversation.