LM-Studio-Matrix mit gemma-4-e4b: zwoelf Laeufe und vier Befunde

Skill 12.0.0 bis 12.2.0 und Adapter 2.0.0 bis 2.2.0.

Werkzeugfreigabe: Die Shell-Rechte des OpenCode-Adapters sind jetzt eine
Denylist wie beim Claude-Adapter statt einer Allowlist. Ausloeser war der
erste Qwen-Lauf, dessen einzige beide Werkzeugaufrufe an einer Pipeline
scheiterten. Kontrolltest belegt beide Richtungen: Get-ChildItem | Format-Table
laeuft durch, rm wird verweigert, die Datei bleibt bestehen.

Lokaler Betrieb: Der Preflight entlaedt alle Modelle vor jedem Lauf und laedt
den Kontext auf das Modellmaximum. Gemessen waren zuvor beide Modelle
gleichzeitig geladen - 168 MiB frei von 16,3 GB. Qwen 27B passt auf dieser
Karte nicht und wurde durch qwen3.5-9b ersetzt, in Q4_K_M wie Gemma.

Messinstrument: analyse-anforderungen.py erkennt Feldnamen in Markdown-
Fettschrift und Modulpraefixe in IDs. Der erste lokale Lauf mit Artefakten
wurde sonst mit null Anforderungen gezaehlt statt mit neun. Regressionsprobe
an vier Claude-Laeufen unveraendert.

Befunde: Der Standard-Ausgabeblock, mit dem Claude sieben Artefakte erzeugt,
liefert bei gemma-4-e4b null von sechs Laeufen ein Ergebnis - das Modell loest
den Pfad relativ zum Arbeitsverzeichnis auf. Ein Lauf startete alle sieben
vorgesehenen Rollen und lieferte neun formkonforme Anforderungen. Ein anderer
erzeugte sieben richtig benannte Dateien ohne eine einzige formkonforme
Anforderung. Und eine Shell-Umleitung schrieb an der Denylist vorbei in den
eingefrorenen Snapshot - gefunden vom Vorher/Nachher-Vergleich, nicht von der
Regel.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Christoph Schwörer
2026-09-01 11:02:04 +02:00
co-authored by Claude Opus 5
parent 654339464e
commit 28e927013b
218 changed files with 20745 additions and 17 deletions
+140
View File
@@ -1210,6 +1210,146 @@ vollständig vorab spezifizieren.
---
### Der Ausgabepfad als Bruchstelle kleiner Modelle (01.09.2026)
Nach der Umstellung auf die Denylist und das Modellmaximum beim Kontext (Skill 12.0.0/12.1.0)
lief die Gemma-Matrix zweimal vollstaendig durch – sechs Laeufe ueber drei Agentenmodi, alle mit
**null Ergebnisdateien**. Anders als in Iteration 11 endeten sie diesmal jedoch **regulaer**
(Exitcode 0, kein Zeitlimit) nach 3 bis 14 Minuten.
Die Ursache liegt weder im Modell noch im Adapter, sondern an ihrer Schnittstelle. Der zweite
solo-Lauf (`v12.1.0-b99a`, 22 Turns, 476.051 Tokens) unternahm **acht Schreibversuche**, und
zwar mit genau den vom Prompt geforderten Dateinamen:
| Schreibziel des Modells | Ergebnis |
|---|---|
| `Ergebnisse/Analysebericht.md` | abgewiesen |
| `Ergebnisse/StRS.md` | abgewiesen |
| `Ergebnisse/SyRS.md` | abgewiesen |
| `Ergebnisse/SwRS.md` | abgewiesen |
| `Ergebnisse/Hypothesen.md` | abgewiesen |
| `Ergebnisse/Traceability.md` | abgewiesen |
| `C:\...\QuellCode\CentronERP\Ergebnisse\Analysebericht.md` | abgewiesen |
**Das Modell hat die Analyse also geleistet und die richtigen Artefakte benannt – es legt sie nur
konsequent am falschen Ort ab.** Es loest `Ergebnisse/` relativ zum Arbeitsverzeichnis auf,
statt den absoluten Laufpfad zu verwenden, den Block 2 des Prompts nennt. Der Snapshot-Schutz
wies jeden Versuch korrekt ab; haette er es nicht getan, waere die eingefrorene Codebasis
beschrieben worden.
Der Befund ist **reproduzierbar**: beide solo-Laufe zeigen dasselbe Muster, in den delegierenden
Modi endete der Hauptagent bereits vor dem ersten Schreibversuch.
**Warum das ein Befund ueber die Werkzeugkette ist, nicht ueber die Modellfaehigkeit.** Alle
Claude-Laeufe haben mit **demselben Wortlaut** von Block 2 sieben Artefakte erzeugt. Die
Anweisung ist also befolgbar; `gemma-4-e4b` befolgt sie nicht. Fuer den Aufbau bedeutet das: Eine
Ausgabeanweisung, die fuer ein starkes Modell eindeutig ist, ist es fuer ein kleines nicht – und
der Unterschied entscheidet ueber alles oder nichts, nicht ueber graduelle Qualitaet.
**Konsequenz fuer die Versuchsfuehrung.** Der Wortlaut von Block 2 wurde **nicht** geaendert; er
bleibt die Bedingung, unter der die Claude-Laeufe gemessen wurden. Stattdessen wurde eine zweite,
ausdruecklich gekennzeichnete Bedingung eroeffnet: Iteration 14 (V1) und 7 (V2) verwenden einen
Ausgabeblock, der relative Pfade ausdruecklich als unwirksam benennt und den absoluten Pfad
beispielhaft wiederholt. Beide Bedingungen stehen nebeneinander:
| Iteration | Ausgabeblock | Zweck |
|---|---|---|
| 13 / 6 | `standard` – Wortlaut der Claude-Laeufe | misst, ob das Modell die Anweisung befolgt |
| 14 / 7 | `explizit` – relative Pfade ausdruecklich ausgeschlossen | misst die Analyseleistung, wenn die Pfadhuerde entfaellt |
Sie sind **nicht poolbar**. Iteration 13/6 beantwortet die Frage nach der Befolgung, Iteration
14/7 die nach der inhaltlichen Leistung. Ohne die Trennung waere entweder der Befund verloren
oder die Messreihe leer.
---
### Eine Shell-Umleitung im eingefrorenen Snapshot (01.09.2026)
Beim Erstellen der Messprotokolle fiel auf, dass das Codebasis-Root nicht mehr sauber war:
`QuellCode/CentronERP/codebase_structure.txt`, 0 Byte, ungetrackt. Der Verursacher liess sich
eindeutig zuordnen – Lauf `Iteration 13/.../v12.1.0-0b15` fuehrte aus:
dir /s > codebase_structure.txt
`dir /s` ist ein reines Lesekommando und deshalb zulaessig. Die **Umleitung `>` ist kein
Kommando**, sondern Shell-Syntax, und wird von keiner kommandobasierten Regel erfasst – weder
von einer Denylist noch von einer Allowlist. Der Agent hat damit ohne Regelverstoss eine Datei
im eingefrorenen Untersuchungsgegenstand angelegt.
**Der Aufbau hat genau so funktioniert, wie er entworfen ist.** Der Skill haelt seit Version
2.0.0 fest, dass Mustervergleich auf Kommandozeilen nicht lueckenlos ist und die belastbare
Read-only-Garantie der Vorher/Nachher-Vergleich per `git status` bleibt. Dieser Vergleich hat
den Eingriff gefunden – nicht die Regel, die ihn haette verhindern sollen. Der Fall ist damit
die empirische Bestaetigung einer Annahme, die bis dahin nur eine Vorsichtsformulierung war.
**Was daraus folgt.** Die Denylist ist eine Risikominderung, kein Schutzmechanismus. Wer aus
diesen Versuchen ableitet, ein Agent habe die Codebasis nicht veraendert, muss sich auf den
Git-Vergleich stuetzen und nicht auf die Werkzeugkonfiguration. Fuer kuenftige Adapter waere
eine echte Absicherung nur ausserhalb der Kommandoebene zu haben – etwa ein schreibgeschuetztes
Dateisystem oder eine Arbeitskopie wie beim Codex-Adapter.
**Behandlung.** Die Streudatei wurde entfernt und der Snapshot damit in den eingefrorenen Zustand
zurueckversetzt; der Commit blieb unberuehrt. Alle Laeufe, die nach `v12.1.0-0b15` starteten,
tragen die Datei in ihrer `before.txt` und weisen deshalb *vor dem Lauf dirty: ja* aus – das ist
korrekt und kein Fehler dieser Laeufe. Ihr eigener Vorher/Nachher-Vergleich bleibt aussagekraeftig,
weil er Anfangs- und Endzustand desselben Laufs vergleicht.
---
### Ergebnis der LM-Studio-Matrix mit `gemma-4-e4b` (01.09.2026)
Zwoelf Laeufe: zwei Ausgabeblock-Bedingungen x drei Agentenmodi x zwei Wiederholungen, alle unter
Skill 12.1.0/12.2.0, Denylist, 131.072 Kontexttokens, Q4_K_M, alleiniges Modell auf der GPU.
| Block | Modus | Min | Turns | Tools | Subagenten | Dateien | Anforderungen | Tokens |
|---|---|---:|---:|---:|---:|---:|---:|---:|
| standard | solo | 3,3 | 12 | 15 | 0 | 0 | 0 | 179.601 |
| standard | solo | 10,7 | 22 | 21 | 0 | 0 | 0 | 476.051 |
| standard | builtin | 5,8 | 3 | 2 | 1 | 0 | 0 | 37.658 |
| standard | builtin | 13,5 | 4 | 3 | 2 | 0 | 0 | 88.905 |
| standard | custom | 4,4 | 4 | 3 | 3 | 0 | 0 | 66.585 |
| standard | custom | 6,5 | 6 | 6 | 2 | 0 | 0 | 100.908 |
| explizit | solo | 1,5 | 4 | 3 | 0 | 0 | 0 | 55.152 |
| explizit | solo | 8,8 | 14 | 17 | 0 | 0 | 0 | 285.072 |
| explizit | builtin | 6,7 | 3 | 2 | 2 | **7** | 0 | 42.110 |
| explizit | builtin | 11,8 | 3 | 2 | 2 | 0 | 0 | 54.687 |
| explizit | custom | 2,4 | 2 | 1 | 1 | 0 | 0 | 29.656 |
| explizit | custom | **15,1** | 7 | 14 | **7** | **4** | **9** | 171.502 |
**Der Ausgabeblock entscheidet ueber alles oder nichts.** Unter dem Standardwortlaut – demselben,
mit dem alle Claude-Laeufe sieben Artefakte erzeugten – lieferten **null von sechs** Laeufen eine
Datei. Mit dem expliziten Block waren es zwei von sechs. Die Huerde ist nicht die Analyse, sondern
die Pfadaufloesung.
**Die Streuung dominiert den Modus.** Innerhalb derselben Zelle schwanken die Laeufe um Faktor 5
bis 10 in Turns und Tokens, und dieselbe Bedingung liefert einmal sieben Dateien und einmal keine.
Ein Moduseffekt ist bei zwei Wiederholungen je Zelle **nicht** nachweisbar; die beiden erfolgreichen
Laeufe verteilen sich auf verschiedene Modi (`builtin` und `custom`). Mit n = 2 je Zelle ist das
erwartbar und kein Widerspruch zu den Cloud-Befunden, sondern eine Aussage ueber die noetige
Stichprobengroesse bei kleinen lokalen Modellen.
**Ein Lauf zeigt, dass die Rollenbindung technisch traegt.** Der custom-Lauf `v12.1.0-001c` startete
**sieben Subagenten, alle sieben kamen zurueck**, und zwar genau die vorgesehenen Rollen:
`modulinventar`, `faktenermittler`, `strs-autor`, `syrs-autor`, `swrs-autor`, `belegpruefer`,
`konsistenzpruefer`. Er erzeugte vier Dateien mit **neun formkonformen Anforderungen** ueber alle
drei Ebenen (2 StRS, 4 SyRS, 3 SwRS), mit Belegen, Pruefideen, Tracelinks und
Uebernahmewuerdigkeit. Das ist der erste lokale Messpunkt der Reihe mit inhaltlichem Ertrag.
**Dateien sind nicht gleich Anforderungen.** Der builtin-Lauf `v12.1.0-e383` erzeugte **sieben**
Dateien mit den richtigen Namen – `StRS.md`, `SyRS.md`, `SwRS.md`, `Traceability.md`,
`Hypothesen.md`, `Glossar.md`, `Analysebericht.md` – aber **null** formkonforme Anforderungen: Er
erfand ein eigenes, dreifeldriges Format (`Anforderung ID`, `Beschreibung`, `Quelle`) statt der rund
fuenfzehn vom Prompt vorgeschriebenen Felder. Bei 1,5 bis 2,6 kB je Datei entsteht so ein
vollstaendig aussehender Lieferumfang ohne verwertbaren Inhalt. **Die Zahl der Artefakte ist als
Ertragsmass damit ebenso untauglich wie die Anforderungsanzahl** (Befund 6.1) – erst die
Formatpruefung trennt Schein von Ertrag.
**Einordnung.** Alle zwoelf Laeufe sind mit den Claude- und TensorX-Laeufen nicht poolbar: anderes
Werkzeug, quantisierte Gewichte, nicht steuerbarer Effort, andere Toolfreigabe. Sie sind als
eigenstaendige Aussage ueber lokal betriebene kleine Modelle zu lesen, nicht als Modellvergleich.
---
## 6. Befunde
### 6.1 Die Anforderungsanzahl ist kein Qualitätsmaß