Layer 3 · Agent Catalog

Modular HR agents.
Snap them together.

Each agent is a small, focused service: sourcing, matching, voice screening, SMS, scheduling, dashboards. Each declares its signals (what it emits) and slots (what it consumes). Wire any of them into any chain. Bring your own — add a service and the orchestrator learns to use it.

Monolithic AI recruiters are a one-shape solution to a many-shape problem.

The big AI recruiting platforms — the ones every agency owner has demoed — ship as a single product. Sourcing is included; voice is included; scheduling is included. You take all of them, or none of them. If the sourcing component is excellent and the scheduling component is awful, you do not have the option of using one and not the other. The pipeline shape is fixed.

The agency's reality is the opposite. Different verticals need different chains. Different clients need different sub-steps. A single fixed pipeline serves one workflow well and the other twelve poorly. The unit of abstraction has to be smaller than "the entire AI recruiter" — it has to be the individual agent.

Each agent is a small service with a clear contract.

Signals out. Slots in. That's all the orchestrator needs to wire any agent into any chain. Below is the shipping catalog — extending it is one Python file and one registration call.

Layer 1 · Orchestrator
AI Orchestrator
Chat-driven. Configures workflows. Then exits.
configure once
Layer 2 · Workflow Engine
Workflow Engine
Agents fire events directly at each other. No LLM in the loop. Runs for weeks.
source screen schedule dash
invokes
Layer 3 · Agent Catalog
Modular HR agents
Sourcing · Voice · SMS · Matching · Scheduling · Dashboard · Custom

LinkedIn Sourcer

Pulls candidates from LinkedIn matching a free-form vacancy description.

signals
candidates_found
slots
startstop
Example "Find me 30 senior backend engineers in Berlin who've shipped at Series-B startups."

GitHub Sourcer

Surfaces engineers by stack signal — repo activity, language mix, contribution patterns.

signals
candidates_found
slots
start
Example "Find Rust engineers with high-traffic open-source projects in the last 12 months."

AI Matcher

Ranks a candidate pool against a vacancy. Hybrid retrieval + cross-encoder re-ranking.

signals
matched
slots
score
Example "Score these 200 inbound applications against the senior platform engineer role."

Voice Screen

Outbound voice agent. Asks configured questions, scores answers, surfaces the transcript.

signals
screenedfailed
slots
start
Example "Call the top 20. Ask 4 questions about asyncio experience. Flag anyone over 0.7."

SMS Outreach

Sends a personalized first-touch SMS, captures replies, forwards qualified leads.

signals
repliedopted_out
slots
sendstop
Example "Text these 500 candidates the warehouse role. Send replies straight to the screening agent."

Scheduler

Offers timeslots to qualified candidates, books interviews, syncs to ATS.

signals
scheduledno_show
slots
offer_slotscancel
Example "Book 30-minute screens with everyone who passed the voice screen — next 3 business days."

Recruiter Validation

Human-in-loop step. Surfaces a checklist UI; the workflow pauses until the recruiter signs off.

signals
validated
slots
request_review
Example "Show me the top 8 before voice screens fire. I'll tick the ones to actually call."

Candidate Dashboard

Live per-campaign funnel — queued / calling / screened / failed — with score and answer detail.

signals
— (sink only)
slots
on_screenedon_failedon_scheduled
Example "See all 5 vacancies side-by-side: who's been called, who's passed, who's been booked."

ATS Sync

Pushes qualified candidates into your ATS of record — Greenhouse, Lever, Workable.

signals
synced
slots
push
Example "Move every passing candidate into Greenhouse as a Phone Screen stage applicant."

Bring your own. The orchestrator learns to use it.

An agent is a small Python service that declares its signals, slots, and properties. Once registered with the orchestrator, it appears in the catalog and the AI can wire it into workflows just like any built-in agent.

  • Use your own voice provider. Wrap your Twilio or Vapi setup as an agent; the orchestrator now uses it wherever a Voice Screen would go.
  • Add compliance steps. Background checks, eligibility verification, sanctions screening — your specific vendors, your specific configuration.
  • Plug into private data. Your candidate database, your ATS, your internal scoring model — without the data ever leaving your network.
my_agency_voice_provider.py
from workflow_master.service import Service, signal, slot, prop

class MyVoiceProvider(Service):
    questions: list[str] = prop(default_factory=list)

    @signal
    def screened(self, candidate_id: str,
                 score: float,
                 transcript: str): ...

    @slot
    async def start(self, candidates: list[dict],
                    vacancy: str):
        # call your provider here, fire `screened` per call
        ...
That's the whole agent. Register it once — the orchestrator now treats it as a swap-in replacement for the default Voice Screen.

Want a specific agent?

If your stack has a piece we don't ship yet — your ATS, your sourcing tool, your compliance vendor — tell us. We'll wrap it as an agent on the call.

Book a 30-minute demo — or email founders@workflow-master.example