fix(complexity): calibrate Halstead thresholds to file level, add p90 outlier category - #83
Conversation
… outlier category Die Complexity-Schwellen stammten aus der Halstead-Literatur, wo sie fuer einzelne Funktionen gelten — angewandt auf ganze Dateien lagen sie zwei Groessenordnungen zu niedrig, sodass jedes reale Repo D- bekam, codeqa-action selbst eingeschlossen. Der Mittelwert allein verbarg zudem Ausreisser hinter der Masse kleiner Dateien, weshalb p90 als eigene Kategorie dazukommt.
🟡 Code Health: B- (71/100)
Metric Changes
%%{init: {'theme': 'neutral'}}%%
xychart-beta
title "Code Health Scores"
x-axis ["Readability", "Complexity", "Complexity Outliers", "Structure", "Duplication", "Naming", "Magic Numbers", "Combined Metrics"]
y-axis "Score" 0 --> 100
bar [94, 85, 75, 87, 49, 96, 100, 65]
|
🔍 Top Likely Issues (cosine similarity)
🟢 Readability — A (94/100)Codebase averages: flesch_adapted=97.89, fog_adapted=4.82, avg_tokens_per_line=9.57, avg_line_length=35.81
🟢 Complexity — A- (85/100)Codebase averages: difficulty=41.57, effort=243432.62, volume=4137.53, estimated_bugs=1.38
🟡 Complexity Outliers — B (75/100)Codebase averages: p90_volume=9542.41, p90_difficulty=67.33, p90_effort=659285.40
🟢 Structure — A- (87/100)Codebase averages: branching_density=0.14, mean_depth=3.85, avg_function_lines=8.37, max_depth=9.18, max_function_lines=20.13, variance=6.77, avg_param_count=1.16, max_param_count=2.08
🟠 Duplication — C- (49/100)Codebase averages: redundancy=0.59, bigram_repetition_rate=0.54, trigram_repetition_rate=0.37
🟢 Naming — A (96/100)Codebase averages: entropy=0.89, mean=6.64, variance=18.73, avg_sub_words_per_id=1.17
🟢 Magic Numbers — A (100/100)Codebase averages: density=0.00
🔴 Combined Metrics — D (65/100)
🔴 Code Smells — D- (25/100)
🟡 Consistency — B+ (82/100)
🔴 Dependencies — E+ (19/100)
🟢 Documentation — A- (85/100)
🟢 Error Handling — A- (91/100)
🟠 File Structure — C- (48/100)
🟡 Function Design — B+ (82/100)
🟢 Naming Conventions — A- (90/100)
🔴 Scope And Assignment — D- (29/100)
🟡 Testing — B+ (83/100)
🟢 Type And Value — A- (89/100)
🟡 Variable Naming — B (74/100)
|
kind: refactoring-tasks
|
Die Complexity-Schwellen stammen aus der Halstead-Literatur, wo sie für einzelne Funktionen gelten. codeqa berechnet Halstead aber pro Datei, wodurch sie zwei Größenordnungen zu niedrig lagen: eine gewöhnliche 300-LOC-Datei misst effort ~867k gegen einen A-Schwellwert von 5000, sodass jedes reale Repo D- bekam — codeqa-action auf sich selbst eingeschlossen (30/D-, jetzt 85/A-).
Der Mittelwert allein verbarg zudem genau die Ausreißer, die man sehen will, hinter der Masse kleiner Dateien; deshalb kommt p90 als eigene Kategorie dazu, die die Verteilung statt des Durchschnitts bewertet.