Entscheidungen aus dem Testbetrieb umgesetzt (#572): #577 #579 #581 #589 #193 #205 #594 #595 #597 #598 #599 #588

- Engine: leere Antworten nachfassen, Aufgaben enden mit Ergebniszeile (EmptyResponse/Incomplete),
  gleiche Fehlschlaege erkennen (RepeatedFailure), Zeitzeile vor Chatnachrichten,
  Werkzeugergebnisse gerahmt, Vorpruefung vor dem Staging, Belegkosten wie RunUsage
- Staging: gescheiterte Freigaben als Failed; AgentEditor-Aenderungen freigabepflichtig,
  Selbstbearbeitung gesperrt (allowSelfEdit)
- Taskboard: Termine beim Anlegen pruefen, naechster/letzter Lauf, pausieren, Sofortlauf,
  Kostenprognose, Hinweis auf wachsenden Kontext; Jobs-Reiter und /api/jobs entfernt
- Release: Instanzmanager samt Weboberflaeche im Paket, setup.json fragt manager.json ab,
  Token nicht mehr ins systemd-Journal
Version 0.1.6.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-15 11:23:10 +02:00
co-authored by Claude Opus 5
parent 8ab9d99abe
commit 0b6ea73ec1
42 changed files with 2646 additions and 512 deletions
@@ -175,6 +175,10 @@ public sealed class EngineTaskDispatcher : ITaskDispatcher
sb.AppendLine(task.Acceptance.Trim());
}
// #577: Eine Aufgabe ist erst erledigt, wenn der Agent es ausdruecklich sagt.
sb.AppendLine();
sb.AppendLine(LaufAbschluss.ErgebnisVorgabe);
return sb.ToString().TrimEnd();
}
@@ -184,23 +188,7 @@ public sealed class EngineTaskDispatcher : ITaskDispatcher
/// </summary>
internal static string Zeitangabe(TaskItem task, DateTimeOffset jetzt)
{
var zoneId = string.IsNullOrWhiteSpace(task.When?.TimeZone) ? TimeZones.LocalIanaId : task.When!.TimeZone;
TimeZoneInfo zone;
try
{
zone = TimeZoneInfo.FindSystemTimeZoneById(zoneId);
}
catch (Exception ex) when (ex is TimeZoneNotFoundException or InvalidTimeZoneException)
{
zone = TimeZoneInfo.Local;
zoneId = TimeZones.LocalIanaId;
}
var lokal = TimeZoneInfo.ConvertTime(jetzt, zone);
var invariant = System.Globalization.CultureInfo.InvariantCulture;
var zeile = string.Format(invariant,
"Aktuelle Zeit: {0:dd.MM.yyyy HH:mm} Uhr ({1}, UTC{0:zzz}); in UTC {2:yyyy-MM-ddTHH:mm}Z.",
lokal, zoneId, jetzt.UtcDateTime);
var zeile = ZeitAngabe.Zeile(jetzt, task.When?.TimeZone);
return task.When is { } when
? zeile + $" Termin der Aufgabe: {when.Kind.ToString().ToLowerInvariant()} \"{when.Value}\"."