Code Review — Gesamtes Projekt
Datum: 2026-06-23
Base: a93ccac (Initial Commit)
Head: 753914e (Code-Qualität: fmt.Sprintf statt custom-Helper, Fehlerbehandlung, Tests)
Reviewer: Senior Code Reviewer (Subagent)
Confidence: 0.92
Geprüfte Dateien (19 files, +8040/-179)
| Package | Files |
|---|---|
cmd/fitness/ |
main.go |
internal/parser/ |
parser.go, parser_test.go |
internal/analyze/ |
checks.go, checks_test.go, consistency.go |
internal/report/ |
skeleton.go, skeleton_test.go, ascii.go, ascii_test.go |
internal/history/ |
csv.go, csv_test.go |
internal/plan/ |
plan.go, plan_test.go |
internal/types/ |
workout.go |
| Config | plan.yaml, wochenplan.md, AGENTS.md, .gitignore |
Verifikation: go build ./... ✅, go test ./... (alle 5 Packages grün) ✅, go vet ./... ✅
Strengths
- Custom-Helper sauber ersetzt:
itoa/ftoa-Helper durchstrconv/fmtersetzt — idiomatisches Go, kein Feature-Verlust. - Fehlerbehandlung verbessert: CSV-Parser und Strong-Parser geben jetzt Parse-Errors statt sie still zu schlucken.
- Bubble-Sort korrekt ersetzt:
sort.Stringsstatt handgerolltem Bubble-Sort. - Tests konkret und verhaltensbasiert:
skeleton_test.go(249 Zeilen) undcsv_test.go(176 Zeilen) testen echtes Verhalten, keine Mocks.preserveEinordnung-Test verifiziert UX-relevantes Verhalten. - JSONL-Write atomar: Append-only mit ID-basierter Deduplizierung bleibt erhalten.
preserveEinordnung: Guter UX-Touch — bestehende Einordnung wird beim Neu-Generieren nicht überschrieben.
Issues
Critical (Must Fix)
1. Weekly-Report verliert Squat und Deadlift
- File:
cmd/fitness/main.go:368-379 - Funktion:
mainLiftsFromPlan - Was: Die Funktion extrahiert nur die erste Übung jedes Trainingstags. Im aktuellen
plan.yamlergibt das[Bench Press (Barbell), Overhead Press (Barbell)]— Squat (Day A, zweite Übung) und Deadlift (Day B, erste Übung? Nein — OHP ist erste Übung an Day B) fehlen. - Warum Critical: Design Spec §7.3 nennt explizit Bench, Squat, Deadlift, OHP als die vier Main Lifts für Weekly Trend Bars. Der Weekly-Report droppt silent zwei der vier Hauptübungen.
- Fix: Entweder die vier Lift-Namen hardcoden (wie vor dem Patch) oder
main_lift: true-Flag inplan.yamleinführen und danach selektieren.
Important (Should Fix)
2. Numeric Sort verwirft Atoi-Fehler
- File:
internal/history/csv.go:132-133 - Code:
ni, _ := strconv.Atoi(keys[i].workoutNum) - Was: Wenn Strong jemals eine nicht-numerische Workout-Nummer exportiert (korrupter Export, Format-Änderung), wird der Wert als 0 sortiert. Da
sort.Slicenicht stabil ist, können zwei nicht-numerische Keys in nicht-deterministischer Reihenfolge landen. - Fix: Error checken, bei Fehler auf String-Vergleich fallen back:
ni, ei := strconv.Atoi(keys[i].workoutNum) nj, ej := strconv.Atoi(keys[j].workoutNum) if ei != nil || ej != nil { return keys[i].workoutNum < keys[j].workoutNum } return ni < nj
Minor (Nice to Have)
3. URL-Skip matcht breiter als dokumentiert
- File:
internal/parser/parser.go:119-120 - Code:
strings.HasPrefix(line, "https://") - Kommentar: "URLs am Ende ignorieren"
- Was: Der Check matcht
https://auf jeder Zeile, nicht nur am Ende. Wenn Strong irgendwann einen Link in Exercise-Notes oder mid-File einbettet, wird die Zeile still gedroppt und der Parser attributiert die Folgezeile falsch. - Fix: Entweder Prefix auf
https://link.strong.app/einschränken oder Kommentar an tatsächliches Verhalten anpassen.
Zusätzliche Empfehlungen (nicht vom Patch eingeführt, aber auffällig)
A. .gitignore versteckt cmd/fitness/main.go
- File:
.gitignore - Rule:
fitnessmatcht auchcmd/fitness/main.go(Git glob matched Pfad-Präfix) - Impact:
main.goist nicht in Version Control — Repo-Hygiene-Blocker. - Fix:
.gitignore-Rule auf/fitness(nur Root-Binary) einschränken.
B. RecommendNextWeight kann negative Gewichte ausgeben
- Trigger: Übungen mit
target_w: 0.0(z.B. Leg Press) - Impact: Empfehlung rendert negative kg-Werte — verwirrend für den User.
- Fix: Minimum-Check:
if rec < 0 { rec = 0 }oder Übungen mittarget_w == 0von der Empfehlungslogik ausschließen.
C. StreakWeeks returned 0 in unvollständiger Woche
- Impact: Selbst wenn der User on track ist (2 von 3 Workouts gemacht), zeigt die Streak 0 — demotivierend.
- Fix: Laufende Woche in Streak-Logik anders behandeln (z.B. "aktuell: 2/3 diese Woche").
Assessment
Ready to merge? Nein — Critical Issue #1 muss vor Merge gefixt werden.
Reasoning: Der Patch macht was er soll (Code-Qualität, Fehlerbehandlung, Tests), aber mainLiftsFromPlan führt eine Regression im Weekly-Report ein, die Squat und Deadlift aus den Trend-Bars entfernt. Ein Fix (Hardcode oder main_lift-Flag) ist trivial. Issues #2 und #3 sind niedriges Risiko, aber sauber zu beheben. Die drei zusätzlichen Empfehlungen sind pre-existing und können separat adressiert werden.