4.3 KiB
SPEC-maintenance: Pflege-Agent, Vorschläge, Freigabe-Richtlinie
Paket: knaster.maintenance, knaster.policy.
1. Vorschlag (Proposal)
id: "P-<laufende Nr>"
kind: promote_skill | demote_skill | merge_skills | retire_skill | mark_slot | restart_container |
restart_vm | reboot_host | 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, now) -> auto | approve | deny. 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 ≥ 0,95 |
promote_skill → Graduierungslauf (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) |
| Offene Kandidaten | Lifecycle-Kandidat wartet auf Freigabe | Verweis auf promote_candidate |
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.