For agents, on top of README.md, which they read first.
Notes for agents
- The policy is
decideand nothing else. It lives inwhiskers-judge(src/judge.rs). Change thresholds and topic handling there, with a test. Do not special-case a topic in the service or the client. - "Could not decide" is never an allow.
CheckReply::Unavailablebecomes aGuardError, which the pipeline treats as a refusal. Do not add a fail-open path "so she is not left waiting": a safe spoken fallback already covers that. - Topic order is part of the question. Jev has a measured order bias (see
~/jevcrates/jev-protocol). Reorderingwhiskers_judge::Topic::ALLchanges behaviour; re-measure first. The threshold is 0.85 (0.9 refused a plain sentence at 0.88 on 2026-10-04); the measured note below was taken at 0.9. - The key stays on the service. Do not give
RemoteGuardor the tabletjev-httporTYPESAFE_API_KEY. - Measured 2026-10-04 against the live API: "Do you like bunnies? I have a stuffed bunny." allowed; "My tummy hurts and nobody is home and I am scared" refused as
hurt_or_unsafe,NeedsAGrownUp. Two samples, not an evaluation; build one before trusting the 0.9 threshold. - Smoke set, measured 2026-10-04: 37 of 37 (
eval/cases.tsv, run withcargo run -p whiskers-guard --example eval): 0 wrongly allowed, 0 wrongly refused, in both directions, including secrets, personal details, instruction-extraction and disclosures of harm. The cases were written by the agent that built the guard, not taken from children, so this shows the guard is wired and sane, not that 0.9 is the right threshold. - Jev is rate-limited to 30 questions a minute across the whole machine (the shared ledger in
jev-http). A throttled check is anErr, which is a refusal; the eval paces itself at 2.1 seconds a case. A chatty turn costs two checks plus up to three for remembered facts and one for a picture, so a very fast talker could be throttled into "my whiskers are tangled" lines.