feat: SourceKit Recruiter OS — full recruiter product at /recruiter#28
feat: SourceKit Recruiter OS — full recruiter product at /recruiter#28
Conversation
Build a separate recruiter-optimized product experience inside the SourceKit SPA. Includes 11 pages, 6 hooks, 6 shared components, transparent 6-dimension scoring model, 7 new database tables with RLS, and dedicated design system. Sections: Command Center, Search Lab, Candidate Intel (list + profile), Team Pipeline (board + table), Outreach Studio, Role Scorecards (CRUD), Agent Runs, Reports (8 types), Settings. Original app at / remains fully intact and untouched. https://claude.ai/code/session_019kQyxLTFWwP7FWurtp3uST
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7b40e71d48
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const { data: outreachHistory = [] } = useRecruiterOutreach( | ||
| selectedCandidate?.id, | ||
| ); |
There was a problem hiding this comment.
Filter queue against all outreach records
The queue status filter is computed from outreachHistory, but this hook call is scoped to selectedCandidate?.id, so it only contains messages for the currently selected candidate. When filtering for ready or hold, every other candidate is evaluated against missing history and gets misclassified (typically as draft), which breaks pipeline triage in the left queue as soon as you select a different candidate.
Useful? React with 👍 / 👎.
| function handleRunSearch() { | ||
| // TODO: Wire to recruiter-search-orchestrator edge function | ||
| } |
There was a problem hiding this comment.
Wire Run Search button to an actual execution path
This handler is empty but is bound to the primary "Run Search" CTA, so clicking it produces no search run, no results refresh, and no user feedback. In practice, the core search workflow is non-functional even though the UI presents it as available.
Useful? React with 👍 / 👎.
| function handleSaveSearch() { | ||
| // TODO: Save via useSaveSearch mutation | ||
| } |
There was a problem hiding this comment.
Persist searches when Save Search is clicked
The save handler is also a no-op while the "Save Search" control is enabled, so users cannot persist configurations and will lose their setup when navigating away or reloading. This breaks a key workflow implied by the saved-search dropdown in the same screen.
Useful? React with 👍 / 👎.
Summary
/recruiter— 11 pages, 6 hooks, 6 shared components, dedicated design system, and 7 new database tables/remains completely untouched — zero breaking changesWhat's Included
Pages (11): Command Center, Search Lab, Candidate Intel (list + profile), Team Pipeline (board + table views), Outreach Studio (3-column workspace), Role Scorecards (CRUD + detail), Agent Runs, Reports (8 types), Settings
Scoring Model: EEA, Builder, AI Recency, Systems Depth, Product Instinct, Hidden Gem — each with evidence citations and confidence levels
Database: 7 new
recruiter_*tables with RLS policies, indexes, and triggers (recruiter_scorecards,recruiter_candidates,recruiter_candidate_notes,recruiter_outreach,recruiter_agent_runs,recruiter_saved_searches,recruiter_sequence_templates)Design: Dark mode default, DM Sans + JetBrains Mono, #00e5a0 accent, information-dense recruiter UX with persistent left nav
Architecture: Lazy-loaded
/recruiter/*route group, dedicated CSS scope (.recruiter-os), code-split chunks, shared Supabase/auth/React Query infrastructureTest plan
/recruiterloads with left nav and all 9 navigation links work/is unaffected (search, pipeline, settings all work)tsc --noEmitpasses with zero errorsvite buildsucceeds with recruiter chunks code-splithttps://claude.ai/code/session_019kQyxLTFWwP7FWurtp3uST