Stufe 4c (#764): Kommentare in C#, WebUI-Skripten, CSS und HTML auf Englisch
Rund 2.600 Kommentarblöcke in 310 C#-Dateien übersetzt, Begründungen vollständig erhalten: blockweise gleiche Anzahl wie vorher, kein Block unter 60 % seiner Länge, der Code außerhalb der Kommentare per Tokenizer byte-identisch geprüft. Zitate deutscher Oberflächentexte und Testdaten bleiben deutsch. WebUI: Kommentare in JS/CSS/HTML übersetzt, JSDoc-@param an die in 4b umbenannten Parameter angeglichen. Dabei behoben: - 4b hatte "tag" (HTML-Tag) als deutsches "Tag" gelesen und zu "dayValue" gemacht (makeElement, svg, Tagesübersicht) - zurück auf tag/day. - Aufgaben "InProgress" bekamen die Plakettenart "laufend", für die es nie eine CSS-Klasse gab - jetzt "success" wie laufende Instanzen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
da4ceac7d5
commit
837a634a22
@@ -7,9 +7,9 @@ using Shouldly;
|
||||
namespace ClawdDotNet.Core.Tests.Budget;
|
||||
|
||||
/// <summary>
|
||||
/// K5 aus der Bestandsaufnahme: Es gab keine Obergrenze. Ein Agent in einer Schleife —
|
||||
/// etwa durch gegenseitige send_message-Aufrufe — konnte unbeaufsichtigt Guthaben
|
||||
/// verbrennen; die Credits-Anzeige war rein informativ.
|
||||
/// K5 from the inventory: there was no upper limit. An agent in a loop —
|
||||
/// for example through mutual send_message calls — could burn credit
|
||||
/// unsupervised; the credits display was purely informational.
|
||||
/// </summary>
|
||||
public sealed class BudgetGuardTests : IDisposable
|
||||
{
|
||||
@@ -27,7 +27,7 @@ public sealed class BudgetGuardTests : IDisposable
|
||||
{
|
||||
ClawdDotNet.Core.Storage.SqliteStorage.ReleasePooledConnections(_directory);
|
||||
try { Directory.Delete(_directory, recursive: true); }
|
||||
catch { /* Aufräumen ist Nebensache */ }
|
||||
catch { /* Cleaning up is secondary */ }
|
||||
}
|
||||
|
||||
private BudgetGuard Guard() => new(_usage, () => _heute);
|
||||
@@ -52,7 +52,7 @@ public sealed class BudgetGuardTests : IDisposable
|
||||
}, default);
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Ohne Grenzen
|
||||
// Without limits
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
@@ -66,7 +66,7 @@ public sealed class BudgetGuardTests : IDisposable
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Kostengrenze
|
||||
// Cost limit
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
@@ -93,14 +93,14 @@ public sealed class BudgetGuardTests : IDisposable
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Token-Grenze — greift auch ohne Preisangaben
|
||||
// Token limit — applies even without price information
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
public async Task Die_Tokengrenze_wirkt_auch_wenn_keine_Preise_vorliegen()
|
||||
{
|
||||
// Der eigentliche Zweck der zweiten Grenze: Bei unbekanntem Modell bleibt die
|
||||
// Kostensumme 0 und eine reine Kostengrenze wäre wirkungslos.
|
||||
// The actual purpose of the second limit: with an unknown model the
|
||||
// cost sum stays 0 and a pure cost limit would be ineffective.
|
||||
await Record(cost: 0m, prompt: 60_000, completion: 5_000, costKnown: false);
|
||||
|
||||
var agent = Agent(costLimit: 10m, tokenLimit: 50_000);
|
||||
@@ -113,7 +113,7 @@ public sealed class BudgetGuardTests : IDisposable
|
||||
[Fact]
|
||||
public async Task Fehlende_Preise_werden_in_der_Begruendung_erwaehnt()
|
||||
{
|
||||
// Sonst wirkte ein niedriger Verbrauch wie ein noch offener Spielraum.
|
||||
// Otherwise a low consumption would look like room still left.
|
||||
await Record(cost: 0m, prompt: 10_000, completion: 1_000, costKnown: false);
|
||||
await Record(cost: 5m);
|
||||
|
||||
@@ -124,7 +124,7 @@ public sealed class BudgetGuardTests : IDisposable
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Instanzgrenze
|
||||
// Instance limit
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
@@ -153,7 +153,7 @@ public sealed class BudgetGuardTests : IDisposable
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Tageswechsel
|
||||
// Day change
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
@@ -178,7 +178,7 @@ public sealed class BudgetGuardTests : IDisposable
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// Restbudget
|
||||
// Remaining budget
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
|
||||
[Fact]
|
||||
@@ -241,8 +241,8 @@ public sealed class UsageRepositoryTests : IDisposable
|
||||
[Fact]
|
||||
public async Task Betraege_ueberstehen_den_Rundlauf_ohne_Rundungsfehler()
|
||||
{
|
||||
// Als Fliesskommazahl abgelegt wuerden sich Cent-Betraege ueber tausende
|
||||
// Laeufe zu einem sichtbaren Fehler summieren.
|
||||
// Stored as floating point, cent amounts would add up over thousands
|
||||
// of runs to a visible error.
|
||||
for (var i = 0; i < 1000; i++)
|
||||
await Record(0.0001m);
|
||||
|
||||
@@ -313,8 +313,8 @@ public sealed class UsageRepositoryTests : IDisposable
|
||||
[Fact]
|
||||
public async Task Viele_Laeufe_koennen_gleichzeitig_erfasst_werden()
|
||||
{
|
||||
// Der alte Weg schrieb TokenUsage.json bei jedem Lauf komplett neu, unter einem
|
||||
// globalen Lock — genau das skalierte nicht.
|
||||
// The old way rewrote TokenUsage.json completely on every run, under a
|
||||
// global lock — exactly that did not scale.
|
||||
await Task.WhenAll(Enumerable.Range(0, 100).Select(i => Record(0.01m, agentId: $"agent-{i % 8}")));
|
||||
|
||||
var daily = await _usage.GetDailyAsync(DateOnly.FromDateTime(Tag), agentId: "", default);
|
||||
|
||||
Reference in New Issue
Block a user