3 Commits
Author SHA1 Message Date
Winkler, Stefan 011e5b6816 Version 1.2.1
Claude-Session: https://claude.ai/code/session_01VeqoaAZDVSCU4QBtiYDC5C
2026-09-01 09:59:42 +02:00
Winkler, Stefan a01f4266ea Fehlerhafte Prozent-Skalierung bei Server-Wochen-/Blockwert beheben
Eine veraltete "<=1 -> *100"-Heuristik verfälschte einen echten
Serverwert von 1% zu 100%, sobald der Prozentwert zufällig im Bereich
0-1 lag. Der Endpunkt liefert bereits einen echten 0-100-Prozentwert,
_rememberServerLimit() ging schon immer korrekt davon aus.

Claude-Session: https://claude.ai/code/session_01VeqoaAZDVSCU4QBtiYDC5C
2026-09-01 09:55:43 +02:00
Winkler, Stefan 39f19ab261 Sichtbare Rückmeldung für automatische Kalibrierung ergaenzen
Der erste automatische Kalibrierungsschritt einer Sitzung lief bisher
lautlos ab. Jetzt erscheint dafür einmalig pro Woche/Block ein Eintrag
im Ereignisprotokoll.

Claude-Session: https://claude.ai/code/session_01VeqoaAZDVSCU4QBtiYDC5C
2026-09-01 09:44:28 +02:00
4 changed files with 24 additions and 6 deletions
+4
View File
@@ -175,6 +175,10 @@ Fenster bekannt — daraus folgt die Bezugsgröße unmittelbar. Auch das
Wochenfenster wird aus dem gemeldeten Reset-Zeitpunkt abgeleitet, nicht Wochenfenster wird aus dem gemeldeten Reset-Zeitpunkt abgeleitet, nicht
geraten. geraten.
Der erste automatische Kalibrierungsschritt einer Sitzung erscheint als
Eintrag im Ereignisprotokoll ("Automatisch kalibriert …") — spätere
Aktualisierungen laufen bewusst lautlos im Hintergrund weiter.
Die folgenden Abschnitte betreffen nur den Fall, dass die Abfrage **nicht** Die folgenden Abschnitte betreffen nur den Fall, dass die Abfrage **nicht**
verfügbar ist. verfügbar ist.
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "claude-live-dashboard", "name": "claude-live-dashboard",
"version": "1.2.0", "version": "1.2.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "claude-live-dashboard", "name": "claude-live-dashboard",
"version": "1.2.0", "version": "1.2.1",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"electron": "^43.2.0", "electron": "^43.2.0",
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "claude-live-dashboard", "name": "claude-live-dashboard",
"productName": "Claude Live Dashboard", "productName": "Claude Live Dashboard",
"version": "1.2.0", "version": "1.2.1",
"private": true, "private": true,
"description": "Always-on-Top Mini-Dashboard für Claude-Plan-Auslastung unter Windows und Linux", "description": "Always-on-Top Mini-Dashboard für Claude-Plan-Auslastung unter Windows und Linux",
"main": "src/main/index.js", "main": "src/main/index.js",
+17 -3
View File
@@ -82,6 +82,10 @@ class Collector extends EventEmitter {
// wie die Notification (store.data.updateCheck.notifiedTag), das Symbol // wie die Notification (store.data.updateCheck.notifiedTag), das Symbol
// soll sichtbar bleiben, bis aktualisiert wird. // soll sichtbar bleiben, bis aktualisiert wird.
this._updateAvailable = null; this._updateAvailable = null;
// Merkt sich pro Woche/Block, ob in dieser Sitzung bereits eine
// Kalibrierung aus einer Serverantwort übernommen wurde — für eine
// einmalige Rückmeldung im Ereignisprotokoll, siehe _rememberServerLimit().
this._calibratedOnce = { week: false, block: false };
if (configError) this._note(configError, 'local'); if (configError) this._note(configError, 'local');
if (versionEvent) { if (versionEvent) {
const msg = const msg =
@@ -283,6 +287,12 @@ class Collector extends EventEmitter {
if (!previous || Math.abs(next - previous) / previous > 0.005) { if (!previous || Math.abs(next - previous) / previous > 0.005) {
store.serverLimits[kind] = Math.round(next); store.serverLimits[kind] = Math.round(next);
this.store.save(); this.store.save();
if (!this._calibratedOnce[kind]) {
this._calibratedOnce[kind] = true;
const label = kind === 'week' ? 'Woche' : 'Zeitfenster';
this._note(`Automatisch kalibriert (${label}) aus Serverantwort`, 'oauth');
}
} }
} }
@@ -320,13 +330,17 @@ class Collector extends EventEmitter {
const block = this.limits.evaluate('block', snapshot.block.weighted, server?.blockLimit); const block = this.limits.evaluate('block', snapshot.block.weighted, server?.blockLimit);
const week = this.limits.evaluate('week', snapshot.week.weighted, server?.weekLimit); const week = this.limits.evaluate('week', snapshot.week.weighted, server?.weekLimit);
// Ein exakter Prozentwert vom Server sticht die lokale Rechnung. // Ein exakter Prozentwert vom Server sticht die lokale Rechnung. Der
// Endpunkt liefert bereits einen echten Prozentwert (0100), nicht einen
// Bruch — eine frühere "<=1 → *100"-Heuristik verfälschte z. B. 1 % zu
// 100 %, siehe _rememberServerLimit() unten, die weekPercent schon immer
// konsistent als 0100-Wert behandelt.
if (server?.blockPercent != null) { if (server?.blockPercent != null) {
block.percent = server.blockPercent <= 1 ? server.blockPercent * 100 : server.blockPercent; block.percent = server.blockPercent;
block.confidence = 'exact'; block.confidence = 'exact';
} }
if (server?.weekPercent != null) { if (server?.weekPercent != null) {
week.percent = server.weekPercent <= 1 ? server.weekPercent * 100 : server.weekPercent; week.percent = server.weekPercent;
week.confidence = 'exact'; week.confidence = 'exact';
} }