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
+31
View File
@@ -56,6 +56,37 @@ public sealed class UnitConfig
/// </summary>
[JsonPropertyName("approvals")]
public UnitApprovals? Approvals { get; set; }
/// <summary>
/// #693: How often the lead of this unit looks at the runs of the agents it leads;
/// <c>null</c> means no spot checks. Set only by a human — checks cost the lead's runs.
/// </summary>
[JsonPropertyName("inspection")]
public UnitInspection? Inspection { get; set; }
}
/// <summary>
/// #693: The spot checks of a unit's lead. Which run is checked is decided by the run id, not
/// by chance — the same run gets the same answer on every pass, and nobody can tell from inside
/// a run whether it will be looked at.
/// </summary>
public sealed class UnitInspection
{
/// <summary>Share of ordinary runs that are checked, 0 to 1.</summary>
[JsonPropertyName("rate")]
public double Rate { get; set; } = 0.1;
/// <summary>Share for a new agent, a new model, or the run after a failure.</summary>
[JsonPropertyName("denseRate")]
public double DenseRate { get; set; } = 0.5;
/// <summary>How long an agent counts as new after its first run.</summary>
[JsonPropertyName("newDays")]
public int NewDays { get; set; } = 7;
/// <summary>Checks a day for the whole unit — a lead that checks everything doubles the unit's costs.</summary>
[JsonPropertyName("perDay")]
public int PerDay { get; set; } = 5;
}
/// <summary>