Iteration 3: Modell- und Modusraster erweitert, Skill 7.0.0, V2/V3 vorbereitet
Neue gueltige Zellen in Iteration 3 - claude-opus-5/solo/high: 363 Anforderungen, 99,7 % mit Primaerbeleg, Belege je Anforderung Median 2,0, 38,1 Mio. Tokens - claude-fable-5/solo/high: 241 Anforderungen, 98,3 % mit Primaerbeleg, 89,0 % PRIMAER-Anteil, vollstaendig regelkonform, 30,6 Mio. Tokens Damit sind 6 von 12 Zellen des Rasters belegt. Zwei Befunde daraus: Die Belegdichte folgt dem Modell, nicht dem Effort. Opus erreicht Median 2,0 auch auf high; alle 44 Sonnet-Laeufe lagen bei 1,0. max hebt Opus auf 3,0. Die frueher dem Effort zugeschriebene Verdopplung ist damit eingegrenzt. Die Fable-Modellverletzung ist reproduziert und abgegrenzt. Bei builtin laufen die Subagenten auf claude-opus-5[1m] statt Fable (zweiter Fall nach Iteration 1), bei solo dagegen sauber. Nicht das Modell ist die Ursache, sondern Fable in Kombination mit Delegation. Fehlmessungen, vollstaendig protokolliert - vier 429-Abbrueche (Session-Kontingent) aus dem Parallelblock 19:59; drei davon mit Teilbestand, einer ohne Ergebnis - opus-5/builtin/high zum dritten Mal gescheitert: 790,7 Mio. Tokens ueber drei Anlaeufe ohne Artefakt. Zelle mit dieser Prompt-Version nicht messbar. Skill 7.0.0 (MAJOR) - Isolationsmechanismus modusabhaengig: --safe-mode schaltet MCP-Server und Custom-Agenten ab und ist mit V2/V3 unvereinbar. Smoke-Test verifiziert: mit Flag spawned=0, ohne Flag spawned=2. Ersatz fuer custom/MCP: --strict-mcp-config plus --disallowedTools Skill WebSearch WebFetch SlashCommand. - 6.1.0: Pflichtpruefung leeres Ergebnisverzeichnis = Fehlmessung unabhaengig von is_error; CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS=0; Protokollfeld Gueltigkeit - extract-subagenten.py: Start-Quittung wird nicht mehr als Ertragsmass ausgewiesen Versuch 2 und 3 vorbereitet - Prompt-Kette V1 -> V2 (02-A, angepasst an Agentendateien) -> V3 (02-B, MCP) - V2: acht Rollen inkl. nicht delegierendem ISO-29148-Orchestrator - V3: elf Rollen, fuenf Werkzeugserver, neue Belegklasse LAUFZEIT Ablaufprotokoll um Phase 6 und 7 sowie die Vorbereitung von V2/V3 ergaenzt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
affde3a45f
commit
3d5b691bfa
@@ -2,7 +2,7 @@
|
||||
name: run-experiment
|
||||
description: Führt einen Versuchs-Prompt aus einer Prompt-Datei als messbaren Headless-Lauf mit Claude Code oder Codex CLI aus und schreibt ein Messprotokoll mit Start-/Endzeit, Modell, Tokenverbrauch und weiteren Metriken. Verwenden bei "/run-experiment <Pfad-zur-Prompt-Datei>" oder wenn der User einen Versuch/ein Experiment ausführen und tracken will.
|
||||
argument-hint: <Pfad zur Prompt-Datei> <Root-Verzeichnis>
|
||||
version: 5.0.0
|
||||
version: 7.0.0
|
||||
---
|
||||
|
||||
# RunExperiment – Versuchslauf mit Messprotokoll
|
||||
@@ -16,8 +16,9 @@ schreibst du ein Messprotokoll neben die Prompt-Datei.
|
||||
|
||||
- **Prompt** (Pflicht): Pfad zur Prompt-Datei (Markdown). Erstes Argument in `$ARGUMENTS`.
|
||||
- **Root** (Pflicht): Verzeichnis, das als Root des Versuchslaufs dient. Zweites Argument.
|
||||
Der Headless-Lauf wird mit diesem Verzeichnis als Arbeitsverzeichnis gestartet – es ist
|
||||
die Wurzel der zu analysierenden Codebasis und wird nur GELESEN. Fehlt das Argument: den
|
||||
Es ist die Wurzel der zu analysierenden Codebasis und wird nur GELESEN. Der Codex-Adapter
|
||||
erstellt daraus ein isoliertes temporäres Arbeitsabbild; andere Adapter starten
|
||||
unmittelbar mit diesem Root als Arbeitsverzeichnis. Fehlt das Argument: den
|
||||
User danach fragen und NICHT stillschweigend das aktuelle Verzeichnis verwenden. Vor dem
|
||||
Lauf prüfen, dass das Verzeichnis existiert; sonst abbrechen und den User informieren.
|
||||
- **Modell** (Pflicht, **kein Default**): Wird **vor jedem Lauf beim User erfragt** – siehe
|
||||
@@ -216,7 +217,7 @@ per stdin übergebenen Text angehängt (siehe Schritt „Prompt zusammenstellen"
|
||||
unangetastet und die Agentenkonfiguration ist eine dokumentierte, versionierte
|
||||
Versuchsbedingung. Format siehe `claude --help` zu `--agents`.
|
||||
|
||||
**Codex-Adapter in Version 5.0.0:** ausschließlich `solo` ist freigegeben und wird doppelt
|
||||
**Codex-Adapter ab Version 5.0.0:** ausschließlich `solo` ist freigegeben und wird doppelt
|
||||
mit `--disable multi_agent` sowie `-c agents.enabled=false` erzwungen. Bei `builtin` oder
|
||||
`custom` abbrechen und mitteilen, dass dieser Adaptermodus noch nicht verifiziert ist. Eine
|
||||
stillschweigende Annäherung an Claude-Agentendefinitionen wäre keine reproduzierbare Bedingung.
|
||||
@@ -255,7 +256,7 @@ per stdin übergebenen Text angehängt (siehe Schritt „Prompt zusammenstellen"
|
||||
Sort-Object { [int]($_.Name -replace '\D','') }
|
||||
$iteration = if ($iterationen) { $iterationen[-1].Name } else { 'Iteration 1' }
|
||||
$zelle = Join-Path (Join-Path (Join-Path $iteration $modell) $modus) $effort
|
||||
$skillVer = 'v5.0.0' # entspricht version: im Frontmatter dieses Skills
|
||||
$skillVer = 'v7.0.0' # entspricht version: im Frontmatter dieses Skills
|
||||
do {
|
||||
$id4 = '{0:x4}' -f (Get-Random -Maximum 65536)
|
||||
$lauf = Join-Path "<promptverzeichnis>\$zelle" "<NN>_Lauf_$(Get-Date -Format 'yyyy-MM-dd_HHmmss')_${skillVer}-$id4"
|
||||
@@ -347,15 +348,16 @@ Schreibe ALLE zu erzeugenden Ergebnisdateien in das Verzeichnis
|
||||
Verändere keine Dateien im Arbeitsverzeichnis (der analysierten Codebasis).
|
||||
```
|
||||
|
||||
**Codex-Abweichung bei Block 2.** Der Codex-Adapter läuft mit einem technisch erzwungenen
|
||||
`read-only`-Sandboxmodus. Er kann deshalb auch das externe Laufverzeichnis nicht direkt als
|
||||
Agent beschreiben. Block 2 wird dort durch folgende strukturierte Rückgabeanweisung ersetzt;
|
||||
**Codex-Abweichung bei Block 2.** Der Codex-Adapter läuft in einer isolierten Arbeitskopie
|
||||
im System-Temp-Verzeichnis mit `workspace-write`. Das originale Root liegt außerhalb dieses
|
||||
Arbeitsbereichs und kann vom Agenten nicht erreicht werden. Trotz des technisch beschreibbaren
|
||||
Abbilds darf der Agent keine Dateien verändern. Block 2 wird dort durch folgende strukturierte Rückgabeanweisung ersetzt;
|
||||
die CLI erzwingt `codex-output-schema.json`, anschließend materialisiert
|
||||
`normalise-codex-result.py` die Dateien:
|
||||
|
||||
```
|
||||
### Ergebnisausgabe (überschreibt anderslautende Pfadangaben oben)
|
||||
Verändere keine Dateien. Gib alle geforderten Ergebnisdateien im vorgegebenen JSON-Schema zurück.
|
||||
Verändere keine Dateien im Arbeitsverzeichnis. Gib alle geforderten Ergebnisdateien im vorgegebenen JSON-Schema zurück.
|
||||
Jeder Eintrag in `files` enthält unter `path` einen relativen Pfad innerhalb von `Ergebnisse`
|
||||
und unter `content` den vollständigen Dateiinhalt. `summary` enthält nur eine kurze Laufzusammenfassung.
|
||||
```
|
||||
@@ -376,6 +378,9 @@ $lauf = "<absoluter Pfad zum Laufverzeichnis>"
|
||||
$prompt = (Get-Content "<prompt-datei>" -Raw) + "`n`n<Ausgabe-Anweisung>"
|
||||
# Steuerdateien IMMER ins Laufverzeichnis - nie in den gemeinsamen Scratchpad (parallelfaehig)
|
||||
Set-Content -Path "$lauf\_meta\combined_prompt.md" -Value $prompt -Encoding utf8
|
||||
# Ohne diese Variable bricht der Headless-Modus nach 600 s ab, sobald noch
|
||||
# Hintergrund-Subagenten laufen - und meldet dabei `is_error: false`.
|
||||
$env:CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS = '0'
|
||||
Set-Content -Path "$lauf\_meta\startzeit.txt" -Value (Get-Date -Format o)
|
||||
|
||||
# Schreibende und bauende Shell-Kommandos sperren – die Codebasis wird nur gelesen.
|
||||
@@ -414,7 +419,7 @@ Bedeutung der Flags:
|
||||
|
||||
| Flag | Zweck |
|
||||
|---|---|
|
||||
| `--safe-mode` | Isolation: CLAUDE.md, Skills, Plugins, Hooks, MCP-Server, Custom-Agenten, Commands und Output-Styles aus – ohne Dateieingriff. Auth, Modellwahl, eingebaute Tools und Permissions bleiben normal aktiv. |
|
||||
| `--safe-mode` | Isolation: CLAUDE.md, Skills, Plugins, Hooks, MCP-Server, Custom-Agenten, Commands und Output-Styles aus – ohne Dateieingriff. Auth, Modellwahl, eingebaute Tools und Permissions bleiben normal aktiv. **Nur in den Modi `solo` und `builtin` verwendbar** – siehe „Isolation je Agentenmodus". |
|
||||
| `--strict-mcp-config` | zweite Absicherung gegen MCP-Server aus Projekt- oder User-Konfiguration |
|
||||
| `--permission-mode acceptEdits` | Schreibrechte für die Ergebnisdateien im Laufverzeichnis |
|
||||
| `--allowedTools "Bash" "PowerShell"` | **Shell-Zugriff ohne Rückfrage** – Standard seit Prompt-Version 02 |
|
||||
@@ -434,6 +439,55 @@ Die belastbare Read-only-Garantie bleibt der Vorher/Nachher-Vergleich per
|
||||
`git status --porcelain` aus Abschnitt 1 bzw. 3. Die Denylist senkt das Risiko, sie ersetzt die
|
||||
Verifikation nicht.
|
||||
|
||||
**Isolation je Agentenmodus – `--safe-mode` ist nicht immer verwendbar.**
|
||||
|
||||
`--safe-mode` schaltet ausweislich der CLI-Hilfe „all customizations (CLAUDE.md, skills, plugins,
|
||||
hooks, **MCP servers, custom commands and agents**, output styles, workflows, …)" ab. Damit
|
||||
deaktiviert es genau das, was die Modi `custom` (V2) und der MCP-Einsatz (V3) untersuchen sollen.
|
||||
|
||||
Verifiziert am 2026-08-26 gegen CLI 2.1.246 mit identischem Aufruf, nur `--safe-mode` variiert:
|
||||
|
||||
| Konfiguration | `subagent_stats.spawned` | `by_type` |
|
||||
|---|---:|---|
|
||||
| mit `--safe-mode` | **0** | leer – der Agent meldet, die Rollen seien „nicht in der Agent-Registry registriert" |
|
||||
| ohne `--safe-mode` | **2** | `{"modulinventar": 1, "konsistenzpruefer": 1}` |
|
||||
|
||||
Daraus folgt eine modusabhängige Isolation:
|
||||
|
||||
| Modus | Isolation |
|
||||
|---|---|
|
||||
| `solo`, `builtin` | `--safe-mode` + `--strict-mcp-config` (unverändert) |
|
||||
| `custom`, sowie jeder Lauf mit `--mcp-config` | **kein** `--safe-mode`; stattdessen `--strict-mcp-config` und die Sperre `--disallowedTools Skill WebSearch WebFetch SlashCommand` |
|
||||
|
||||
Der gezielte Ersatz wurde am selben Tag gegengeprüft. Der Agent antwortete auf eine
|
||||
Werkzeugabfrage: `VORGELADEN: NICHTS VORGELADEN` · `SKILLS: KEINE` · `WEB: KEIN WEBZUGRIFF` ·
|
||||
alle acht Custom-Rollen verfügbar. Ohne die Sperre lädt die CLI **16 global installierte Skills**
|
||||
(darunter `code-review`, `security-review`, `run`, `init`); `--setting-sources ''` unterdrückt sie
|
||||
**nicht**.
|
||||
|
||||
**Was der Ersatz nicht abdeckt.** `--safe-mode` deaktiviert zusätzlich Plugins, Hooks und
|
||||
Output-Styles. Die Sperre tut das nicht. Auf der Maschine, auf der die Versuchsreihe läuft, sind
|
||||
davon keine konfiguriert (`~/.claude/settings.json` enthält nur `model` und
|
||||
`agentPushNotifEnabled`, kein `hooks`; kein `plugins`- und kein `output-styles`-Verzeichnis) –
|
||||
das ist jedoch eine Eigenschaft der Umgebung, keine Garantie. **Vor jedem Lauf im Modus `custom`
|
||||
oder mit MCP ist deshalb zu prüfen:**
|
||||
|
||||
```powershell
|
||||
$us = Join-Path $env:USERPROFILE '.claude\settings.json'
|
||||
if (Test-Path $us) { (Get-Content $us -Raw | ConvertFrom-Json).PSObject.Properties.Name }
|
||||
foreach ($d in 'plugins','output-styles','skills') {
|
||||
$pfad = Join-Path $env:USERPROFILE ".claude\$d"
|
||||
if (Test-Path $pfad) { "VORHANDEN: $d -> " + ((Get-ChildItem $pfad | Measure-Object).Count) + ' Eintraege' }
|
||||
}
|
||||
```
|
||||
|
||||
Treten Hooks, Plugins oder Output-Styles auf, ist der Lauf **nicht** isoliert und die Bedingung
|
||||
im Protokoll als abweichend zu kennzeichnen.
|
||||
|
||||
**Unverändert bleibt:** `--safe-mode` hat die Modellwahl nie beeinflusst. Der Eintrag `model` in
|
||||
den User-Settings (hier `opus[1m]`) kann Subagenten binden – das ist der bekannte Grund der zwei
|
||||
dokumentierten Modellabweichungen und gilt mit wie ohne `--safe-mode`.
|
||||
|
||||
**`--safe-mode` bleibt als zweite Sicherung aktiv.** Die primäre Isolation leistet der
|
||||
bereinigte Snapshot (Abschnitt 1); `--safe-mode` fängt zusätzlich alles ab, was von außerhalb
|
||||
des Roots wirken könnte – User-Level-Settings, global installierte Skills, Plugins, Hooks.
|
||||
@@ -542,6 +596,32 @@ Subagenten gibt.
|
||||
Bei Modus `builtin` oder `custom` daher **nie** den Flag-Wert allein ins Protokoll schreiben,
|
||||
sondern die Modelle aus `modelUsage` mit ihrem jeweiligen Anteil ausweisen.
|
||||
|
||||
**Pflichtprüfung: Hat der Lauf überhaupt etwas erzeugt?** `is_error` allein genügt **nicht**.
|
||||
Ein Lauf kann `is_error: false`, `subtype: success` und `terminal_reason: completed` melden und
|
||||
trotzdem **null Ergebnisdateien** hinterlassen. Belegt am 2026-08-26, Lauf
|
||||
`Iteration 3/claude-opus-5/builtin/high/…160037_v4.5.0-116d`: Der Hauptagent startete zehn
|
||||
Subagenten im Hintergrund, beendete seinen Turn und schrieb als Abschlusstext „Die Erhebung
|
||||
läuft"; der Headless-Modus wartete 600 s und brach dann ab. `Stderr.log` enthielt
|
||||
„Background tasks still running after 600s; terminating." Verbraucht waren zu diesem Zeitpunkt
|
||||
**193,4 Mio. Tokens** – der teuerste Lauf der Reihe, ohne ein einziges Artefakt.
|
||||
|
||||
Nach jedem Lauf daher zwingend prüfen:
|
||||
|
||||
1. `Ergebnisse\` ist **nicht leer** und enthält die vom Prompt geforderten Dateien. Fehlen sie,
|
||||
ist der Lauf **unabhängig von `is_error` als Fehlmessung zu kennzeichnen**.
|
||||
2. `Stderr.log` enthält keine Abbruchmeldung. Die Datei ist im Normalfall 0 Byte groß.
|
||||
|
||||
Vorbeugend setzt der Ausführungsabschnitt `CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS=0`, damit der
|
||||
Lauf auf seine Hintergrund-Subagenten wartet, statt sie abzuschneiden.
|
||||
|
||||
**Subagenten-Ergebnisse kommen nicht als Werkzeugergebnis zurück.** Startet der Hauptagent einen
|
||||
Subagenten im Hintergrund, liefert der Werkzeugaufruf sofort eine **Start-Quittung** von rund
|
||||
1.093 Zeichen („Async agent launched successfully …") zurück, nicht die Befunde. Deren Länge ist
|
||||
folglich **kein** Maß für den Ertrag des Subagenten. Die Quittung nennt einen Pfad
|
||||
`<temp>\<session>\tasks\<agentId>.output`; diese Dateien werden zwar angelegt, bleiben aber
|
||||
**leer** (geprüft an 33 Dateien aus zwei Läufen). Die Aussage, dass Subagenten-Transkripte nicht
|
||||
auswertbar persistiert werden, gilt damit unverändert.
|
||||
|
||||
`permission_denials` ist eine **reguläre Messgröße** und immer auszuweisen, auch bei 0. Ein
|
||||
hoher Wert bedeutet, dass die Werkzeugkonfiguration den Lauf eingeschränkt hat, und ist bei der
|
||||
Interpretation der Ergebnisqualität zu berücksichtigen.
|
||||
@@ -683,7 +763,11 @@ Vorlage:
|
||||
- **Permission-/Sandbox-Modus:** <acceptEdits | read-only / approval never | ...>
|
||||
- **Toolfreigabe:** <adapterabhängige Flags wörtlich>
|
||||
- **Isolationsmechanismus:** <adapterabhängige Flags wörtlich>
|
||||
- **MCP-Server / Agentendateien:** <keine – aus dem Snapshot entfernt, zusätzlich --safe-mode | Liste>
|
||||
- **MCP-Server / Agentendateien:** <keine – aus dem Snapshot entfernt, zusätzlich --safe-mode |
|
||||
Liste der Server mit Pfad und SHA-256 der `--mcp-config`-Datei; Pfad und SHA-256 der
|
||||
`--agents`-Datei>
|
||||
- **Umgebungsprüfung (nur `custom` / MCP):** <keine Hooks, Plugins, Output-Styles im
|
||||
User-Profil vorgefunden | **abweichend**: welche>
|
||||
- **Subagenten:** <Anzahl und Typ aus `subagent_stats`, z. B. 8 × Explore, 0 fehlgeschlagen>
|
||||
- **Verschachtelung:** `spawned` = <N>, davon `spawned_by_subagents` = <M>, `max_depth` = <D>.
|
||||
Bei `max_depth` > 1 ausdrücklich vermerken – die Tokens der tieferen Ebenen sind in
|
||||
@@ -742,6 +826,8 @@ Status, Regelkonformität>
|
||||
- **Kontrolle Agentenmodus:** `subagent_stats.spawned` = <Zahl> (bei `solo` muss 0 stehen,
|
||||
sonst Fehlmessung)
|
||||
- **Subagenten-Prompts:** <`_meta\subagenten.md`, N Aufrufe erfasst | entfällt (Modus solo)>
|
||||
- **Gültigkeit:** <gültig | **Fehlmessung**: Ergebnisverzeichnis leer / Abbruchmeldung in
|
||||
Stderr.log – Wortlaut zitieren>
|
||||
- **Erzeugte Dateien:** <Liste aus Ergebnisse\>
|
||||
- **Root unverändert:** <ja | nein: welche Abweichungen>
|
||||
- **Abschlusstext des Agenten:** siehe RawResult.json (`result`)
|
||||
@@ -789,28 +875,47 @@ OpenAI-Modell-IDs entworfen. Referenzstand bei Einführung: **Codex CLI 0.149.0-
|
||||
Vor jedem Lauf `codex --version` protokollieren; bei geändertem JSONL-Schema den Normalisierer
|
||||
zuerst mit einem kleinen, ausdrücklich freigegebenen Smoke-Test prüfen.
|
||||
|
||||
**Unterstützter Agentenmodus:** In Version 5.0.0 nur `solo`. `builtin` und `custom` müssen
|
||||
**Unterstützter Agentenmodus:** Auch in Version 6.0.0 nur `solo`. `builtin` und `custom` müssen
|
||||
abbrechen. `solo` wird mit zwei unabhängigen Einstellungen erzwungen:
|
||||
`--disable multi_agent` und `-c agents.enabled=false`.
|
||||
|
||||
**Isolation und Ausgabe.** Codex arbeitet im Root mit `--sandbox read-only`. Anders als beim
|
||||
Claude-Adapter erhält der Agent deshalb kein beschreibbares Zusatzverzeichnis. Er liefert ein
|
||||
Schemaobjekt mit vollständigen Dateiinhalten; `--output-last-message` schreibt dieses durch die
|
||||
CLI nach `_meta\final_response.json`. Erst nach Ende des Agenten materialisiert das lokale,
|
||||
deterministische Skript die validierten relativen Pfade unter `Ergebnisse\`. Absolute Pfade,
|
||||
`..`, Laufwerkspräfixe und case-insensitive Duplikate werden abgelehnt.
|
||||
**Isolation und Ausgabe.** Unter Windows blockierte `--sandbox read-only` mit Codex CLI
|
||||
0.149.0-alpha.4.3 bereits den Start rein lesender Prozesse (`pwsh`, `cmd`, `rg`). Der Adapter
|
||||
erstellt deshalb vor dem Lauf eine isolierte Kopie der versionierten und nicht ignorierten
|
||||
Quelldateien im System-Temp-Verzeichnis und startet Codex dort mit `--sandbox workspace-write`.
|
||||
Das originale Root liegt außerhalb des Codex-Arbeitsbereichs und bleibt technisch getrennt.
|
||||
`prepare-codex-workspace.py` hasht die Kopie vor und nach dem Lauf; jede Änderung macht den Lauf
|
||||
ungültig. Quelle, Dateizahl, Größe und beide Manifeste werden unter `_meta` archiviert; die
|
||||
temporäre Kopie wird erst nach der Integritätsprüfung entfernt. Die Ablage außerhalb des
|
||||
IDE-Projektbaums verhindert automatische Design-Time-Restores, die sonst ungefragt `obj`-Dateien
|
||||
in der Kopie erzeugen.
|
||||
|
||||
Der Agent liefert weiterhin ausschließlich ein Schemaobjekt mit vollständigen Dateiinhalten;
|
||||
`--output-last-message` schreibt dieses durch die CLI nach `_meta\final_response.json`. Erst nach
|
||||
Ende des Agenten materialisiert das lokale, deterministische Skript die validierten relativen
|
||||
Pfade unter `Ergebnisse\`. Absolute Pfade, `..`, Laufwerkspräfixe und case-insensitive Duplikate
|
||||
werden abgelehnt.
|
||||
|
||||
Vor dem Start `$codex`, `$skillDir`, `$lauf`, `$root`, `$modell` und `$effort` auf absolute
|
||||
Pfade beziehungsweise die bestätigten Versuchsbedingungen setzen. Den Prompt mit dem
|
||||
Codex-Ausgabeblock aus Abschnitt 2 nach `_meta\combined_prompt.md` schreiben. Der eigentliche
|
||||
Aufruf lautet:
|
||||
Codex-Ausgabeblock aus Abschnitt 2 nach `_meta\combined_prompt.md` schreiben. Anschließend das
|
||||
isolierte Abbild anlegen; bei einem Fehler darf der API-Lauf nicht starten:
|
||||
|
||||
```powershell
|
||||
$meta = Join-Path $lauf '_meta'
|
||||
$workspace = Join-Path ([IO.Path]::GetTempPath()) "codex-experiment-<Laufverzeichnis-ID>"
|
||||
python (Join-Path $skillDir 'prepare-codex-workspace.py') create $root $workspace $meta
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Codex-Arbeitsabbild konnte nicht erstellt werden.' }
|
||||
```
|
||||
|
||||
Der eigentliche Aufruf lautet:
|
||||
|
||||
```powershell
|
||||
$codexArgs = @(
|
||||
'--model', $modell,
|
||||
'-c', "model_reasoning_effort=`"$effort`"",
|
||||
'-c', 'service_tier="default"',
|
||||
'--sandbox', 'read-only',
|
||||
'--sandbox', 'workspace-write',
|
||||
'--ask-for-approval', 'never',
|
||||
'--disable', 'multi_agent',
|
||||
'-c', 'agents.enabled=false',
|
||||
@@ -818,7 +923,7 @@ $codexArgs = @(
|
||||
'--disable', 'apps',
|
||||
'--disable', 'hooks',
|
||||
'--disable', 'skill_search',
|
||||
'--cd', $root,
|
||||
'--cd', $workspace,
|
||||
'exec',
|
||||
'--ignore-user-config',
|
||||
'--ignore-rules',
|
||||
@@ -837,14 +942,20 @@ $codexExit = $LASTEXITCODE
|
||||
Set-Content -Path "$lauf\_meta\exitcode.txt" -Value $codexExit
|
||||
Set-Content -Path "$lauf\_meta\endzeit.txt" -Value (Get-Date -Format o)
|
||||
|
||||
python (Join-Path $skillDir 'prepare-codex-workspace.py') verify $workspace $meta
|
||||
$workspaceExit = $LASTEXITCODE
|
||||
|
||||
python (Join-Path $skillDir 'normalise-codex-result.py') $lauf `
|
||||
--model $modell --effort $effort
|
||||
|
||||
python (Join-Path $skillDir 'prepare-codex-workspace.py') cleanup $workspace $meta
|
||||
```
|
||||
|
||||
Auch dieser Aufruf ist als Background-Task zu starten. Das Erscheinen von `RawEvents.jsonl`
|
||||
allein bedeutet noch nicht, dass der Lauf fertig ist; Ende ist der abgeschlossene Prozess plus
|
||||
erzeugte `RawResult.json`. Schlägt die Normalisierung fehl, Rohdateien unverändert lassen und
|
||||
den Lauf als Fehler protokollieren.
|
||||
Integritätsprüfung und erzeugte `RawResult.json`. Ist `$workspaceExit` ungleich null, den Lauf
|
||||
wegen einer veränderten Arbeitskopie als ungültig kennzeichnen. Schlägt die Normalisierung fehl,
|
||||
Rohdateien unverändert lassen und den Lauf als Fehler protokollieren.
|
||||
|
||||
**Warum diese Flags:**
|
||||
|
||||
@@ -853,13 +964,13 @@ den Lauf als Fehler protokollieren.
|
||||
| `--model <id>` | vollständige, vom User bestätigte OpenAI-Modell-ID |
|
||||
| `model_reasoning_effort` | expliziter Denkaufwand |
|
||||
| `service_tier="default"` | verhindert eine geerbte Fast-/Priority-Bedingung |
|
||||
| `--sandbox read-only` | technische Schreibsperre für den Codebasis-Snapshot |
|
||||
| `--sandbox workspace-write` | erlaubt Windows-Prozessstarts nur innerhalb der isolierten Arbeitskopie |
|
||||
| `--ask-for-approval never` | keine interaktiven Unterbrechungen im Headless-Lauf |
|
||||
| `--ignore-user-config`, `--ignore-rules` | keine User-Konfiguration und keine Exec-Regeln |
|
||||
| `--disable plugins/apps/hooks/skill_search` | keine externen oder benutzerspezifischen Erweiterungen |
|
||||
| `--disable multi_agent`, `agents.enabled=false` | keine Subagenten im Modus `solo` |
|
||||
| `--json` | vollständiger maschinenlesbarer Ereignisstrom |
|
||||
| `--output-schema`, `--output-last-message` | validierbare Ergebnisdateien ohne Schreibrecht des Agenten |
|
||||
| `--output-schema`, `--output-last-message` | validierbare Ergebnisdateien außerhalb des Arbeitsabbilds |
|
||||
|
||||
`--ignore-user-config` lässt die gespeicherte Authentifizierung weiterhin nutzbar; niemals
|
||||
`auth.json` kopieren oder in Laufartefakten ablegen. Live-Websuche ist nicht freigegeben, weil
|
||||
@@ -946,6 +1057,9 @@ der Historie unten – im selben Arbeitsschritt.
|
||||
|
||||
| Version | Änderung | Grund | Verwendet in |
|
||||
|---|---|---|---|
|
||||
| **7.0.0** | **Isolationsmechanismus wird modusabhängig.** In den Modi `solo` und `builtin` unverändert `--safe-mode`; im Modus `custom` und bei jedem Lauf mit `--mcp-config` **kein** `--safe-mode`, stattdessen `--strict-mcp-config` plus `--disallowedTools Skill WebSearch WebFetch SlashCommand`. Neue Pflicht-Umgebungsprüfung auf Hooks, Plugins und Output-Styles im User-Profil; neue Protokollfelder für die MCP-Konfiguration und die Umgebungsprüfung. | `--safe-mode` schaltet ausweislich der CLI-Hilfe „MCP servers, custom commands and agents" ab – also genau das, was V2 und V3 untersuchen. Smoke-Test am 2026-08-26 (CLI 2.1.246, identischer Aufruf, nur `--safe-mode` variiert): mit Flag `spawned` = 0 und die Meldung, die Rollen seien „nicht in der Agent-Registry registriert"; ohne Flag `spawned` = 2 mit `{"modulinventar": 1, "konsistenzpruefer": 1}`. Ohne Ersatz hätte der erste V2-Lauf stillschweigend als V1-Lauf gemessen. Der Ersatz wurde gegengeprüft: nichts vorgeladen, keine Skills, kein Webzugriff, alle Rollen verfügbar. **MAJOR: Läufe im Modus `custom` sind hinsichtlich der Isolation nicht unmittelbar mit `solo`- und `builtin`-Läufen vergleichbar** – Plugins, Hooks und Output-Styles sind dort nicht durch das Flag, sondern nur durch die Umgebungsprüfung ausgeschlossen. | ab dem ersten V2-Lauf |
|
||||
| **6.1.0** | Zwei adapterunabhängige Pflichtprüfungen nach jedem Lauf: **(a)** `Ergebnisse\` darf nicht leer sein – sonst Fehlmessung, unabhängig von `is_error`; **(b)** `Stderr.log` auf Abbruchmeldungen prüfen. Der Ausführungsabschnitt setzt `CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS=0`. Neues Protokollfeld „Gültigkeit". Dokumentiert, dass die Rückgabe eines Hintergrund-Subagenten eine Start-Quittung ist und ihre Länge kein Ertragsmaß. | Lauf `…160037_v4.5.0-116d` meldete `is_error: false`, `subtype: success` und lieferte **null Ergebnisdateien** bei 193,4 Mio. Tokens – der Headless-Modus hatte nach 600 s abgebrochen, während zehn Hintergrund-Subagenten noch liefen. Ohne die neue Prüfung wäre der Lauf als gültiger Messpunkt mit „0 Anforderungen" in den Modellvergleich eingegangen. MINOR: neue Prüfschritte; die Umgebungsvariable ändert die Versuchsbedingung für künftige `builtin`-Läufe und ist dort zu vermerken. | ab sofort |
|
||||
| **6.0.0** | **Windows-taugliche Codex-Isolation.** Pro Lauf wird im System-Temp-Verzeichnis außerhalb des IDE-Projektbaums eine Kopie der versionierten und nicht ignorierten Dateien des Codebasis-Roots erstellt. Codex läuft ausschließlich dort mit `--sandbox workspace-write`; SHA-256-Manifeste vor und nach dem Lauf erkennen jede Änderung. Ergebnisse und Nachweise bleiben im Laufverzeichnis, die temporäre Kopie wird danach entfernt. | Der erste Codex-Lauf mit 5.0.0 konnte fachlich nicht starten, weil die Windows-Read-only-Sandbox sämtliche lesenden Kindprozesse vor dem Start blockierte. Eine Kopie im Laufverzeichnis wurde zudem vom C#-Projektservice automatisch mit ignorierten `obj`-Dateien verändert. MAJOR, weil Sandboxmodus und Arbeitsverzeichnis eine neue Versuchsbedingung bilden; der erste Lauf eröffnet deshalb eine neue Iteration. | ab dem ersten wiederholten Codex-Lauf |
|
||||
| **5.0.0** | **Neuer Codex-CLI-Adapter für OpenAI-Modelle.** Exakte OpenAI-Modell-IDs, expliziter Reasoning-Effort und Service-Tier; technisch read-only ausgeführtes `codex exec`; schemaerzwungene Dateirückgabe; JSONL-Rohdaten und deterministische Normalisierung nach `RawResult.json`. Codex ist zunächst nur im Modus `solo` freigegeben. Zusätzlich fünf beschädigte Backslashes vor `analyse-anforderungen.py`, `anforderungen.*` und `after.txt` repariert. | Der bisherige Skill konnte nur Claude Code ausführen. Ein Codex-Lauf braucht andere Isolations-, Ausgabe- und Messmechanismen. MAJOR, weil Werkzeug, Rohdatenformat und Ergebnisübergabe neue Versuchsbedingungen bilden; der nächste Lauf eröffnet deshalb eine neue Iteration. | ab dem ersten Codex-Lauf |
|
||||
| **1.0.0** | Ausgangsfassung: `--permission-mode acceptEdits`, kein Shell-Zugriff; Isolation durch Löschen der KI-Konfigurationsdateien im Root vor dem Lauf und `git restore` danach | Erstaufsetzung des Versuchsaufbaus | Lauf 1 (`01_Lauf_2026-08-25_1228`) |
|
||||
| **2.0.0** | `--allowedTools "Bash" "PowerShell"` + 33er-Denylist für schreibende und bauende Kommandos. Isolation über **eingefrorenen Codebasis-Snapshot ohne KI-Konfigurationen** (Commit `79c1142`, Parent `89ccfd6`, GitHub-Remote entkoppelt), zusätzlich `--safe-mode` und `--strict-mcp-config`. Der destruktive Lösch-/Restore-Schritt pro Lauf entfällt. `permission_denials` und `subagent_stats` werden reguläre Messgrößen; Verbrauchstabelle trennt Hauptagent und Gesamtlauf. CLI-Pfad-Auflösung als eigener Schritt. | Lauf 1 erzeugte 36 Permission-Denials (32 × Bash, 4 × PowerShell); Shell-gestützte Verzeichnisinventuren fehlten dem Agenten. `--safe-mode` allein genügt nicht: Es unterdrückt das Vorladen von `CLAUDE.md`/`AGENTS.md`, verhindert aber nicht, dass der Agent sie mit Shell-Zugriff selbst liest – im Smoke-Test nachgewiesen. | Lauf 2 (`01_Lauf_2026-08-25_1349`, API-Abbruch) |
|
||||
|
||||
Reference in New Issue
Block a user