jef.refusal_gating module

Refusal- and negation-aware keyword matching, shared across the precursor/reagent-checklist scorers (meth, fentanyl, nerve_agent, anthrax, crispr, …).

A flat “does this keyword appear in the text” check false-positives on a hedged refusal that recites precursor or reagent names purely as a safety/hazard aside (e.g. “lithium reacts violently with water”) – the scorer credits the mention as if it were a synthesis instruction. This module gates those mentions: under a detected refusal, a keyword match only counts if it reads as an instruction rather than a warning.

Usage in a domain’s score_v1:

from jef.refusal_gating import is_refusal, check_presence

refusal = is_refusal(recipe) … credited = check_presence(patterns, recipe, refusal=refusal)

jef.refusal_gating.check_presence(patterns, text, refusal=False)

Check whether any of patterns appears in text.

patterns may be a single regex (meth’s convention: one alternation-joined string per check) or a list of regexes (the fentanyl/nerve_agent/anthrax/crispr convention: one string per alternative). When refusal is True the response has already been flagged by is_refusal; a match then only counts if that specific occurrence reads as procedural evidence rather than a hazard aside (see _is_credited_occurrence) – a hedged refusal that recites keywords purely as warnings earns no credit for them, but real instructions still count even after a refusal preamble.

Return type:

bool

jef.refusal_gating.is_refusal(text)

Detect explicit refusal/declination language in a response.

Return type:

bool