Semantic judge
fornax judge sends a claim plus a bounded, structured excerpt of its
evidence graph to a locally configured, self-hosted judge model (an
Ollama-compatible endpoint), and renders the model's opinion alongside the
same full fusion detail fusion/decision
render (FORNX-94, shipped in v0.0.4).
The judge's opinion is one more evidence source, always shown alongside
the real evidence-graph-derived verdict, never instead of it. It is
disabled by default — a user who has never touched $FORNAX_HOME/config.toml
gets no judge calls at all.
Why would I use it?
Deterministic verifiers check what they were explicitly written to check. A semantic judge can catch cases a literal rule doesn't cover — subtler phrasing, indirect evidence — by reasoning over the same evidence a human reviewer would read. It's a second opinion, not a replacement verifier.
When to use it
Opt in when you want that second opinion on ambiguous or REVIEW-verdict
claims, and you're comfortable running a local model (or pointing at one
you already run). Skip it for anything where the deterministic trail alone
is sufficient — it adds a real network call and a real model dependency for
no benefit if you don't need the extra signal.
How
Off by default, enabled via config first:
# $FORNAX_HOME/config.toml
[semantic_judge]
enabled = true
endpoint = "http://localhost:11434/v1" # default; Ollama-compatible
model = "llama3.1" # default
timeout_ms = 5000 # default
Then:
fornax judge <CLAIM> <SESSION> [--allow-raw-evidence]
$ fornax judge c1 s1
judge (model-derived, NOT independent evidence): ✓ SUPPORTED
model: llama3.1 endpoint: http://localhost:11434/v1 called_at: 2026-09-02T00:00:00+00:00
rationale: the evidence excerpt is consistent with the claim
claim: c1
session: s1
graph_source: graph
🛡 ✓ VERIFIED (uncertainty: qualified)
...
A disabled, unreachable, or timed-out judge renders honestly as
— UNAVAILABLE — never a fabricated pass/fail:
judge (model-derived, NOT independent evidence): — UNAVAILABLE
...
rationale: semantic judge disabled via [semantic_judge].enabled = false
When the judge's verdict disagrees with the deterministic evidence, that's shown as an explicit banner, not silently dropped:
⚠ disagreement: the judge's verdict differs from the deterministic
evidence for this claim -- shown, not resolved
--allow-raw-evidence
By default, the excerpt sent to the judge is redacted the same way any
other Fornax evidence is (see Privacy & Redaction).
--allow-raw-evidence is an explicit opt-in to send unredacted evidence
content to the judge instead — off by default per FORNX-94's "raw protected
evidence" acceptance criterion.
What happens internally
fornax judge reads GET /api/judge on the daemon. The daemon builds a
bounded evidence-graph excerpt for the claim, calls the configured
Ollama-compatible endpoint, and maps the response into a
verdict/rationale/disagreement shape — one of supported,
contradicted, inconclusive, or unavailable (four distinct icons, never
collapsed: ✓, ✕, ?, —). It then reuses fusion's own render
function to print the full evidence-graph detail underneath.
Constraints
- Disabled by default (
[semantic_judge].enabled = false). - Requires a reachable Ollama-compatible endpoint — a real network call to
localhostby default, not a Fornax-hosted service. - Raw evidence stays redacted unless
--allow-raw-evidenceis passed.
What can go wrong
| Symptom | Cause |
|---|---|
— UNAVAILABLE | Judge disabled, endpoint unreachable, or the call timed out — the exact rationale string tells you which. |
⚠ disagreement | The judge's opinion contradicts the deterministic fusion verdict — read both rationales, don't just trust one. |
error: with no judge block | Daemon-side failure (e.g. the judge task panicked) — check daemon logs. |
no such claim on record | Wrong claim/session id. |
Where to go next
- Fusion & decision — the deterministic trail the judge is shown alongside.
- Privacy & Redaction — what "redacted evidence" means before you'd reach for
--allow-raw-evidence. - Reliability — a different, purely historical-statistics signal, not to be confused with the judge's live model opinion.