Skip to content

validator: stop orphan raw scores inflating rolling avg / weights - #187

Open
sindresorhus-jpg wants to merge 1 commit into
Connito-AI:masterfrom
sindresorhus-jpg:fix/score-orphan-finalize-race
Open

validator: stop orphan raw scores inflating rolling avg / weights#187
sindresorhus-jpg wants to merge 1 commit into
Connito-AI:masterfrom
sindresorhus-jpg:fix/score-orphan-finalize-race

Conversation

@sindresorhus-jpg

Copy link
Copy Markdown

A background eval that finishes after a round's eval window closes and finalize_round_scores has run would write a raw delta ** 1.2 score to the aggregator tagged with the finalized round_id. finalize's drop_round had already passed, so the point was never re-ranked: it rode the rolling score_avg as an illegal non-rank value (e.g. one stray 5.179 point pinned a uid's avg at 1.29 with samples=4) and inflated the miner's on-chain weight until it aged out of the history window.

Race fix: add Round.finalized, set atomically with finalize's score snapshot under the round lock. mark_scored now drops any result for a finalized round (releasing the claim) and _record_in_cycle_score refuses to feed the aggregator once finalized, so no late eval can add a raw point after drop_round.

Cleanup fix: MinerScoreAggregator.sweep_orphan_raw_scores() drops stale non-rank points (round_id below the miner's max, or untagged) and is run on load in run.py, remediating orphans already persisted to disk.

A background eval that finishes after a round's eval window closes and
finalize_round_scores has run would write a raw `delta ** 1.2` score to
the aggregator tagged with the finalized round_id. finalize's drop_round
had already passed, so the point was never re-ranked: it rode the rolling
score_avg as an illegal non-rank value (e.g. one stray 5.179 point pinned
a uid's avg at 1.29 with samples=4) and inflated the miner's on-chain
weight until it aged out of the history window.

Race fix: add Round.finalized, set atomically with finalize's score
snapshot under the round lock. mark_scored now drops any result for a
finalized round (releasing the claim) and _record_in_cycle_score refuses
to feed the aggregator once finalized, so no late eval can add a raw
point after drop_round.

Cleanup fix: MinerScoreAggregator.sweep_orphan_raw_scores() drops stale
non-rank points (round_id below the miner's max, or untagged) and is run
on load in run.py, remediating orphans already persisted to disk.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sindresorhus-jpg
sindresorhus-jpg force-pushed the fix/score-orphan-finalize-race branch from 9f0c006 to b24dd2b Compare June 29, 2026 20:41
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