DocsScoring

Scoring System

ViberTest scores your project 0 to 100 and assigns a letter grade. The scoring uses exponential decay with diminishing returns to keep things fair.

Grades#

GradeScoreMeaning
A90 - 100ExcellentClean, well-structured code
B75 - 89GoodMinor issues, solid foundation
C60 - 74Needs WorkNoticeable quality gaps
D40 - 59PoorSignificant structural problems
F0 - 39CriticalMajor issues across the board

Severity Penalties#

Each issue deducts penalty points based on its severity level:

SeverityBase PenaltyScaling
critical5 ptsLinear — every instance fully counts
high3 ptsLogarithmic — log2(count + 1)
medium1 ptLogarithmic — log2(count + 1)
low0.5 ptsLogarithmic — log2(count + 1)
info0 ptsNo penalty

Diminishing Returns#

Having 15 medium issues from the same rule shouldn't crush your score the same as 15 critical issues. ViberTest uses a logarithmic curve for non-critical severities:

penalty = base_points × log2(count + 1)

The first few instances of a rule matter most. Additional ones have decreasing impact. This keeps scoring fair while still rewarding cleanup.

Issues from one ruleCritical (5 pts each)Medium (1 pt, log2)
15 pts1 pt
515 pts (capped)2.6 pts
1515 pts (capped)4 pts
5015 pts (capped)5.7 pts

Per-Rule Cap#

Each individual rule is capped at 15 penalty points maximum. This prevents a single noisy rule from tanking your entire score.

Final Score Formula#

The final score uses exponential decay:

score = max(10, round(100 × e^(-totalPenalty / 60)))

The minimum score is 10 — even the worst codebase gets some credit for existing.

Total PenaltyScoreGrade
0100A
1085B
3061C
6037F
9022F
120+10F

Practical Example#

A project with these issues:

  • 1 critical issue (hardcoded secret) = 5 pts
  • 3 high issues (dead code) = 6 pts (3 × log2(4) = 6)
  • 8 medium issues (console.log) = 3.2 pts (1 × log2(9) = 3.17)

Total penalty: 14.2 pts

Score: 100 × e^(-14.2/60) = 79 Grade B