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
| File | What it is |
|---|---|
Recruitment-Pipeline-Design-v2.md | The 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.sql | The 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.html | Interactive 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.md | Every 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.md | The 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
draftlifecycle, 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.