Files

4.8 KiB
Raw Permalink Blame History

SPEC-maintenance: Pflege-Agent, Vorschläge, Freigabe-Richtlinie

Paket: knaster.maintenance, knaster.policy.

1. Vorschlag (Proposal)

id: "P-<laufende Nr>"
kind: request_graduation | promote_skill | demote_skill | merge_skills | retire_skill | mark_slot |
      restart_container | restart_vm | reboot_host | notify | create_candidate | promote_candidate |
      rollback_candidate | train_adapter | recalibrate_context
params: {...}
summary: str             # menschenlesbar
reason: str
risk: low | medium | high
state: open | approved | rejected | executed | failed | expired
source: routine | command | healer | lifecycle
created_at, decided_at, decided_by, result

2. Freigabe-Richtlinie (config/policy.yaml)

default: approve
actions:
  demote_skill:       {mode: auto}
  mark_slot:          {mode: auto}
  restart_container:  {mode: auto}
  restart_vm:         {mode: auto}
  recalibrate_context:{mode: auto}
  promote_skill:      {mode: approve}
  ...
  reboot_host:        {mode: approve, window: "02:00-05:00"}

Policy.decide(kind) -> auto | approve | deny, dazu Policy.in_window(kind, now). Ausnahme unabhängig von der Richtlinie: mark_slot mit status: ok (Slot wieder freischalten) braucht immer eine Freigabe, weil es die unsichere Richtung ist. Liegt eine Aktion mit window außerhalb des Zeitfensters, wird sie zwar freigegeben, aber erst im nächsten Fenster ausgeführt (deferred). Ein Vorschlag mit Modus auto wird sofort ausgeführt und mit decided_by = policy protokolliert.

3. Service-Routine (MaintenanceAgent.run_routine)

Befunde werden aus diesen Quellen gesammelt (alle Grenzwerte in config/maintenance.yaml):

Befund Bedingung Vorschlag
Skill-Drift Pass-Rate der letzten N Fälle auf Stufe ≥ 1 < demote_below (0,80), n ≥ min_cases (20) demote_skill (auto)
Graduierungs-Kandidat Skill auf Stufe 0, ≥ min_cases Fälle, Pass-Rate auf Stufe 0 ≥ promote_min_rate (0,95) request_graduation (approve): Auftrag an Hermes, Varianten zu erzeugen und POST /v1/skills/{name}/graduate aufzurufen. Ein erfolgreicher Lauf erzeugt promote_skill (approve)
Ähnliche Skills cos(description_a, description_b) ≥ merge_similarity (0,92) merge_skills (approve)
Slot degradiert Laufzeitzustand ≠ ok seit > 1 h Hinweis + mark_slot ok nach Prüfung (approve)
Kontext-Ausweicher Signal context_exceeded oder output_truncated ≥ context_signal_limit (10) pro Slot/Woche recalibrate_context (auto)
Adapter-Bedarf Cluster mit ≥ adapter_min_cases (300) verifizierten Train-Fällen und Pass-Rate auf Stufe 1 < 0,9 train_adapter (approve)
Canary auswerten Kandidat im Zustand canary mit ≥ min_n Fällen über das Canary-Modell automatischer Report canary an die Pipeline
Offene Kandidaten Lifecycle-Kandidat wartet auf Freigabe promote_candidate (approve, Risiko hoch)

Das Ergebnis ist ein RoutineReport{findings[], proposals[], auto_executed[], text}. text ist ein deutscher Bericht für den Chat.

4. Befehle per Prompt (MaintenanceAgent.handle_command)

Feste Grammatik (Groß-/Kleinschreibung egal, deutsch und kurze englische Synonyme):

Muster Wirkung
status / hilfe Überblick bzw. Befehlsliste
routine / starte (die) service-routine Service-Routine
vorschläge / zeige vorschläge offene Vorschläge
genehmige P-3 [P-5 …] / approve P-3 Freigabe und Ausführung
genehmige alle (mit )?risiko niedrig alle offenen Vorschläge mit risk == low
lehne P-3 ab[: Grund] / reject P-3 Ablehnung
wechsle <slot> auf <base_model> Vorschlag create_candidate{kind: base_model}
trainiere adapter für <cluster> Vorschlag train_adapter
rollback <slot> Vorschlag rollback_candidate
stufe <skill> zurück / degradiere <skill> Vorschlag demote_skill
markiere <slot> (als)? (ok|degraded|unavailable) Vorschlag mark_slot

Bei unbekanntem Text wird, falls konfiguriert, ein IntentMapper (LLM, Slot tier1-general) gefragt, der nur einen der obigen Befehle als String zurückgeben darf. Der Agent antwortet dann: „Meinst du: <befehl>? Antworte mit ‚ja‘.“ Ein nachfolgendes ja in derselben Sitzung führt den Befehl aus, einen neu erzeugten Vorschlag aber ebenfalls nur bis zur Freigabestufe. Aus Prompt-Aufträgen erzeugte Vorschläge werden nie sofort ausgeführt, auch wenn die Richtlinie auto sagt. Der Mensch bestätigt sie mit genehmige.

5. Ausführung

ActionExecutor.execute(proposal) -> result. Aktionen sind registrierte Handler. Infrastruktur-Aktionen (restart_*, reboot_host) gehen an dieselben Treiber wie beim Healer (SPEC-healer §4). Standard ist Dry-Run: Das Ergebnis beschreibt dann, was getan worden wäre.