Kontrollpflicht der Leitung: Stichproben gegen das Audit (#693)

A lead looks at the runs of the agents it leads - held against the task and
against what the engine stamped, never by asking the agent.

- RunInspector (Core/Inspection): the mechanical check and first profile of
  the inspector foundation (#204). Flags failed runs, tool errors, refusals,
  unfinished calls, tasks answered with bookkeeping alone, and operations the
  agent names but never called in the run (the 2026-09-14 pattern).
- SpotChecks: picks runs per unit (rate, denser for new agents, new models and
  after a failure, daily cap), deterministic by run id; one task per lead.
- Escalation tool: spot_checks, inspect_run, check_done, propose_measure.
  Measures go to a human; nothing is carried out automatically. A security
  suspicion is its own case, not a personnel matter.
- Organisation view: settings per unit, recent checks, measures to decide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-10-01 11:40:20 +02:00
co-authored by Claude Opus 5.5
parent ab1bd67464
commit 68e723a9c0
19 changed files with 1621 additions and 6 deletions
+15
View File
@@ -135,6 +135,9 @@ public sealed class AppHost : IAsyncDisposable
/// <summary>#698: The units' doctrines.</summary>
public Core.Organisation.IDoctrineStore? Doctrines { get; private set; }
/// <summary>#693: The leads' spot checks and the measures they proposed.</summary>
public Core.Inspection.SpotChecks? SpotChecks { get; private set; }
/// <summary>Modellpreise von OpenRouter - fuer Budget und Kostenprognose (#595). Laedt im Hintergrund.</summary>
public ModelPricingCatalog? Pricing { get; private init; }
@@ -717,6 +720,18 @@ public sealed class AppHost : IAsyncDisposable
engine.Doctrines = doctrines;
host.Doctrines = doctrines;
// #693: the leads look at the runs of the agents they lead.
var spotChecks = new Core.Inspection.SpotChecks(
storage, audit,
new Core.Inspection.RunInspector(audit, taskRepository, transcripts,
() => Core.Inspection.RunInspector.VocabularyOf(tools.GetAll())),
() => Core.Organisation.OrgChart.From(instance), board,
loggerFactory.CreateLogger("ClawdDotNet.Core.Inspection.SpotChecks"));
engine.SpotChecks = spotChecks;
host.SpotChecks = spotChecks;
spotChecks.Start();
host._shutdown.Add(spotChecks.DisposeAsync);
// #699: costs per unit, and what changed in them.
var costWatch = new Core.Accounting.CostWatch(
storage, usage, () => Core.Organisation.OrgChart.From(instance), () => instance.CostWatch, board,