Taskboard fasst nach: stockende, entblockte und wartende Aufgaben erkennen und nachfassen (#646)

Alle 30 Minuten, als Abfrage statt Modelllauf: Agentenaufgabe in Arbeit ohne
Aenderung (Vorgabe 24 h) -> einmal neu gestartet, stockt sie binnen einer
Woche wieder, geht es an die Leitung bzw. den Menschen; blockiert mit
erledigten Blockern -> wieder offen; @human-Aufgabe ueber 48 h -> in einer
Sammelaufgabe fuer den Menschen; in_review ueber 48 h und wiederholtes
LoopLimitExceeded (3 in 7 Tagen) -> Aufgabe an die Leitung. Einmal je Zustand,
hoechstens 10 Nachfassungen je Durchgang, jede im Audit. Befunde liegen
abfragbar in TaskFindings (fuer #680); WebUI-Karte 'Liegengeblieben'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-10-02 11:49:04 +02:00
co-authored by Claude Opus 5.5
parent 095722ae9c
commit e42ec100b0
10 changed files with 617 additions and 3 deletions
+11 -1
View File
@@ -141,6 +141,9 @@ public sealed class AppHost : IAsyncDisposable
/// <summary>#725: Inbound triggers — n8n or any other system hands an agent a task.</summary>
public Core.Triggers.InboundTriggers? Triggers { get; private set; }
/// <summary>#646: Findings on work that lives but does not move.</summary>
public Core.Tasks.TaskFollowUp? FollowUp { get; private set; }
/// <summary>#700: Day values and the month archive of audit and receipts.</summary>
public Core.Audit.AuditArchive? AuditArchive { get; private set; }
@@ -937,6 +940,11 @@ public sealed class AppHost : IAsyncDisposable
estimator: estimator, fillSettings: () => instance.FillWork)
: null;
// #646: the board follows up on stalled, unblocked and waiting work.
var followUp = new Core.Tasks.TaskFollowUp(board, taskRepository, audit, storage, () => instance.FollowUp,
() => engine.OrganisationProvider?.Invoke(), loggerFactory.CreateLogger("ClawdDotNet.Core.Tasks.FollowUp"));
host.FollowUp = followUp;
var scanner = new TaskScanner(taskRepository, dispatcher, loggerFactory,
maxParallelRuns: instance.MaxParallelTaskRuns,
budgetMissPolicy: task =>
@@ -967,7 +975,9 @@ public sealed class AppHost : IAsyncDisposable
tools.Get,
loggerFactory.CreateLogger("ClawdDotNet.Core.Tasks.Reports")),
// #689: A case nobody solves in time goes to a human.
caseDesk),
caseDesk,
// #646: work that lives but does not move is followed up.
followUp),
// #717: Fill work runs on budget the day leaves unused, and never overruns its
// deadline silently — a human is asked in time.
fillGate: headroom,