T3 fan-out · HR / recruiting — CVs are PII, so the whole screen runs on a local model. One schema-enforced rubric for every candidate (enums kill « kinda-strong »), evidence quotes required, and the ranking is jq — deterministic, not model mood.
The job
Forty CVs and a Friday deadline means the rubric drifts by CV #12. Here glob discovers the pool, every candidate gets the SAME typed rubric — fit enum, evidence quotes mandatory — two at a time so the GPU breathes, weak fits drop, and jq sorts strong-first then by relevant years. The shortlist brief quotes its evidence.The shape
The file
t3-resume-screener.nika.yaml
How it works
Sovereignty is the requirement, not a preference
model: ollama/llama3.1 at the envelope — candidate data never
touches a cloud API. Same file shape as any other workflow.One rubric, enforced by schema
fit: enum [strong, possible, weak] + required evidence arrays —
candidate #1 and #40 are judged on the same axes, and a rating
without a quote fails validation.Constructs you just used
| Construct | Where | Reference |
|---|---|---|
| local provider (PII) | envelope model: | Providers |
nika:glob → for_each | pool · screened | Workflows |
| schema enums + evidence | screened | The 4 verbs |
| jq deterministic ranking | ranked · shortlist | Builtins |
Make it yours
- Anonymize first: a pre-pass
inferthat strips names/photos before scoring — bias mitigation in one task. - Wire the shortlist into Meeting actions’ pattern to draft interview invites.
- The same shape screens vendor proposals, grant applications, conference talks — any « N documents, one rubric » job.
Next · Release train
Time as a first-class citizen — parallel gates, a human GO, and an
absolute-time hold until the window.