Ardur contains two experimental Python library surfaces that use model-backed
signals: semantic_judge.py and behavioral_fingerprint.py. They are not wired into python/vibap/proxy.py, the CLI, Personal Hub, or receipt verification.
Their results are not an authoritative governance verdict.
This is the current implementation boundary, not a promise that advisory controls can never become gates. Any future integration must change the source, tests, public documentation, and evidence model together.
judge_from_env() returns:
NullJudgewhenARDUR_SEMANTIC_JUDGEis unset or is notanthropic; its result isUNSURE;AnthropicJudgewhenARDUR_SEMANTIC_JUDGE=anthropic, a model is configured, the optional SDK is installed, and credentials are available.
Every exception inside AnthropicJudge.evaluate() is logged and converted to
UNSURE. Parse failures also become UNSURE. PERMIT, DENY, and UNSURE
remain advisory analysis labels: the module cannot mutate the reference
proxy's structural Decision.
Setting the environment variable does not make the proxy call the factory or the judge. A custom caller must invoke it explicitly.
ARDUR_BEHAVIORAL_FINGERPRINT=anthropic only permits construction of
AnthropicChallenger; it does not activate a reference-proxy session gate.
The library helper enforce_fingerprint() has this policy contract:
| Raw challenger result | Default policy="fail_open" |
policy="fail_closed" |
|---|---|---|
OK |
OK |
OK |
FAIL |
FAIL |
FAIL |
UNSURE |
OK, with raw=UNSURE preserved in the reason |
FAIL |
The fail-open default does not ignore a definite mismatch. It permits only
uncertainty such as a provider error. The fail_closed option is a Python
function argument, not a CLI flag or environment variable.
Do not describe either module as an Ardur enforcement control in the current release. An operator-owned integration that makes behavioral fingerprinting a gate should, at minimum:
- pass
policy="fail_closed"for high-assurance actions; - define the known failure state and the availability trade-off for provider timeouts, quota exhaustion, SDK errors, and malformed responses;
- keep the authoritative structural proxy decision separate from the advisory model output;
- record raw versus policy-adjusted status without storing prompts, secrets, or unredacted model responses;
- monitor
UNSURE, exception, timeout, and rejection rates; and - test outage, latency, malformed-output, and calibration behavior under deployment-like conditions before making a security claim.
For gradual experiments, the default fail-open policy avoids turning a remote advisor outage into a session outage. For a real authorization boundary, that same behavior is insufficient: the caller must deliberately select and test a known failure state. This follows the risk-based framing in NIST SP 800-53 Rev. 5.1, SC-24, which makes the safe state organization- and mission-defined, and the NIST AI RMF Core, which calls for documented scope, uncertainty, deployment-relevant evaluation, and production monitoring.
The provider-backed implementations introduce network latency, provider API cost, quota and credential dependencies, and a new external data boundary. There is no live-provider CI test and no production SLO for either module. Provider pricing and model availability change independently of Ardur; estimate cost from the chosen provider/model and expected challenge or tool-call volume before enabling a custom integration.
No API key is required for the authoritative Ardur governance path or for the provider-free test suite.