The 9 Steps
Source: SOURCE-OF-TRUTH.md · synced 2026-06-12
Every JD that lands at Calibre flows through the same nine-step pipeline. Around that pipeline sit three further tracks of work — productisation, audit prep, infra — that don’t run for each JD but ship the system as a product. Together: 12 Steps.
Within a step, the build work is broken down using decimal sub-step numbering — Step 5.1, Step 5.1.1, Step 5.1.2, etc. Every plan, every commit, every status update references a single decimal ID. The word “phase” is retired (2026-06-11) along with the earlier Phases A–E, Stages A.1..A.5, Sprints 1a..4, and Step 5a/5b. The only build vocabulary now is Step (decimal-numbered). History: plans/meta-2026-06-03-nomenclature-reorg.md (original collapse) + plans/meta-2026-06-11-step-only-nomenclature.md (phase word retirement + filename pattern shift to step-N.M-).
Steps 1–9 — the pipeline a JD runs through at runtime:
| Step | What it does |
|---|---|
| Step 1 — JD ingested | The job description arrives as a file. Text is extracted from PDF / Word / Doc. |
| Step 2 — JD parsed | Raw text becomes structured fields: title, employer, requirements, must-haves, nice-to-haves, seniority. |
| Step 3 — JD normalised + tagged | The parsed JD is mapped onto a controlled vocabulary: which function, which vertical, which tags. Step 3.1 builds that vocabulary from real data; Step 3.2 builds the normaliser that applies it. |
| Step 4 — Sourcing | Candidates are scraped from public sources (LinkedIn, Apollo, Anymail Finder) and pooled. |
| Step 5 — CV parsed + matched | Each candidate’s CV is parsed (Step 5.1, shipped), then tagged against the same vocabulary as the JD (Step 5.2). (The former Step 5.3 industry-expert filter was renumbered 2026-06-12 into Step 6.0 + 6.2 — its Step 5 ID misrepresented runtime order. See §8 change log.) |
| Step 6 — Hard-fit filter | Deterministic scoring in three sub-steps. 6.0 entry gates: sub-function match + ratified drop rules eliminate non-starters before any scoring. 6.1 rubric scorer: 4 weighted dimensions per the JD’s sub-vertical (tag overlap 0.40 / seniority 0.20 / years 0.20 / red-flag 0.20 defaults) → composite 0–5. 6.2 rules overlay: recruiter boost/penalty rules (net-capped ±0.5) + block_at_l2 / require_evidence flags for Layer 2. Composite ≥ 4 after the overlay passes to the next layer. |
| Step 7 — Deep assessment | A second LLM pass reads the surviving candidates evidence-first — every score must be backed by a verbatim quote from the CV. Adjacency resolver fills in non-obvious skill matches. |
| Step 8 — Shortlist | The output is sorted into four fit groups by composite score: Strong yes (≥ 4.5) · Soft yes (4.0–4.49) · Soft no (3.5–3.99) · Strong no (< 3.5). Strong yes + Soft yes flow to Step 9 outreach; Soft no skips Step 7 LLM verification and is parked for re-pool against future JDs; Strong no is parked without re-pool by default. |
| Step 9 — Outreach | Personalised messages generated per shortlisted candidate. Email + LinkedIn. Responses re-enter the database. |
Steps 10–12 — what wraps the pipeline so it can ship as a product:
| Step | What it does |
|---|---|
| Step 10 — Productisation surface | Multi-tenant architecture, signup, onboarding, Stripe, demo tenants, admin. The thing other recruitment agencies could log into. |
| Step 11 — Audit prep | Project report on Calibre letterhead, training materials, attendance log, productivity measurement. The artefacts EnterpriseSG audit reviews. |
| Step 12 — Infra | Docs site, the manifest → sync pipeline that produces it, dev environment, documentation governance. Ongoing. |
Notes on specific steps
Step 1 vs Step 2 — order: in code the order is parse first, then normalise (the parser extracts raw fields; the normaliser maps them onto controlled vocab). The narration above lists “ingested → parsed → normalised” because that’s how a recruiter would describe it.
Step 3.1 — vocabulary comes from data, not from a meeting. Rather than designing the controlled vocabulary up-front, Step 3.1 runs a lean pilot match across Calibre’s existing ~107 CVs and 41 JDs (raw text, LLM-driven, no normalisation yet). The patterns Claude keeps using to describe fits get clustered, named, and locked as the controlled vocabulary. The JD normaliser (Step 3.2) and CV normaliser (Step 5.2) then read that locked vocab. As more data flows in later, the vocabulary can extend. Design lives in plans/step-3.1-vocab-bootstrap-design.md.
Step 6.0 + 6.2 — the industry-expert rules are the proprietary domain layer. Recruiter intuition encoded as deterministic rules in a config file (examples: “must have worked at a top-tier shop”, “exclude candidates from competitor X”, “boost candidates with N years in Singapore”, “candidate must speak Mandarin for China-coverage roles”). A starter scaffold is built first using common recruiter heuristics; the Calibre team then audits, tunes, and ratifies the rules. The ratified rules file IS the proprietary domain layer that distinguishes Calibre’s matching from any generic LLM matcher. Split locked 2026-06-12: drop-type rules fire at 6.0 (before Layer 1 scoring); boost/penalty (net cap ±0.5) and L2 flags fire at 6.2 (after the Layer 1 composite). Formerly numbered Step 5.3 — design still lives at plans/step-5.3-industry-filter-design.md (filename kept to preserve links).
The cross-reference from these 12 steps to the EnterpriseSG grant’s three Annex 3 deliverables lives in grant/scope.md §“12-Step → Annex 3 Deliverable Mapping” — every step traces to a billable grant deliverable.