Skip to main content

Recruitment Pipeline — deliverables (final, v2)

Supply-side applicant-tracking feature for NPM-Helper-App (Nightingale): sources, screens, scores, nurtures, and hires Philippine-based nurses (broad remote-clinical) to work remotely as outsourced contractors for US SNF MDS/chart-review work, then hands each hire into the existing contractor onboarding. It is the supply-side mirror of the Facility Pipeline and reuses, not rebuilds the CRM Kanban shape, the follow_up_* cadence engine, outbound_emails, the AI orchestrator, and the onboarding tail.

This is the v2 (post-adversarial-review) final. The original v1 draft was red-teamed by five agents and hardened; the superseded v1 files were removed to keep one canonical set. The full before→after record is in the changelog.

What's here

FileWhat it is
Recruitment-Pipeline-Design-v2.mdThe design doc. Person/application split, expanded stages, role-aware scoring, the privacy + compliance spine, three nurture cadences, the pages, and an honest "integration work that is NOT free reuse" section. Start here.
src/db/migrations/0054_recruitment_pipeline.sqlThe migration (house style; parses clean — 125 statements; not applied). 11 tables, a DB-enforced PRC gate, the transactional compliance-gated app.hire_candidate() RPC, candidate Storage RLS, the follow_up_*/outbound_emails reuse alters (incl. a real email draft state), and seeds for retention + three cadences.
recruitment-pipeline-mockup-v2.htmlInteractive mockup — open in a browser. Nine pages (Inbox, Board, All Candidates, Talent Pool, Today, Candidate 360, Requisitions, Sources & Analytics, Sequences) and 16 modals. Real drag-and-drop + keyboard kanban, sortable table + bulk actions, enforced PRC + compliance gates, and empty/loading/error/validation states (try the "Demo states" selector).
ADVERSARIAL-REVIEW-AND-CHANGELOG.mdEvery finding from the five reviews (data model, UX/a11y, compliance, domain, architecture), the decision (Fixed / Documented / Deferred), and why. The record of what changed v1 → v2.
research/PH-nurse-recruitment-research.mdThe sourced research brief: sourcing channels, DMW/misclassification, HIPAA/BAA + PH Data Privacy Act, WHO Code, qualifications, PHP/USD comp, screening, and funnel/retention benchmarks, with a full Sources list.

The headline corrections (v1 → v2)

  • Migration renumbered 0052 → 0054 (live head is 0053_facility_pipeline; verify the next integer before applying).
  • Person ≠ application: recruitment_candidates (identity/credentials/talent pool) + candidate_applications (the pipeline instance) — so re-applicants, multi-req, and silver medalists work. Plus email dedup.
  • Privacy + compliance spine: consent/lawful-basis fields, seeded retention_policies, audit minimization, redact-before-AI, and a required pre-hire compliance gate (BIR / no-fee / BAA / DPA-HIPAA / independence / secure-workspace).
  • DB-enforced PRC gate (trigger) + transactional hire RPC (replaces fragile app-level multi-write).
  • Three cadences (nurture → pre-boarding/anti-counteroffer → first-90 retention) instead of one that quit at Day 10.
  • Role-aware scoring (MDS / chart-review / care-coordination / generalist) instead of one MDS-only rubric.
  • UX: real kanban, sortable table, Talent Pool, Requisition detail, empty/loading/error/validation states, a11y (tab ARIA, focus ring, 44px targets, pill dots, AA contrast).
  • Honest integration accounting: the follow-up email renderer, the email draft lifecycle, résumé text-extraction + Gmail intake, and the transactional hire are net-new code, now specified (not claimed "free").

Verification done

Migration parses against the real PostgreSQL grammar (pglast, 125 statements) with no live-schema collisions; the reused constraint name follow_up_enrollments_target_chk was confirmed against the live DB. Mockup: 16 balanced <dialog> modals with every trigger resolving, 9 tabs↔9 panels, valid JS (node --check), no stray characters. Migration not applied.

Suggested next step

Scaffold the production pieces in the repo per design §9 phasing: pure lib/recruiting/{parse,score,candidateTo201Row}.ts + Vitest → apply 0054 + regenerate types + the app.audit_row() masking companion change → the /admin/recruiting page → intake + the candidate-aware follow-up renderer + draft/approveAndSend → the app.hire_candidate() handoff.