Selbstverbesserungskreis - Betrieb¶
Stand: 05.10.2026. Ausbau (03.10.2026, Auftrag "Finaler Ausbauauftrag zum kontrolliert selbstverbessernden System"): docs/ausbau/AUSFUEHRUNGSPROTOKOLL.md, docs/ausbau/ledger.json,
docs/ausbau/nachweise/. Autonomer Betrieb (04./05.10.2026, Auftrag "Produktionsautonomie"): Abschnitt 9 dieses Dokuments, ops/selfimprove/betrieb/LIESMICH.md,
docs/LENNY_PRODUKTIONSAUTONOMIE_ABSCHLUSS.md, docs/produktionsautonomie/.
1. Wer macht was¶
| Rolle | Wo | Aufgabe |
|---|---|---|
| Zustandsmaschine, Audit, Detektor, Endpunkte | Server (core/si_state.py, si_store.py, si_detektor.py, si_routes.py) |
19 Zustaende, jeder Wechsel gegen Modus, Admin-Veto, Versuchsgrenze, Parallelitaet und Pflicht-Artefakte geprueft; Audit-Kette (Hash) laesst sich nicht aendern. Der Detektor (alle 15 Minuten) prueft Invarianten (core/si_invariants.py) und legt Laeufe an. |
| Entscheider | Server (core/si_gate.py) |
Deterministisch: APPROVE nur, wenn alle geforderten Gates gruen sind und das Zielproblem behoben ist. Kein Modell, keine Meinung. |
| Controller | lokal (ops/selfimprove/controller.py) |
Fuehrt einen Lauf Schritt fuer Schritt weiter (Dienstkonto selfimprove: kein Admin, keine Sperraufhebung). Nichts, was der Server nicht zulaesst. |
| Autopilot | lokal (ops/selfimprove/autopilot.py) |
Der Controller ohne Bediener: ein Durchgang fuehrt jeden offenen Lauf mit denselben Schritten weiter (rebase, bau, teste, deploye, naechster Versuch mit Befund). Entscheidet nichts - jeder Schritt ist ein Zustandswechsel, den der Server prueft; verweigert er ihn (Veto, Modus, Parallelitaet), wartet der Lauf. Faengt keinen Bauversuch an, wenn die Coding-KI nicht angemeldet ist. Nicht als Dauerdienst eingerichtet (siehe Abschnitt 8). |
| Coding-KI | lokal (agent.py) |
Nur fuer CODE_GAP. Eigener Worktree, bereinigte Umgebung, Allowlist, hoechstens ein Commit-Stapel; kein Zugang zu Produktion, Server oder Schluesseln. |
| Evaluator + Sandbox | lokal + Server (evaluator.py, sandbox.py) |
Baseline und Kandidat laufen in getrennten Containern auf einer KOPIE der Produktionsdaten; alle Gates; die Produktion bleibt unveraendert (G23). |
| Deployer | lokal (deployer.py) |
Rollback-Ziel -> deploy.sh --commit (Deploy-Schranke: Tests + core-Grundlinie) -> Health -> Smoke -> Hard Security Checks -> Probation oder sofortiger Rollback. |
| Watcher | Server-Host (Cron alle 5 Minuten, si/bin/watcher.py) |
Beobachtet die 24-h-Probation; Hard-Fail -> Rollback, nach 24 h ohne Hard-Fail -> accepted. Laeuft ohne Controller. |
| Administrator | /v1/admin/selfimprove/* |
Veto (problem, change, candidate, run), Modus, Aufhebung. Nur der Administrator hebt etwas auf. |
2. Modi und Obergrenze¶
config/self_improvement_policy.json (Admin, im verbotenen Bereich) setzt die Obergrenze self_improvement_mode; der Administrator setzt den Modus zur
Laufzeit (POST /v1/admin/selfimprove/mode mit off|observe|build|deploy und Grund) - wirksam ist nie mehr als die Obergrenze, und kein Kandidat und keine
Automatik kann beides aendern.
| Modus | erlaubt |
|---|---|
| off | nichts (Detektor schweigt) |
| observe | erkennen, klassifizieren, protokollieren |
| build | zusaetzlich reproduzieren, spezifizieren, Candidate bauen und testen |
| deploy | zusaetzlich deployen (Produktion) |
Weitere Grenzen der Policy: 3 Patch-Versuche je Problem, 1 aktiver CODE-Candidate, 24 h Probation, Absagequote hoechstens +1,0 Prozentpunkte, p95-Latenz und Spitzen-Speicher hoechstens +25 %, keine neuen Laufzeit-Abhaengigkeiten, keine zerstoerende Schema-Migration.
3. Ein Lauf (SIR--)¶
detected -> classified -> reproducing -> specified -> queued -> building -> candidate_ready -> testing -> approved -> deploying -> probation -> accepted
| | | \-> rolled_back
\-> non_reproducible / unresolved \-> build_failed \-> rejected (naechster Versuch mit Befund)
(UNKNOWN: nie reproducing; admin_blocked / policy_blocked jederzeit)
| Klasse | Aenderung | Pruefung | Ende |
|---|---|---|---|
| CODE_GAP | Commit der Coding-KI im Scope der Change-Spec (allowed_scope, forbidden_scope aus der Policy) |
alle Gates G1-G28 | Deploy, 24 h Probation, dann accepted; Hard-Fail -> rolled_back |
| CONFIG_GAP | genau EINE Zeile LENNY_ENABLE_*=1 in der Compose-Datei (nur EIN, nie AUS) |
wie CODE_GAP, der erwartete Antwort-Unterschied ist benannt | Deploy, Zielschalter wirkt -> accepted (keine Probation) |
| DATA_GAP | Belegsatz-Stapel aus dem Luecken-Protokoll (nur strenger Wikipedia-Beleg, candidate_only, ohne globalen Stabilitaets-Pass) |
G6-G9, G18-G20 in der Sandbox, Rueckweg getestet | Anwendung als Aenderungssatz, Wirkung geprueft -> accepted, sonst Rueckweg |
| RULE_GAP | Regelkandidat im Kreativ-Gehirn | Schattenlauf, Wirkungsmeldungen, herkunft: kreativ |
wie DATA_GAP |
| UNKNOWN | keine | - | unresolved, nie eine Aenderung |
4. Befehle (lokal, im Verzeichnis ops/)¶
export SSH_KEY_PATH=/e/Lenny_Hyper/experiments/lenny_language_layer_prototype_v1/deploy/ssh/lenny_deploy_key # nur fuer deploy/teste
python -m selfimprove.controller status # Modus, offene Laeufe, Audit
python -m selfimprove.controller rebase <run> # Basis veraltet -> neu reproduzieren und spezifizieren
python -m selfimprove.controller bau <run> [--agent claude-code|scripted|session] [--rezept datei.json]
python -m selfimprove.controller abschliessen <run> --bericht <text> --transkript <jsonl> # nur agent session: Transkript wird geprueft
python -m selfimprove.controller teste <run> # Bewertung in der Server-Sandbox (ca. 25 Minuten)
python -m selfimprove.controller deploye <run> # Rollback-Ziel, deploy.sh, Pruefungen, Probation/accepted/Rollback
python -m selfimprove.controller versuch <run> --befund "..." # naechster Versuch nach rejected/build_failed
python -m selfimprove.controller wiederoeffne <run> --grund "..." # unresolved mit NEUER Evidenz erneut oeffnen (Abschnitt 13); der Detektor fuehrt ihn bis queued weiter
python -m selfimprove.controller erkenne-daten # haeufigste belegbare Definitionsluecke -> DATA_GAP-Lauf
python -m selfimprove.controller erkenne-regel <datei> # RULE_GAP-Lauf aus {stapel, anfrage, erwartung}
python -m selfimprove.controller export <run> # kompletter Verlauf als Nachweisdatei
python -m selfimprove.autopilot [--daten] [--dauer] # alle offenen Laeufe ohne Bediener weiterfuehren (siehe unten)
Autopilot. Ein Durchgang geht ueber alle offenen Laeufe und bringt jeden so weit, wie er ohne Bediener kommt (bis zu einer Wartestelle, einem
Endzustand oder einem Fehler); der Bericht steht als JSON auf der Konsole und in <work>/autopilot.log.jsonl. Exitcode 0 = kein Fehler, 1 = ein Schritt
endete mit einem Fehler, 2 = ein anderer Autopilot arbeitet (Schloss <work>/autopilot.lock, nach 6 h als verwaist uebernommen). --daten legt zusaetzlich die
haeufigste belegbare Datenluecke als DATA_GAP-Lauf an (nur wenn keiner offen ist); --dauer wiederholt alle 15 Minuten, bis <work>/autopilot.stop existiert.
Der Autopilot wartet statt zu scheitern: Modus observe/off (nichts), Modus build (bauen und testen, nicht deployen), ein gesperrter Lauf (wird nicht
angefasst), ein anderer aktiver CODE-Kandidat, ein anderer Neustart-Deploy in der Probation, eine nicht angemeldete Coding-KI (der Lauf bleibt in queued, es wird
kein Versuch verbraucht). Den Agenten session kennt er nicht - das ist der Weg des Orchestrators von Hand.
Wiederoeffnen (Abschnitt 13). Nach drei verbrauchten Versuchen steht ein Fall auf unresolved und bleibt erhalten; mit NEUER Evidenz darf er erneut geoeffnet werden (wiederoeffne <run> --grund "was ist neu": Uebergang unresolved -> detected mit dem Artefakt neue_evidenz; das Versuchsbudget beginnt neu). Den Weitergang bis queued uebernimmt der Detektor des Servers beim naechsten Durchgang (hoechstens 15 Minuten) - dasselbe gilt fuer einen Lauf, der wegen des Modus off in detected liegen blieb. Ohne Begruendung oeffnet der Controller nichts (keine Endlosschleife); ein vom Administrator gesperrter Lauf bleibt gesperrt.
claude-code startet claude -p im Worktree und braucht eine angemeldete CLI (claude login; ohne Anmeldung meldet der Dispatcher "Failed to
authenticate" und beginnt keinen Versuch). session ist die Coding-KI als Subagent einer Sitzung; ihr Transkript wird gegen dieselbe Allowlist
geprueft. scripted fuehrt ein eingechecktes Rezept (ops/selfimprove/drills/) aus - nur fuer Selbsttests.
5. Administrator¶
POST /v1/admin/selfimprove/block {"ziel_art": "problem|change|candidate|run", "ziel": "<id>", "grund": "..."} -> admin_blocked
POST /v1/admin/selfimprove/unblock {"ziel_art": ..., "ziel": ..., "grund": ...} -> nur der Administrator
POST /v1/admin/selfimprove/mode {"modus": "off|observe|build|deploy", "grund": "..."}
GET /v1/admin/selfimprove Uebersicht und Admin-Ereignisse
Neue Evidenz zu einem gesperrten Fall wird angehaengt; sie hebt den Block nie auf. Wissenssperren (Fragment, Relation, Zweig) liegen auf einer eigenen Ebene
(/v1/admin/sperre*, core/admin_sperre.py): gesperrt heisst Wirkung null in Antwort, Evidenz, Befoerderung, Stabilitaet und Ableitung - gespeichert bleibt alles.
6. Probation und Rollback¶
- Marke
probation.jsonim Rollback-Verzeichnis/opt/lenny/v01b/si/rollback/<rb>/; der Watcher schreibtwatcher_state.jsonund meldet dem Kreis. - Sofort-Rollback bei: Tenant-Leck, umgangener Admin-Sperre, verletzter Datenintegritaet, dauerhaft rotem Health, Gold-Hard-Fail (auch: das Zielproblem besteht in der Produktion nicht), Mischzustand der Identitaet, Neustart-Serie, ungewoehnlicher Fehlerquote.
- Tenant-Isolation (Abschnitt 25) prueft der Watcher stuendlich in der Produktion: das Dienstkonto
selfimprovehat EINE Angabe in seinem persoenlichen Gedaechtnis ("Ich wohne in ZorgstadtSelfimproveProbeX."; einmal geschrieben, danach nur gelesen); der Zugangtraversefragt viermal ueber Chat und Stream danach und darf sie nie sehen, ohne Anmeldung gibt es keinen Zugang (401). Positivkontrolle: der Eigentuemer bekommt sie zurueck - misslingt sie, ist das nur weich. Hart ist allein ein Fremdtreffer. Die Probe laeuft seit 03.10.2026 16:05 UTC (davor, ab 15:14:46Z, ohne sie: 10 Beobachtungen der Probation von Lauf 0003). Der Watcher-Stand auf dem Host steht inops/selfimprove/watcher.py(die vorige Fassung:/opt/lenny/v01b/si/bin/watcher.py.vor_tenant.20261003T160407Z). - Was eine Wartung kurz erzeugen kann, ist nie sofort hart (Fund 03.10.2026 16:45 UTC: ein Fehlalarm der Schema-Pruefung rollte einen gesunden Kandidaten zurueck, weil der
Cron
think_pass(45 */3) beim Oeffnen der Datenbank die Triggerlai2_format_role_*_guardper DROP und CREATE neu anlegt und zur selben Minute wie der Watcher startete). Seit 03.10. 16:49 UTC gilt ein solcher Befund erst nach drei Wiederholungen im Abstand von 20 s als hart (WIEDERHOLUNGENinwatcher.py); ein Lesefehler der Datenbank, ein Aussetzer der API im Gold-Smoke ("nicht pruefbar") ist weich. Neue Pruefungen gegencrontab -ldes Hosts halten und zuerst im Beobachtungsmodus laufen lassen. - Absturzschutz (seit 03.10. 18:10 UTC): eine Ausnahme in einer Pruefung (Integritaet, Zielfix, Gold-Smoke, Ausnahmen) oder bei einer Marke ist ein weicher Hinweis
fehler (<Typ>: ...)im Watcher-Zustand und verhindert weder die uebrigen Pruefungen noch einen Rollback. Die vorige Fassung liegt als/opt/lenny/v01b/si/bin/watcher.py.vor_schutz.20261003T181016Z; die Arbeitskopie im Repository ist die Quelle (beim Ersetzen auf dem Host wird der sha256 der hochgeladenen Datei mit der Arbeitskopie verglichen; Stand 03.10.: 0c35ee3db9ab6f2e). - Die Verhaltensproben der Admin-Sperre (E-07 bis E-10) laufen nicht in der Produktion (dort gaebe es nur mit einem Administratorschluessel eine Sperre, und kein
automatischer Prozess darf sperren oder aufheben), sondern gegen eine Sandbox des deployten Commits:
python -m selfimprove.admin_beweis --commit <sha>undpython -m selfimprove.veto_beweis --commit <sha>- der Watcher prueft in der Produktion, dass der Schutz der Sperr-Ereignisse (Trigger) steht und keine Ereignisse verloren gehen. - Rollback =
rollback_host.py(vertraute Kopie): Abbild-Tag, Compose,image_id.env, Host-Dateien; danach wird die Identitaet des Vorstands geprueft und nachgewiesen, dass keine Administratorentscheidung verloren ging. Von Hand:python3 /opt/lenny/v01b/si/bin/rollback_host.py --plan <rb>/plan.json --grund "...".
7. Nachweis-Werkzeuge¶
| Werkzeug | Zweck |
|---|---|
python -m selfimprove.admin_beweis --commit <sha> |
Laufzeit-Beweis der Wissenssperren (E-07 bis E-10, K-20/K-21) in einer frischen Sandbox |
python -m selfimprove.veto_beweis --commit <sha> |
Veto gegen einen Lauf (P8-4) |
python -m selfimprove.unknown_probe |
UNKNOWN erzeugt keine Aenderung (K-02), gegen die Produktion (nur Audit-Eintraege) |
python -m selfimprove.produktions_nachweis --name <stamm> |
Stand der Produktion, rein lesend |
LENNY_SI_LANGSAM=1 python -m pytest tests/test_si_evaluator_e2e.py |
der Evaluator an echten Kandidaten (guter, ohne Zielfix, Regression, Gate-Abschwaechung, Tenant-Leck, Admin-Lock, unbelegte Antwort, stille Sperre) |
ops/selfimprove/drills/ |
eingecheckte Rezepte: Regression (soll an G2 scheitern), Produktionsfehler (nur in der Produktion falsch -> Rollback) |
python -m selfimprove.headless_beweis |
der Headless-Weg der Coding-KI (claude -p) EINMAL echt im isolierten Worktree; schreibt den Beleg, den der Autopilot fuer CODE verlangt (AUTH_BLOCKED ohne Anmeldung) |
python -m selfimprove.e2_beweis <run> |
E2: ein schlechter CODE-Kandidat (Regressions-Drill) wird vom Kreis automatisch abgelehnt, die Produktion bleibt unveraendert |
python -m selfimprove.e7_beweis --commit <sha> |
E7: Administrator-Veto waehrend eines autonomen Vorgangs, mit dem Autopiloten, in einer Server-Sandbox |
python -m selfimprove.probe_verkehr [--wirkung <regel>] |
Testverkehr des Feldzugangs in der Probe-Domaene si-probe: drei unabhaengige Beobachtungen (E3), optional Wirkungsmeldungen |
python -m selfimprove.aufraeumen [--ausfuehren] |
Rollback-Artefakte bereinigen: Plan (Trockenlauf) oder Ausfuehrung mit Vorher/Nachher-Messung (behalten: aktive Version, Ziel einer Probation, letzte drei gueltige) |
python -m selfimprove.auto_truth_nachweis --sandbox --status |
Sandbox-Testpromotion der Wahrheitspromotion und der Aktivierungsstatus am echten Bestand (SAFE-CLOSED ohne zweite Evidenzfamilie) |
docs/produktionsautonomie/skripte/e8_guard_atomaritaet.py |
E8: Guard-Atomaritaet unter parallelem Schreiben an einer Kopie der Produktions-DB (im Container ausfuehren) |
8. Bekannte Grenzen¶
- Erkennen (Detektor) und Beobachten (Watcher) laufen als Dienste auf dem Server. Bauen, Testen und Deployen fuehrt der Controller aus - als Kommando oder mit
python -m selfimprove.autopilot. Seit dem 04.10.2026 laeuft der Autopilot als Betriebsjob in der Aufgabenplanung (Lenny-SelfImprove-Autopilot, alle 15 Minuten, siehe Abschnitt 9); er deployt dauerhaft ohne Bediener. Der Administrator behaelt Veto, Modus und Sperren;autopilot.pausehaelt den Job an. - Fuer CODE_GAP braucht der Autopilot die angemeldete CLI (
claude auth statuszeigtloggedIn: true) UND den Beleg des Headless-Weges; ohne beides baut er nur CONFIG-, DATA- und RULE-Laeufe. - Eine Bewertung, ein Datensnapshot (Abschnitt 15.1): der Controller zieht EINE konsistente Kopie der Produktionsdaten (SQLite-Backup, Quelle nur lesend), Basis und Kandidat starten beide aus ihr, danach wird sie entfernt - auch bei einer gescheiterten Bewertung. Ohne sie sahen beide Instanzen verschiedene Daten (ein Cron der Produktion aenderte sie dazwischen) und G19 lehnte einen gesunden Kandidaten ab (Lauf 0011).
- SSH:
Ssh.runverbindet bis zu dreimal neu, aber nur bei Fehlern VOR Beginn der Sitzung (Connection closed by ...,refused,timed out); der Befehl ist dann nie gelaufen. Ein Abriss mitten im Befehl wird nie wiederholt.deploy.shund die Tunnel der Sandbox haben diese Wiederholung nicht. claude -pbraucht eine angemeldete Claude-Code-CLI auf der Maschine des Controllers.- Die Produktion deployt nur der Controller mit dem Deploy-Schluessel; die Coding-KI hat ihn nie.
Fallen aus dem ersten echten Betrieb (05.10.2026).
- Tests duerfen nicht vom Fortbestehen eines Defekts abhaengen. Ein Test, der den Probe-Defekt (
probe_normalisierung,probe_kuerzung) voraussetzt, laesst genau den Fix scheitern, den der Kreis bauen soll (G2 fuehrttests/des Kandidaten-Commits aus; die Coding-KI darf bestehende Tests nicht aendern). Vor dem ersten echten CODE-Lauf den erwarteten Fix in einem Scratch-Worktree anwenden und die Vollsuite dort laufen lassen; den Defekt in Tests per Test-Double (Hakenprobe_modul) einspielen. Eine solche Korrektur muss ERST deployt sein, denn die Spec-Basis ist immer die Produktion. - Nie zwei Suiten (oder eine Suite und den Autopiloten) gleichzeitig auf demselben Repository: Branch- und Worktree-Namen der Kandidaten sind deterministisch (
si/CH-<hash>,<work>/cand_c<hash>) und kollidieren (invalid reference). - Ein Befund wandert in jeden weiteren Versuch (Abschnitt 13) - auch durch den Rebase. Stellt sich spaeter heraus, dass der Befund irrefuehrt (Fehlalarm des Watchers, Fehler der Selbsttests), die Richtigstellung als Feld
korrekturim Befund mitgeben (Controller.spezifiziere_neu), sonst glaubt die Coding-KI, das Problem sei nicht loesbar. - Die Konfigurationsquelle schlaegt nie einen Schalter vor, dessen Grundstellung AUS ein Test festschreibt (
signale.FESTGESCHRIEBEN): das Einschalten ist die Freigabe der Entwickler; ein Kandidat scheitert ohnehin an G2. - Der strenge Wikipedia-Beleg nimmt nur ein grossgeschriebenes Substantiv als Oberkategorie; die Wikipedia drosselt (HTTP 429) - je Durchgang hoechstens
LENNY_SI_UNKNOWN_BUDGET(8) Pruefungen, Absagen werden gemerkt. - Git-Push haengt: verwaiste
git-credential-manager get-Prozesse abraeumen (Get-CimInstance Win32_Process | ? Name -match 'git-credential-manager|git-remote-https' | Stop-Process), danach ohne Zeitlimit im Hintergrund pushen.
9. Autonomer Betrieb (seit 04./05.10.2026)¶
Der reale Betriebsweg: Lenny beobachtet -> erkennt ein Defizit -> klassifiziert -> DATA / RULE / CONFIG bearbeitet der Autopilot selbst; bei CODE: Change-Spec -> Headless-Coding-KI
(claude -p) -> Sandbox -> Evaluator -> Gates -> autonomer Deploy -> Probation -> accepted / Rollback. Der Administrator besitzt jederzeit das Veto; Sperren hebt keine Automatik auf.
Signalquellen (ops/selfimprove/signale.py, regel_zulauf.py, fehler_zulauf.py; Autopilot-Option --signale). Jede Quelle legt hoechstens einen Lauf an und scheitert fuer sich:
| Quelle | Anlass | Klasse |
|---|---|---|
| Goldfall | ein bisher gruener Hard-Gold-Fall ist reproduzierbar rot (in allen Wiederholungen der Messung; hoechstens stuendlich gemessen; die erste Messung legt nur die Grundlinie an) | nach si_klassifikation (CODE nur, wenn sich der Code seit dem letzten Gruen geaendert hat, sonst UNKNOWN) |
| gleiche Fehler | drei unabhaengige Faelle derselben verletzten Eigenschaft (Komponente + Ausnahmeklasse) im Fehlerbuch des Servers (GET /v1/selfimprove/fehlerbuch, 29 Stellen im api_server), nicht nach Text geclustert |
CODE_GAP (die Klassifikation kann nach den belegten Fakten auch DATA/RULE/CONFIG ergeben) |
| wiederkehrende Unknowns | semantisch gleiche Definitionsfragen ohne Antwortbasis, mindestens drei unabhaengige Faelle (verschiedene Frage oder Tag), Antwortweg vorhanden, strenger Wikipedia-Beleg; ALLE Gruppen kommen in Betracht, je Durchgang hoechstens 8 Belegpruefungen (LENNY_SI_UNKNOWN_BUDGET), Absagen werden gemerkt |
DATA_GAP |
| Regelmuster | drei unabhaengige Beobachtungen (ohne gemeinsamen Wurzelbeleg) verlangen denselben Schluss in einer Domaene mit Regeln -> Regelhypothese hyp-<sha> (gemeinsamer Kern der Signale) als Kandidat im KREATIV-Gehirn |
RULE_GAP |
| Konfiguration | Fragen, die der Code mit einem Schalter der Allowlist (3 Faehigkeiten mit Test) erkennt und die die Produktion ohne ihn abweist | CONFIG_GAP |
Nicht ausreichend und nie ein Ausloeser: eine einzelne Beobachtung, ein Modellurteil ohne Beleg, dieselbe Anfrage wiederholt, dasselbe Fragment oder derselbe Wurzelbeleg mehrfach. Nicht angebunden (benannt): der Ausloeser D des Regelzuflusses (wiederkehrender Konflikt mit derselben Aufloesung) - das Protokoll kennt die Aufloesung eines Konflikts nicht.
Reihenfolge und Embargo. Hoechstens ein CODE-Kandidat gleichzeitig (Bau bis Probation); waehrend der 24-h-Probation eines CODE-/CONFIG-Laufs deployt der Autopilot keine DATA-/RULE-Aenderung (sie verfaelschte die Messung des Watchers) - die Laeufe werden gebaut und bewertet, der Deploy wartet. Ein Rebase im 2./3. Versuch behaelt den Befund des vorherigen Fehlversuchs.
Auto-Truth (Aufnahme in die WAHRHEIT) bleibt aus: LENNY_ENABLE_AUTO_WIKI_OLLAMA_PROMOTION=0. Eine Aufnahme verlangte mindestens zwei unabhaengige Evidenzfamilien
(core/evidenzfamilie.py; Wikipedia und Wikidata zaehlen als EINE), Vorher/Nachher je Charge, einen Aenderungssatz mit exaktem Rueckweg und eine Wirkungsbeobachtung mit selbsttaetigem
Rueckweg (core/wahrheitspromotion.py). Im Bestand gibt es nur die Familie wikimedia - die Aktivierung ist SAFE-CLOSED (auto_truth_nachweis --status).
Belegter Lauf (E1, 05.10.2026). Der erste vom Planer-Job ohne Sitzung gebaute CODE-Lauf war Problem A (SIR-20261002T214311Z-0001): Durchgang 05:41:47-06:23:21 UTC (2.494 s, Exitcode 0) - Bau mit claude -p (32 s, 0,10 USD, 0 Verstoesse), Evaluator APPROVE (14 von 14 Gates, Zielfix FAIL -> PASS, 20 min), Deploy-Schranke und Deploy (19 min), probation ab 06:23:18 UTC.
Beleg: python -m selfimprove.e1_beleg <run_id> (elf Bedingungen, alle erfuellt), Nachweis docs/produktionsautonomie/nachweise/e1_*.json. Im Betriebsprotokoll sieht ein CODE-Durchgang so aus: ein langer start/ende-Block (Bewertung und Deploy laufen im Durchgang) mit aktionen: ["0001:queued->probation"]; waehrenddessen startet der
Task Scheduler keine weiteren Takte (IgnoreNew), danach folgen die kurzen Durchgaenge (10-20 s), die eine Probation nur beobachten. Der Kandidaten-Branch si/CH-* ist nach dem Deploy in selbstverbesserung zusammenzufuehren, sonst dreht ein spaeterer manueller Deploy den Fix zurueck.