Skip to content

fix(adjudication): tag-grounding guard for fabricated loaded-at-runtime (JEF-451)#251

Merged
thejefflarson merged 2 commits into
mainfrom
thejefflarson/jef-446-tag-grounding-guard
Jul 19, 2026
Merged

fix(adjudication): tag-grounding guard for fabricated loaded-at-runtime (JEF-451)#251
thejefflarson merged 2 commits into
mainfrom
thejefflarson/jef-446-tag-grounding-guard

Conversation

@thejefflarson

Copy link
Copy Markdown
Owner

Closes JEF-451. The deterministic backstop for the recurring false exploitable on protector/argocd, adopted per the amended ADR-0029.

The failure

The judge cites a real CVE id (so guard_fabricated_cve passes) but fabricates its [reachability: loaded-at-runtime] tag — a tag no evidence line carries (every CVE is not-observed). Two live replies on protector/protector:

  • "Critical CVEs with [reachability: loaded-at-runtime] tags (CVE-2023-45853, …) … despite not being observed running" — self-contradictory.
  • "A critical [reachability: loaded-at-runtime] CVE … despite the CVE list being marked as '(none)'" — the list isn't (none); it has 4 not-observed CVEs.

The fable architect audit (R1): loaded-at-runtime is the most-primed n-gram in the prompt (~10× in instructions, 0× in evidence), so a 1.7B judge copy-completes it.

The guard

guard_fabricated_reachability_tag, chained after guard_fabricated_cve: an Exploitable whose reason asserts loaded-at-runtime while no evidence CVE carries that tag → downgrade to Uncertain (re-judged next pass), never Refuted. Reads the same rendered CVE strings the prompt shows.

Why this is ADR-0029-compliant (amended)

It's a grounding/integrity check — a string-membership test over the closed three-value reachability vocabulary the engine itself renders (Reachability::label) — the same class as guard_fabricated_cve, one token deeper. It weighs no severity, re-derives no breach, and can never fire toward a breach. ADR-0029 is amended with a scope-note recording tag-grounding as grounding, not a verdict gate; the forbidden classes (judgement-basis verdict override, evidence capping) stand unchanged.

The primary remedy remains the model/prompt-layer restructuring (being planned separately, bakeoff-validated A/B); this is the deterministic backstop the prompt fixes shrink but can't guarantee.

Tests

Both live flip replies → Uncertain; a genuine loaded-at-runtime citation and a non-tag exploitable pass through; non-Exploitable verdicts untouched. Full suite + clippy + fmt green.

Ships in v0.3.105 alongside JEF-445 (unfreeze), so the recurring false breach both stops being produced (G1) and self-heals if it slips (JEF-445).

🤖 Generated with Claude Code

thejefflarson and others added 2 commits July 19, 2026 08:20
…t fabricates a loaded-at-runtime tag (JEF-451)

The recurring false exploitable on protector/argocd cites a REAL CVE id (so
guard_fabricated_cve passes) but attributes a [reachability: loaded-at-runtime]
tag to it that NO evidence line carries — every CVE is not-observed. The fable
architect audit isolated the root cause: `loaded-at-runtime` is the most-primed
phrase in the prompt (~10x in instructions, 0x in evidence), so a 1.7B judge
copy-completes it; the reasons are self-contradictory ("[reachability:
loaded-at-runtime] tags ... despite not being observed running").

Adds `guard_fabricated_reachability_tag`, chained after guard_fabricated_cve: an
Exploitable whose reason asserts loaded-at-runtime while no evidence CVE carries
that tag → downgrade to the skeptic Uncertain (re-judged next pass), never
Refuted. It reads the same rendered CVE strings the prompt shows.

This is a GROUNDING/integrity check — a string-membership test over the closed
three-value reachability vocabulary the engine itself renders — not a
breach-decision gate: it weighs no severity, re-derives no breach, and can never
fire toward a breach. It is the same class as guard_fabricated_cve, one token
deeper. Recorded as an amendment to ADR-0029 (which preserves that guard class);
the forbidden classes (verdict-override on a judgement basis, evidence capping)
stand unchanged. The primary remedy remains the model/prompt-layer restructuring
being planned; this is the deterministic backstop the prompt fixes shrink but
can't guarantee.

Tests: both live flip replies downgrade to Uncertain; a genuine loaded-at-runtime
citation and a non-tag exploitable pass through; non-Exploitable verdicts
untouched.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VtjoJttCvBY4dzCoE4f9vP
@thejefflarson
thejefflarson merged commit 6f212a4 into main Jul 19, 2026
5 checks passed
@thejefflarson
thejefflarson deleted the thejefflarson/jef-446-tag-grounding-guard branch July 19, 2026 15:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant