feat(review): structured verifiable absence-claim schema — hallucinated absence can no longer block (#8833) - #9593
Conversation
|
Tip ✅ LoopOver review result - approve/merge recommendedReview updated: 2026-07-28 21:36:13 UTC
Review summary Nits — 4 non-blocking
Decision drivers
Context & advisory signals — never blocks the verdict
Linked issue satisfactionPartially addressed Review context
Contributor next steps
Signal definitions
🧪 Chat with LoopOverAsk LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.
Full command reference: https://loopover.ai/docs/loopover-commands 🧪 Experimental — new and may change. 🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.
|
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
Logic backtestReplayed 0 historical case(s) for Backtest comparison:
|
…ed absence can no longer block (#8833) The flagship remaining piece of #8833. The rubric's DIFF SCOPE / TRACE-BEFORE-ASSERTING-ABSENCE rules have always REQUESTED that an absence blocker point at the visible line that breaks; this makes the discipline checkable and then ENFORCES it: - Blocker entries may now be OBJECTS {claim, kind, evidence}; the object form is REQUIRED for the ABSENCE-claim family (missing_symbol, missing_import, missing_guard, missing_handling, missing_registration -- a CLOSED set, so a novel kind string cannot smuggle a claim past verification). parseModelReview normalizes every usable entry into the existing blockers: string[] surface -- nothing downstream changes shape -- and collects absence claims into ModelReview.absenceClaims. - demoteUnverifiedAbsenceBlockers checks each claim's quoted evidence VERBATIM against the exact user prompt the call sent (leading diff +/- marker stripped; sub-8-char quotes never verify vacuously). An unverifiable claim demotes to the same verification nit the rubric prescribes; a verified quote leaves the blocker standing untouched -- the check can only remove claims the model provably could not ground. - Enforced on BOTH the Workers and BYOK parse paths, logged as ai_review_unverified_absence_demoted for prompt-regression tracking. REVIEW_PROMPT_VERSION bumps to v3 (the schema shapes the verdict surface), moving the #9477 cache fingerprint and #8222 replay keys. Closes #8833
0dd3924 to
a394dda
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #9593 +/- ##
==========================================
- Coverage 89.84% 89.04% -0.81%
==========================================
Files 880 880
Lines 111137 111175 +38
Branches 26457 26473 +16
==========================================
- Hits 99853 98994 -859
- Misses 9992 11155 +1163
+ Partials 1292 1026 -266
Flags with carried forward coverage won't be shown. Click here to find out more.
|
What
The flagship remaining piece of #8833, stacked on #9592 (this branch contains its commit until it merges; the diff collapses to just this change after).
The rubric's DIFF SCOPE / TRACE-BEFORE-ASSERTING-ABSENCE rules have always requested that an absence blocker point at the visible line that breaks — the confirmed hallucination pattern ("missing import/guard/handler" the model merely could not see) walked straight past prose. This makes the discipline checkable, then enforces it:
{"claim", "kind", "evidence"}; the object form is REQUIRED for the absence family (missing_symbol | missing_import | missing_guard | missing_handling | missing_registration— a closed set, so a novel kind cannot smuggle a claim past verification).parseModelReviewnormalizes every usable entry into the existingblockers: string[]surface — nothing downstream changes shape — and collects absence claims intoModelReview.absenceClaims.demoteUnverifiedAbsenceBlockerschecks each claim's quoted evidence verbatim against the exact user prompt the call sent (leading diff+/-marker stripped; sub-8-char quotes never verify vacuously). Unverifiable ⇒ demoted to the very verification nit the rubric prescribes ("Verify: …"). Verified ⇒ the blocker stands untouched — the check can only remove claims the model provably could not ground, never real judgment.ai_review_unverified_absence_demoted(a rising rate is a prompt-regression signal, same as the sibling demotions).REVIEW_PROMPT_VERSION→ v3; the ai(cache): review fingerprint omits prompt and verdict-logic version — superseded verdicts replay forever (11 unbumped changes) #9477 cache fingerprint makes the drift an automatic cache miss and counterfactual: advisory check when reviewer prompt versions change #8222's replay keys on it.Why this closes #8833
With this, every objectively-checkable criterion in the inventory (posted on the issue, 2026-07-26) has a deterministic owner the model cannot override: CI state (#8845), test-evidence existence (#9256), evidence-absence under truncation (#8980), size + staleness/conflicts and the explicit
"unknown"abstention (#9592), scanner-confirmed secrets/lockfile facts (rule-produced findings), and now the absence-claim family — machine-checked, not pleaded. The issue's per-dimension isolated-judge-call architecture is deliberately not adopted: it multiplies per-review AI spend several-fold to re-derive what the demotion family already guarantees by construction, and the confidence/abstention machinery (#8834's both halves + the unknown→hold route) now covers exactly the subjective residual. The remaining REES-side item (structured CVE facts from the enrichment service) needs the REES response schema and is tracked in the enrichment tree, not this gate issue.Tests
""(never verifies); novel kinds never collect evidence; the 6-blocker cap drops overflow claims too (no orphaned verification entries).Verify:nit); diff-marker stripping; vacuous-quote floor; zero-claim same-object return.runWorkersOpinionverifies against the actual prompt it sent; the BYOK path demotes an ungrounded object-form claim and fires the event.Closes #8833