Skip to content

Fix manual-review findings: dynamic age buckets, AD mail match, stale-timestamp gap, naming, perf cleanups - #7

Merged
zerox80 merged 1 commit into
mainfrom
codex/manual-review-fixes
Jun 30, 2026
Merged

Fix manual-review findings: dynamic age buckets, AD mail match, stale-timestamp gap, naming, perf cleanups#7
zerox80 merged 1 commit into
mainfrom
codex/manual-review-fixes

Conversation

@zerox80

@zerox80 zerox80 commented Jun 30, 2026

Copy link
Copy Markdown
Owner

Summary

Eine vollständige manuelle Code-Review (Logic Error / Performance) über das gesamte Repo (Rust-Backend, JS-Frontend, PowerShell-Agent) ergab 8 konkrete Befunde — keine kritischen Bugs, aber mehrere echte Logikfehler und Performance-/Wartbarkeits-Nits. Dieser PR behebt alle.

  • Alters-Histogramm ignorierte konfigurierbaren max_age_years-Schwellwert (overview.rs, mock.js): Bucket-Grenzen waren fix auf 2/4/5 Jahre verdrahtet, obwohl old5/old_age_label im selben Overview-Objekt bereits korrekt den Schwellwert nutzten. Grenzen jetzt proportional zum Schwellwert abgeleitet — beim Default (5,0 Jahre) identisch zur bisherigen Aufteilung, skaliert aber korrekt bei individuellen Schwellwerten. Labels nutzen jetzt durchgängig die 1-Nachkommastellen-Formatierung (fmt_de), konsistent mit dem Rest der App.
  • AD-Suchtreffer per E-Mail wurden clientseitig wieder rausgefiltert (commands.rs, Get-AdUsers.ps1): Das LDAP-Skript sucht u. a. über mail, der nachgelagerte Rust-Filter prüfte das Feld aber nicht und verwarf dadurch gültige LDAP-Treffer. mail ergänzt (Rust + JS-Mock).
  • Fehlendes/unparsbares collectedAtUtc verhinderte "stale" dauerhaft (upgrade.rs): Ein Gerät mit kaputtem Zeitstempel galt für immer als "frisch". Neue dritte Bedingung + eigenes Label ("Unplausibel · Zeitstempel fehlt"), abgesichert durch einen neuen geteilten Golden-Vector-Fall (upgrade-cases.json).
  • DeptStat.upgrade irreführend benannt (model.rs): zählte tatsächlich auch "missing"-Geräte mit ("needs action", nicht nur "needs upgrade"). Umbenannt zu needs_action/needsAction, passend zum bereits bestehenden internen Closure-Namen in overview.rs.
  • Doppelte clone()-Aufrufe in build_one (merge.rs): network, bios und win11 wurden je zweimal geklont (einmal pro abgeleitetem Feld). Jetzt einmal gebunden.
  • build_overview-Performance: vier separate Status-count()-Scans in die ohnehin vorhandene Abteilungs-Schleife verschoben statt eines riskanten Vollrewrites (bei realistischer Flottengröße ohnehin kein messbares Problem).
  • KPI-Rundung für Ø Alter inkonsistent formatiert (app.js): nutzte eigene Ad-hoc-Formatierung statt der 1-Nachkommastellen-Konvention; jetzt über neuen gemeinsamen fmtDe-Helper in view-model.js.
  • Fragile Label-Regex für Chart-Farben (app-panels.js): ersetzt durch robuste Positionslogik (letzter Age-Bucket / erster RAM-Bucket sind per Konstruktion immer die hervorzuhebenden).
  • Windows-Quoting-Randfall (Install-InventoryTask.ps1): ein OutputDir/ScriptPath, der mit einer ungeraden Anzahl Backslashes vor dem schließenden " endet, konnte über den klassischen CommandLineToArgvW-Escaping-Effekt das Argument falsch terminieren. Trailing-Backslash-Verdopplung ergänzt.

Bewusste kosmetische Änderung

Die Alters-Bucket-Labels gewinnen beim Default-Schwellwert eine Nachkommastelle ("< 2 Jahre" → "< 2,0 Jahre"), da die Formatierung jetzt durchgängig über fmt_de/fmtDe läuft (konsistent mit age_text einzelner Geräte). Kein Bug, nur Konsistenz.

Test plan

  • cargo fmt --all -- --check
  • cargo clippy --all-targets -- -D warnings
  • cargo test --all (24/24 grün, inkl. 2 neuer Tests)
  • npm run check
  • npm test (5/5 grün, inkl. neuem Golden-Vector-Fall für fehlenden Zeitstempel)
  • PowerShell ParseFile-Syntaxcheck auf alle Agent-Skripte
  • Manueller Preview-Smoke-Test: Dashboard-Altersverteilung/RAM-Verteilung (Farben + Werte korrekt), Abteilungs-Ansicht, AD-Suche nach @example.com (bestätigt: findet jetzt alle 21 Mock-User über mail, vorher 0 Treffer)
  • Alle geänderten Dateien unter dem 300-Zeilen-CI-Limit (Test-Datei store/tests.rs wurde dafür aufgeteilt, neue store/overview_tests.rs analog zum bestehenden io_tests.rs-Muster)

🤖 Generated with Claude Code

…-timestamp gap, naming, perf cleanups

Vollstaendige manuelle Code-Review (Logic Error / Performance) ueber das gesamte
Repo deckte 8 Befunde auf; dieser Commit behebt alle.

- Alters-Histogramm (Overview) leitete Bucket-Grenzen fix von 2/4/5 Jahren ab,
  obwohl old5/old_age_label bereits korrekt das konfigurierbare max_age_years
  nutzten. Grenzen jetzt proportional zum Schwellwert (identisch zum Default
  bei 5,0 Jahren), in Rust UND im JS-Mock gespiegelt.
- AD-Suche: das LDAP-Skript durchsucht u. a. das mail-Feld, der nachgelagerte
  Rust-Filter pruefte es aber nicht und verwarf dadurch gueltige Treffer.
- evaluate(): ein fehlendes/unparsbares collectedAtUtc liess ein Geraet fuer
  immer als "frisch" gelten, da die Stale-Pruefung nur auf vorhandene Werte
  griff. Neuer Golden-Vector-Fall deckt das jetzt fuer Rust und JS ab.
- DeptStat.upgrade (Feldname unscharf, zaehlte auch "missing"-Geraete mit) zu
  needs_action/needsAction umbenannt, passend zum bereits bestehenden internen
  Closure-Namen.
- build_one: doppelte clone()-Aufrufe fuer network/bios/win11 vermieden.
- build_overview: vier separate Status-count()-Scans in die ohnehin
  vorhandene Abteilungs-Schleife verschoben statt Vollrewrite.
- app.js: KPI-Rundung fuer Ø Alter nutzt jetzt denselben fmtDe-Helper wie der
  Rest der App (neu in view-model.js) statt eigener Ad-hoc-Formatierung.
- app-panels.js: fragile Label-Regex fuer Chart-Farben durch robuste
  Positionslogik ersetzt.
- Install-InventoryTask.ps1: Backslash-Verdopplung vor schliessenden
  Anfuehrungszeichen gegen den CommandLineToArgvW-Escaping-Effekt.

Verifiziert: cargo fmt/clippy(-D warnings)/test (24/24), npm run check/test
(5/5 inkl. neuem Golden-Vector-Fall), PowerShell ParseFile-Syntaxcheck, Preview-
Smoke-Test (Dashboard-Charts, Abteilungs-Ansicht, AD-Suche per Mail), sowie das
300-Zeilen-CI-Limit pro Datei.

Co-Authored-By: Claude <noreply@anthropic.com>
@zerox80
zerox80 merged commit 1328d68 into main Jun 30, 2026
11 checks passed
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