01Gates, not guidelines
I wrote the safety rules as nine executable scripts in infra/gates/, wired into CI, each failing closed. G-FEE blocks any listing carrying a worker-paid fee three times over: a database CHECK constraint on jobs.worker_pays_flag, a Pydantic model validator that refuses to let a fee-bearing job hold verified status, and a trust resolver that quarantines it before it can be served. G-EGRESS flags httpx calls, raw sockets and source-domain URLs in any ingestion, alerts or llm module that does not go through the require_live() guard.
02One switch
I gave it exactly one environment variable, BUILD_MODE, with two values, and safe is both the CI default and the fail-closed default. Under safe, connectors read recorded fixtures, no source domain is contacted, live secrets never load, and the notifier binds to a mock that records intent and sends nothing. Any real fetch or send has to route through config.require_live(), which raises; the CI workflow hard-codes safe and fails any job that tries to override it.
03The origin register
Saudi Musaned, UAE MOHRE and the UK Seasonal Worker scheme have no public vacancy board to crawl, so I model those corridors as verified directories instead. trust/registers.py resolves each listing against the licence register of the sending country rather than the destination: a Musaned job routed via a Pakistani agent is checked against pk_beoe, a Nepali agent against np_dofe, across six register mirrors. If no register resolves, the job earns a hard unverified_recruiter flag and quarantines, so a missing register degrades a corridor to empty, never to wrong.
04Suspicion is one-way
Deterministic regex rules run first and are authoritative: worker fees, fast-visa timeline language, tourist-visa substitution, off-platform payment, passport surrender. The Anthropic classifier only augments. It can contribute new flags or raise a soft score, but it can never unset a fired hard rule and can never promote a listing to green; if it errors or times out, classifier_available flips to False and the job routes to amber and human review. I made the demo show the rule biting rather than describe it: because the classifier is mocked under BUILD_MODE=safe, every served job renders the amber "Caution — we are checking this" badge and there is no green card anywhere.
05Refusing to advise
Unlicensed immigration advice carries criminal liability in the UK, Australia and Canada, so my API refuses to give any. A request carrying advice-shaped parameters, passport and passport_number among them, receives a 451 unavailable_legal with an information-not-advice disclaimer instead of a verdict, and the G-ADVICE gate scans the codebase for personalised-advice strings. I deliberately never built the eligibility checker everyone asks for first. What ships is a generic informational filter that says a route is open to nationals of a given country, and nothing more.