Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions gittensor/validator/issue_discovery/scoring.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

from typing import Tuple

import bittensor as bt

from gittensor.constants import (
CREDIBILITY_MULLIGAN_COUNT,
ISSUE_REVIEW_CLEAN_BONUS,
Expand All @@ -35,8 +37,14 @@ def calculate_issue_review_quality_multiplier(changes_requested_count: int) -> f
7+ rounds → 0.0
"""
if changes_requested_count == 0:
return ISSUE_REVIEW_CLEAN_BONUS
return max(0.0, 1.0 - ISSUE_REVIEW_PENALTY_RATE * changes_requested_count)
multiplier = ISSUE_REVIEW_CLEAN_BONUS
else:
multiplier = max(0.0, 1.0 - ISSUE_REVIEW_PENALTY_RATE * changes_requested_count)
bt.logging.info(
f'{changes_requested_count} solving-PR CHANGES_REQUESTED review(s) → '
f'issue_review_quality_multiplier={multiplier:.2f}'
)
return multiplier


def calculate_open_issue_spam_multiplier(total_open_issues: int, solved_token_score: float) -> float:
Expand Down
2 changes: 1 addition & 1 deletion gittensor/validator/oss_contributions/mirror/scoring.py
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ def _calculate_pr_multipliers(scored: ScoredMirrorPR, repo_config: RepositoryCon
scored.open_pr_spam_multiplier = 1.0 # finalized later with combined open-PR count
scored.time_decay_multiplier = round(calculate_time_decay(pr.merged_at), 2)
scored.review_quality_multiplier = round(
calculate_review_quality_multiplier(pr.review_summary.maintainer_changes_requested_count),
calculate_review_quality_multiplier(pr.review_summary.maintainer_changes_requested_count, pr.pr_number),
2,
)
else:
Expand Down
11 changes: 7 additions & 4 deletions gittensor/validator/oss_contributions/scoring.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Copyright © 2025 Entrius

from datetime import datetime
from typing import TYPE_CHECKING, Dict, Tuple, Union
from typing import TYPE_CHECKING, Dict, Optional, Tuple, Union

import bittensor as bt

Expand Down Expand Up @@ -166,15 +166,16 @@ def calculate_base_score(
return result.base_score


def calculate_review_quality_multiplier(changes_requested_count: int) -> float:
def calculate_review_quality_multiplier(changes_requested_count: int, pr_number: Optional[int] = None) -> float:
"""Calculate the review quality multiplier based on maintainer CHANGES_REQUESTED reviews.

Formula: max(0.0, 1.0 - REVIEW_PENALTY_RATE × N)
"""
multiplier = max(0.0, 1.0 - REVIEW_PENALTY_RATE * changes_requested_count)
if changes_requested_count > 0:
ctx = f' (PR #{pr_number})' if pr_number else ''
bt.logging.info(
f'{changes_requested_count} maintainer CHANGES_REQUESTED review(s) → '
f'{changes_requested_count} maintainer CHANGES_REQUESTED review(s){ctx} → '
f'review_quality_multiplier={multiplier:.2f}'
)
return multiplier
Expand All @@ -196,7 +197,9 @@ def calculate_pr_multipliers(
pr.open_pr_spam_multiplier = 1.0
assert pr.merged_at is not None, f'PR #{pr.number} has no merged_at'
pr.time_decay_multiplier = round(calculate_time_decay(pr.merged_at), 2)
pr.review_quality_multiplier = round(calculate_review_quality_multiplier(pr.changes_requested_count), 2)
pr.review_quality_multiplier = round(
calculate_review_quality_multiplier(pr.changes_requested_count, pr.number), 2
)
else:
pr.open_pr_spam_multiplier = 1.0
pr.time_decay_multiplier = 1.0
Expand Down
Loading