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:
Richard
2026-10-04 12:45:03 +02:00
co-authored by Claude Opus 5.5
parent da4ceac7d5
commit 837a634a22
311 changed files with 7238 additions and 7252 deletions
@@ -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);
@@ -7,13 +7,13 @@ using Shouldly;
namespace ClawdDotNet.Core.Tests.Budget;
/// <summary>
/// #608: Ein wegen erschoepften Budgets abgelehnter Lauf hinterliess nur eine Log-Warnung -
/// kein Beleg, keine Anzeige an der Aufgabe. Im Testbetrieb fehlten deshalb ab 18:20 alle
/// Wetterdaten, ohne dass es ausserhalb des Logs zu sehen war.
/// #608: A run rejected because of an exhausted budget left only a log warning -
/// no receipt, no indication on the task. In test operation all
/// weather data was therefore missing from 18:20 on, without it being visible outside the log.
/// </summary>
public sealed class BudgetsperreSichtbarTests
{
/// <summary>Meldet fuer jeden Agenten einen Tagesverbrauch ueber jeder ueblichen Grenze.</summary>
/// <summary>Reports for every agent a daily consumption above every usual limit.</summary>
private sealed class ErschoepftesBudget : IUsageRepository
{
public Task RecordAsync(RunUsage usage, CancellationToken ct) => Task.CompletedTask;