Files
krow_backend/knowledge/screening-and-hiring-standards.md
Aravind a222dcd3e4
Some checks failed
CI / test (push) Has been cancelled
CI / fixture (push) Has been cancelled
Add evals for every shipped agent, a policy corpus, and CI
§9 says no agent ships without evals. Eight of the nine had none: the two
other suites in evals/ are harness fixtures rather than agents in the
registry, so the rule was being met by one agent in nine.

Evals — 40 new cases, five per agent, every one carrying mustNotLeak:

  - the agent is loaded from its real spec in agents/*.md rather than
    written out again in Go. A hand-copied agent tests the copy: it keeps
    passing after somebody edits the spec, which is the moment it most
    needed to fail.
  - callNamed calls the tool a case names. toolThenAnswer always called
    tools[0], so seven of positions-agent's eight tools were unreachable,
    and a boundary nothing calls is a boundary nothing tests.
  - seedWorkspace fills BOTH tenants. A leak test against an empty second
    tenant cannot fail.

Verified by breaking workersByScore's org predicate: six cases across four
agents fail with LEAKED "RIVAL".

Knowledge — six policy documents, taking the corpus from 2 to 8 (34
chunks). Three restricted to admin and employer, five tenant-wide. They
cover what the tools cannot: a tool reports how many shifts went unworked,
a policy says what cover costs inside 24 hours.

corpus_test.go treats those documents as product rather than fixtures. The
first version was tautological — it read audience: from a file and checked
that file's audience was enforced, so opening a restricted document passed.
mustNotBeTenantWide now holds that judgement apart from the files, with the
reason recorded for each.

CI — the checks this repository already had, made unskippable. testutil
calls t.Skipf on an unreachable database, so a dead service container would
produce a green build over a suite that ran almost nothing. Simulated: go
test exits 0 with 74 tests skipped, including every tenant-isolation test.
The guard exits 1 and names them, while still allowing TestLive* to skip
without a model key.

This CI tests; it does not deploy. The README's claim that migrations are
run by CI against the target database remains aspirational.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186JgqQUCDS8ZwGmyw3ymWu
2026-08-28 13:52:46 +05:30

52 lines
2.0 KiB
Markdown

---
source: policy_docs
audience: role:admin, role:employer
title: Screening and Hiring Standards
---
# What the match score means
The AI match score is a reading of an application against a role's stated
requirements. It is a starting point for a decision, not the decision.
| Band | Reading | Expected action |
|---|---|---|
| 80 and above | Strong match on stated requirements | Shortlist |
| 70 to 79 | Viable, usually with one gap | Shortlist if the gap is trainable |
| 50 to 69 | Marginal | Read the application before deciding |
| Below 50 | Weak against this role | Consider for other open roles |
| No score | Not yet screened | Screen before deciding anything |
A candidate with no score has not been assessed. They are not a candidate who
scored badly, and they must never be ranked as though they were — an unscored
applicant sitting below a 40 in a sorted list is a reading error, not a
judgement.
# Screening is not a decision
Screening moves an application from applied to screened. It does not reject
anybody. A rejection is a decision a person takes, records a reason for, and can
explain to the candidate if asked.
Rejecting on the score alone is not a reason. "Below the bar for this role"
without a stated requirement it failed is the same as no reason at all.
# Time to decision
Every applicant gets a decision within ten working days of applying. Where a
role is paused, the applicant is told it is paused rather than left in the
pipeline — a candidate who hears nothing assumes a no and takes another job,
which costs the same as a rejection while looking like nothing happened.
Candidates at interview stage get a decision within three working days of the
interview.
# Interviews
An interview is required before hiring into a supervisory role. For general
staff it is optional and should be used where the application leaves a specific
question open, not as a default gate.
Interview notes are recorded against the application. A hire with no notes is a
hire nobody can explain in six months.