# Your hallucination checker only sees the final paragraph

> Source: <https://dev.to/amin_parva_ab01ff398fd341/your-hallucination-checker-only-sees-the-final-paragraph-416m>
> Published: 2026-07-21 01:06:28+00:00

Your hallucination checker only sees the final paragraph.

That’s the bleed. A fluent wrong number often starts earlier: empty retrieval, a swallowed tool error, a stale cache after a fact update. Score the prose alone and you miss the cause — then the model fills the gap confidently.

Most “anti-hallucination” tools optimize one job: grade the **answer text** (encoder / HHEM-class model / LLM-as-judge). Useful. Incomplete for agents.

What they usually can’t do:

`0.87`

After the model speaks (and optionally before it does), run a **verdict**:

`ShineVerdict`

: `decision`

+ named `resolution_gate`

+ `evidence_hash`

That product is **PrismShine** (Apache-2.0, `pip install`

).

It is **not** a prompt-injection firewall (that’s PrismGuard). It is **not** an agent runtime (that’s ChorusGraph). One job: verify answers against evidence.

Public comparative vs Vectara **HHEM-2.1-Open** on HaluEval

(Azure ACI · ONNX Tier-3 · receipt `2026-07-20_run4_onnx`

):

| System | B1 QA F1 | B2 numbers F1 | B1 p50 | LLM |
|---|---|---|---|---|
prismshine-fast |
0.831 |
1.000 (0 FP) |
~90 ms |
0 |
| hhem-2.1-open | 0.746 | 0.926 | ~216 ms | 0 |

Receipt folder on GitHub: `benchmarks/progress/2026-07-20_run4_onnx`

(link in first comment).

```
bash
pip install "prismshine==0.2.2"
prismshine verify --demo
prismshine capabilities
Core path = Tiers 0–2, CPU, 0 LLM calls by default.

from prismshine import EvidenceBundle, PreloadChunk, ShineGate
gate = ShineGate.build(profile="default")
bundle = EvidenceBundle(
    run_id="demo",
    question="What was revenue?",
    answer="Revenue was $1000 in Q1.",
    preload=[
        PreloadChunk(
            chunk_id="c1",
            text="Revenue was $1000 in Q1.",
            source="retrieval",
        )
    ],
)
verdict = gate.verify(bundle)
print(verdict.decision, verdict.resolution_gate, verdict.evidence_hash)
0.2.2 drop-in helpers: validate_grounding · get_gate · enforce_mode_from_env
Shadow without blocking: PRISMSHINE_ENFORCE=0
Docs: INTEGRATION.md §0 (link in first comment).

There’s also a no-API-key browser demo (link in first comment) — pass → fabricated number block → empty-retrieval halt.

Honest limits (BIP)
PASS ≠ world-true — grounded in your preload only
Buffered answers (not mid-stream token verification)
Bare pip install prismshine ≠ Tier-3 span SotA; use prismshine[spans] + ONNX when you need that path
Wired runtime moat is a separate Docker receipt — don’t mix it unlabeled with the HHEM table above
Soft ask
If you try verify --demo and hit a snag, paste the traceback in the comments — I’ll help.

Where would you wire the gate first — after the LLM node, before generation (halt empty retrieval), or both?

### First comment (after publish)
Links (kept out of the lesson above on purpose):

Landing → https://www.insightits.com/products/prismshine.html Demo → https://insightitsgit.github.io/PrismShine/demo.html GitHub → https://github.com/insightitsGit/PrismShine PyPI 0.2.2 → https://pypi.org/project/prismshine/0.2.2/ Receipt → https://github.com/insightitsGit/PrismShine/tree/main/benchmarks/progress/2026-07-20_run4_onnx YouTube → https://www.youtube.com/watch?v=OZCelVhP844 Product Hunt → (paste live PH URL)

Smoke: pip install "prismshine==0.2.2" && prismshine verify --demo
```


