Fix manual-review findings: dynamic age buckets, AD mail match, stale-timestamp gap, naming, perf cleanups - #7
Merged
Conversation
…-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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.
max_age_years-Schwellwert (overview.rs, mock.js): Bucket-Grenzen waren fix auf 2/4/5 Jahre verdrahtet, obwohlold5/old_age_labelim 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.mail, der nachgelagerte Rust-Filter prüfte das Feld aber nicht und verwarf dadurch gültige LDAP-Treffer.mailergänzt (Rust + JS-Mock).collectedAtUtcverhinderte "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.upgradeirreführend benannt (model.rs): zählte tatsächlich auch "missing"-Geräte mit ("needs action", nicht nur "needs upgrade"). Umbenannt zuneeds_action/needsAction, passend zum bereits bestehenden internen Closure-Namen inoverview.rs.clone()-Aufrufe inbuild_one(merge.rs):network,biosundwin11wurden 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).fmtDe-Helper in view-model.js.OutputDir/ScriptPath, der mit einer ungeraden Anzahl Backslashes vor dem schließenden"endet, konnte über den klassischenCommandLineToArgvW-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/fmtDeläuft (konsistent mitage_texteinzelner Geräte). Kein Bug, nur Konsistenz.Test plan
cargo fmt --all -- --checkcargo clippy --all-targets -- -D warningscargo test --all(24/24 grün, inkl. 2 neuer Tests)npm run checknpm test(5/5 grün, inkl. neuem Golden-Vector-Fall für fehlenden Zeitstempel)ParseFile-Syntaxcheck auf alle Agent-Skripte@example.com(bestätigt: findet jetzt alle 21 Mock-User übermail, vorher 0 Treffer)store/tests.rswurde dafür aufgeteilt, neuestore/overview_tests.rsanalog zum bestehendenio_tests.rs-Muster)🤖 Generated with Claude Code