fix(scoring): skip unmodeled-drift sync on garbage upstream constants bodies - #8972
Conversation
… bodies The fail-closed path freezes last-good when constants.py is garbage-but-200, but with no verified last-good the refresh still fell through and ran syncUnmodeledScoringConstantDrift on HTTP-ok alone — opening a spurious drift report from HTML/LFS junk. Gate the sync on constantsUsable instead. Closes JSONbored#8902
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8972 +/- ##
==========================================
+ Coverage 90.56% 90.57% +0.01%
==========================================
Files 96 97 +1
Lines 22490 22558 +68
Branches 3884 3908 +24
==========================================
+ Hits 20367 20433 +66
Misses 1945 1945
- Partials 178 180 +2
Flags with carried forward coverage won't be shown. Click here to find out more.
|
|
Warning ⏸️ LoopOver review result - manual review recommendedReview updated: 2026-07-26 15:20:47 UTC
Decision drivers
Context & advisory signals — never blocks the verdict
Linked issue satisfactionAddressed 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. Decision record
🟩 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.
|
…nd name every silent AI-review skip (#9180) * fix(review): finalize CI-stuck silence, post a waiting placeholder, and name every silent AI-review skip #9011: prReadyForReview used to defer a missing-required-context PR forever past the 2-minute cap instead of falling through to the existing finalize-past-cap block; a required context that never appears keeps ciState pending (never "passed"), so finalizing here can never produce a would-merge disposition. A new stuckReason ("missing_required_context" vs "ci_running") is threaded through the audit/log calls so the two causes are distinguishable. #9042: the silent wait before a review runs (measured live: 8.3min median, 21.9min p90, up to 50.9min) now gets an immediate "waiting" panel comment (renderWaitingForCiPlaceholder) upserted through the same PR_PANEL_COMMENT_MARKER the final verdict replaces, instead of leaving the PR blank until CI settles. #9000: root-causes the #8972 incident where a forced ("Re-run LoopOver review") retrigger completed with none of the events a forced pass should emit anywhere in the audit trail. shouldStartAiReviewForAdvisory folds in shouldRequirePublicAiReviewForAdvisory's hard gate (aiReviewMode off, an ineligible author, no head SHA, an AI kill-switch off, no AI binding) - a forced retrigger does not bypass this gate, and every one of its branches previously returned false with zero audit trail. resolvePublicAiReviewGateSkipReason names the exact reason, and a new catch-all audit event fires whenever aiReviewWillRun ends up false for a cause none of the other (already-audited) paths cover. The two adjacent silent branches in the frozen/paused/one-shot reuse chain - a hold condition true but nothing published to actually reuse - get their own named "unavailable" events for the same reason. This only closes the exhaustive-auditing and root-cause portion of #9000; the receipt-feedback / lost-webhook-click recovery sweep it also asks for is not yet implemented. Closes #9011 Closes #9042 * fix(review): correct stale 'gittensory' brand reference in a comment #9173 introduced a comment referencing the deprecated pre-rename product name, which the branding-drift check on main was not catching -- breaking CI for every PR based on current main, including this one.
Problem
Closes #8902.
refreshScoringModelSnapshotcorrectly fails closed when a 200constants.pybody is semantically garbage and a verified last-good exists — but with no last-good (first run / prior fallback), execution continues and the drift-sync guard was onlyif (constantsResult.ok). That still ranfindUnmodeledUpstreamConstantsagainst HTML/LFS junk and could open a spuriousupstream_drift_reportsrow.Fix
Gate
syncUnmodeledScoringConstantDriftonconstantsUsable(the same recognized-count floor the fail-closed path already uses), not merely HTTP-ok.Tests
listUpstreamDriftReportsstays empty even when the junk body contains a parseable fake unmodeled constant name.Reverting the guard fails the empty-reports assertion.
git diff --checkclean.Scope
Validation
git diff --checkSafety