Two AI agents walk into a hiring funnel. Nobody hires anyone.
Gregory Turkawka
SubscribeSign in
Two AI agents walk into a hiring funnel. Nobody hires anyone.<br>275,000 evaluations. 67 conversations. The protocol that explains the gap.
Gregory Turkawka<br>May 19, 2026
Share
The first agent represents a candidate. It scans postings, parses requirements, drafts a cover letter, and submits. It does this 200 times a week, with the patient cheerfulness only a script can manage.<br>The second agent represents the employer. It reads the cover letter, runs the keyword pass, weighs the role-family score, and rejects. It does this for 200 candidates a week, with the same patient cheerfulness.<br>Both agents are working as designed. The candidate’s score is going up — applications-per-week, that’s the headline KPI. The employer’s score is going up too — time-to-screen, candidates-processed, all green. The two humans on the ends of this exchange — the person hoping to be hired, the person hoping to hire — are getting nothing. Worse than nothing. They’re getting the noise of 200 mutually irrelevant transactions a week and being told, by their respective dashboards, that the system is working.<br>This is where most “AI in hiring” stories are right now. And it’s going to get worse before it gets better, because Google’s A2A protocol just made it dramatically easier for agents to talk to each other. A2A is good. We built on top of it. But A2A is transport. Transport in hiring, without a contract above it, doesn’t reduce noise. It scales it.<br>What A2A doesn’t do
A2A defines how two agents discover each other, authenticate, and exchange messages. It is intentionally domain-agnostic. It does not say what an agent representing a candidate owes an agent representing an employer. It does not say what either of them owes the human they represent. It does not say at what point in the conversation a name should be revealed, or compensation should be disclosed, or a yes/no should be answered.<br>That’s appropriate for transport. But hiring needs that opinion. Without it, the default outcome is the one above: auto-apply against auto-reject, both sides optimizing for volume, both humans paying the bill.<br>What we built on top
Kitsuno Handshake is an open protocol that sits above A2A and adds the domain-specific contract. It’s Apache 2.0, federated, and deployed on our own product. Four commitments anchor it:<br>1. Staged disclosure. A handshake moves through three tiers. L1 is what any candidate would see on a public job board — title, location, skills, salary range. L2 is what the candidate would learn during a screening call — full description, screening questions, structured answers from the candidate’s verified profile. L3 is human-to-human — names, exact compensation, calendar links. The vacancy poster chooses what crosses each tier; the seeker consents before each crossing. No identity surface area expands without a real decision.<br>2. state_hash for idempotency. Two agents that have already evaluated the same (seeker, vacancy) pair at the same state must not re-evaluate it. state_hash is a SHA-256 over a canonical subset of each card — the matching-relevant fields, ignoring cosmetic edits. When either side mutates something semantic, the hash changes and the conversation re-opens. When nothing has changed, the agents stop bothering each other. This is the protocol-level rule that prevents the auto-apply spiral. Counter-agents in the wild can cache verdicts indefinitely as long as both hashes hold — which means a validator-mediated decision becomes economically tractable at corpus scale, instead of an expense only enterprise budgets can carry.<br>3. The validator: a quality gate, not a feed. Between L2 and L3-eligible, every conversation goes through a classifier that returns one of three buckets — strong_fit, weak_fit, no_fit — across four structured dimensions (role alignment, seniority fit, skill overlap, context). Only strong_fit reaches a human. weak_fit and no_fit are silent drops, stored for analytics, never surfaced. The principle in one line: a pipeline is a commitment surface, not a feed. If everything that passes the policy gate gets shown to a person, the person learns to stop looking.<br>The validator shipped public last week — interface, reference implementation, spec section, Apache 2.0 package. The full design note is at kitsuno.ai/handshake/v0.2/#validator.<br>4. Federation as a first-class primitive. Any operator self-hosts via /.well-known/handshake-v0.2.json. Other agents discover them without registering with us. Our own well-known sits at app.kitsuno.ai/.well-known/handshake-v0.2.json and advertises the cards-base, cards-index, vacancy-signal, and L3-release endpoints. There is no central registry, no API key issued by us, no permission gate. An ATS, a recruiter co-op, a university careers office, a country employment agency — any of them publishes a well-known on their own domain and the protocol routes to them. We’re the first...