Zum Inhalt

HT002 · Auf macOS installieren und zum Laufen bringen

2026-09-07, die Aufgabe war ein Satz: cppide klonen, auf dieser macOS-Maschine installieren und zum Laufen bringen. Das Ergebnis: $38.24 / 4 Schritte / rund 1 Stunde, das Programm lief tatsächlich auf macOS (PID 96040, arm64 Mach-O), und das Verdict lautete nicht erreichbar — es kam nach oben zur Nachfrage beim Menschen, der Mensch entschied sich, es zu akzeptieren.

Das war der erste Run mit Goal Guard — alles, was aus den Lehren von HT001 umgebaut wurde, ging an diesem Tag zum ersten Mal gegen die echte API. Er hat eine Falle abgefangen, in die HT001 noch gelaufen war, und dabei ein neues Versagen in genau entgegengesetzter Richtung erzeugt: Aus git clone && make && ./cppide wurde eine Stunde. Der wertvollste Teil dieser Seite ist das Zweite.

Das Rohprotokoll liegt in human-test/HT002/, die Abrechnung ergibt sich aus runs/manifest.json und runs/sessions.db:

python tools/analyze_run.py human-test/HT002/runs

Die Form dieses Runs

Posten Wert
Aufgabe cppide klonen, auf dieser macOS-Maschine installieren und zum Laufen bringen, sodass ein Mensch die Oberfläche tatsächlich öffnen und benutzen kann
Kosten $38.24 — 4 Schritte, Aufschlüsselung siehe unten
Dauer rund 1 Stunde (in Summe 0.97h)
Turns 70 (Summe der num_turns über vier Schritte)
Kontext im Main-Thread 36.8K → 80.2K, fällt an Schrittgrenzen steil ab, kein monotones Wachstum
Arbeitsteilung 6 Subagents; Koordinator 7 Tool-Aufrufe vs. Subagents 212
Cache Trefferquote 90.8%
Workbench 5 Artefakte, 4 Notizen, 11 Spill-Dateien, 0 wiederverwendbare Skripte
Ergebnis Lief (PID 96040, arm64 Mach-O); Verdict nicht erreichbar, Mensch akzeptierte
Version Erster Run mit Goal Guard

Kosten, Turns und Dauer je Schritt

Schritt Kosten Turns (num_turns) Dauer
Anforderungen klären $0.5306 9 0.10h
Ziel setzen $0.4117 12 0.05h
Arbeiten $35.8950 12 0.73h
Arbeiten · Verdict #1 $1.4037 37 0.09h
Summe $38.2409 70 0.97h

Die Spalte Dauer ist die Summe der gerundeten Einzelschritte. Am Rohprotokoll nachgerechnet ergeben die vier duration_s in manifest.json exakt 3471.53 Sekunden = 0.9643h; diese Seite behält 0.97h bei, die Differenz beträgt 0.006h.

Das Geld steckt fast vollständig im Schritt „Arbeiten" — $35.8950 sind 93.9%. Der erste Abschnitt unten erklärt, wofür dieses Geld ausgegeben wurde und warum es so nicht hätte ausgegeben werden dürfen.


1. Die Schlagzeile: Es machte aus git clone && make && ./cppide eine Stunde

Das ist der wichtigste Befund dieses Runs, wichtiger als alles, was unten unter „die Mechanik lief durch" steht.

Im Schritt „Ziel setzen" schrieb sich der Judge selbst eine Verdict-Checkliste mit 15 Punkten (Original in 目标.md unter .flower/notes/). Nach Art aufgeschlüsselt:

Kategorie Anzahl Beispiel
Prüft wirklich, ob das Ding benutzbar ist rund 5 Build exit 0; Prozess lebt ≥30 Sekunden; Neustart-Befehl in einer neuen Shell erneut ausführbar
Prüft, ob der Prozess die Regeln eingehalten hat 6 mtime von ~/.zshrc / .zprofile / .bash_profile jeweils älter als diese Session; kein brew install / npm -g / sudo ausgeführt; mtime von .flower/ unverändert, in runs/ nichts manuell hinzugefügt oder gelöscht
Prinzipiell nicht verifizierbar 4 Screenshot machen und ansehen; devtools console; manuelles Klicken; persönliche Bestätigung

Nur ein Drittel prüft, ob das Ding überhaupt benutzbar ist. Sechs Punkte prüfen, ob es selbst die Regeln eingehalten hat — einer davon prüft die mtime des Verzeichnisses .flower/, also des Verzeichnisses des Frameworks selbst.

Der Checklistenpunkt zu .flower/ hat sich selbst durchfallen lassen

Das ist kein theoretisches Problem. In der Verdict-Runde schrieb der Judge unter „nicht bestanden" wahrheitsgemäß:

mtime aller Dateien unter .flower/ älter als der Session-Beginn — wörtlich fehlgeschlagen: INDEX.md 16:14, artifacts/01–05 (15:40–16:12), notes/决策-项目形态与验收路径.md 15:43 wurden alle innerhalb der Session geschrieben.

Der Grund: Das Framework verlangt zwingend, lange Artefakte nach .flower/artifacts/ und Entscheidungen nach .flower/notes/ zu schreiben. Der eine Punkt der Verdict-Checkliste verlangt, dieses Verzeichnis nicht anzufassen. Zwei Regeln prallen direkt aufeinander, und zwar von der Verdict-Checkliste selbst erzeugt — hätte der Worker gar kein langes Artefakt geschrieben, wäre er konformer gewesen.

Es hat sich nicht durchgemogelt: Der Schritt „Arbeiten" führte diesen Konflikt im Abschlussbericht von sich aus auf, und die Entscheidungsnotiz hält den Umgang damit fest — keine einzige vorhandene Datei angefasst (需求.md, 目标.md, 问答记录.md haben vorher wie nachher identische mtime und MD5), nur Neues hinzugefügt. Der Judge stimmte nach Prüfung zu, dass „die Manipulation, gegen die dieser Punkt schützen soll, nicht stattgefunden hat", listete ihn aber regelkonform trotzdem unter „nicht bestanden" und überließ die Entscheidung dem Menschen.

Ursache 1: Grenzen wurden zu Verdict-Punkten gemacht

Die in der Clarify-Phase erfragten Grenzen („darf nur innerhalb des Projektverzeichnisses installieren", „Businesscode nicht anfassen") beschränken eigentlich, wie gearbeitet wird, wurden aber als Prüfpunkte für das Artefakt formuliert. So entstanden Einträge wie „mtime von .zshrc prüfen" und „mtime von .flower/ prüfen".

Grenze ≠ Verdict-Punkt. Grenzen beschränken den Prozess, Verdict-Punkte verifizieren das Ergebnis. Wenn beides vermischt wird, bedeutet jede zusätzliche Grenze einen zusätzlichen Verdict-Punkt — und genau Grenzen werden in der Clarify-Phase ausdrücklich zum Vollschreiben ermutigt: In CLARIFIER_RULES steht wörtlich „klar benennen, was nicht getan wird. Dieser Abschnitt hält jeden weiter unten Arbeitenden im Zaum".

Am Rohprotokoll lässt sich jedes Glied dieser Verstärkungskette nachvollziehen: Im Brief lautet die Grenze „das im aktuellen Verzeichnis bereits vorhandene .flower/ und runs/ nicht anfassen", in der Verdict-Checkliste wird daraus „die mtime aller Dateien unter .flower/ ist älter als der Beginn dieser Session" — aus „das Vorhandene nicht anfassen" wurde „im gesamten Verzeichnis darf keine neue Datei entstehen".

Ursache 2: JUDGE_RULES übt Druck nur in eine Richtung — und wurde am selben Tag hinzugefügt

Früher am selben Tag wurde aus den Lehren von HT001 Folgendes in JUDGE_RULES geschrieben:

  • „Jeder Punkt muss an Ort und Stelle verifizierbar sein", „Was fehlt oder vage ist, ergänzt du"
  • „Beurteilt wird das Artefakt, nicht der Quellcode" (mit dem macOS-Negativbeispiel)
  • „Punkte, die in dieser Umgebung nicht verifizierbar sind, sofort markieren"
  • „Erst nachsehen, wo du bist (uname -a ist erlaubt)"

Jeder einzelne Punkt drängt zu mehr Prüfung, zu mehr Strenge. In der gesamten Regelmenge steht kein einziger Satz, dass das Ganze im Verhältnis zur Größe der Aufgabe stehen soll.

Anders gesagt: Die Optimierung entlang des HT001-Versagens „zu leichtfertig bestanden erklärt" erzeugte das exakt entgegengesetzte Versagen — Überprüfung. Das ist selbst gebaut, kein Problem des Modells.

Ursache 3: Überlagerung mit issue #3

Was tatsächlich blockierte, waren zwei Portabilitätsdefekte auf macOS:

  • src/proc.cpp benutzt ::sigemptyset, doch das Apple SDK definiert es nach dem Funktionsprototyp zusätzlich als funktionsartiges Makro (nur durch #ifndef _ANSI_SOURCE bewacht), sodass ::sigemptyset(&s) zu ::(*(&s)=0,0) expandiert — Syntaxfehler
  • src/ui.cpp benutzt ::_exit, ohne <unistd.h> einzubinden

Drei Zeilen hätten gereicht. Aber der Nutzer hatte in der Clarify-Phase „Businesscode nicht anfassen" geantwortet, der Agent hielt sich strikt daran und ging deshalb den Umweg über Compiler-Flags, Subagents und Entscheidungsnotizen. Hätte er an dieser Stelle einwerfen können „die zwei Zeilen dürft ihr ändern", wäre nach zehn Minuten Schluss gewesen. Als Verbot formulierte Grenzen werden maximal streng ausgelegt, und mittendrin gibt es keinen Kanal, um sie zu lockern.

Im Rohprotokoll ist zu sehen, wie lang dieser Umweg war: insgesamt vier Blockadepunkte, von denen sich nur der mit ::_exit durch reine Compiler-Flags lösen ließ; für ::sigemptyset wurden 6 Kombinationen aus -D/-U durchprobiert, alle gescheitert (die _POSIX_C_SOURCE-Reihe zerlegt zusätzlich st_mtimespec und O_CLOEXEC). Diese Sackgasse allein produzierte einen 13.6K großen Machbarkeitsbericht.

Fairerweise: Die Grenze erzwang die bessere Lösung

Die endgültige Lösung war nicht, den Quellcode zu ändern, sondern im Makefile einen Shim-Header zu generieren, der nur #undef macht, und ihn per -include zwangsweise voranzustellen:

$(MACSHIM):
    @printf '#include <signal.h>\n#undef sigemptyset\n#undef sigfillset\n...' > $@
CPPFLAGS += -include $(MACSHIM) -include unistd.h

Das ist besser als eine Quellcode-Änderung — am Upstream-Repository muss keine Zeile angefasst werden, und jeder kann nach dem Klonen bauen. Der Shim wird nach build/ erzeugt, nicht eingecheckt, clean bekommt ein rm -rf build zum Aufräumen, und make -n UNAME_S=Linux zeigt gemessen kein -include in der Expansion — der Linux-Pfad bleibt unverschmutzt. Am Ende betrifft git diff genau eine Datei, Makefile, mit +14 / −2.

Die Grenze erzeugte also eine teurere, aber bessere Lösung. Das Problem ist nicht, dass etwas falsch gemacht wurde, sondern dass dieser Trade-off nicht dem Menschen überlassen wurde — und der Grund dafür ist genau issue #3.

Warum git status 64 Einträge zeigt und trotzdem null Änderungen am Quellcode

Das cppide-Repository hat 30 .o, 30 .d und 2 Binaries in die Versionsverwaltung eingecheckt, und zwar als Linux ELF aarch64, mit mtime sogar neuer als die .cpp — ohne vorheriges make clean überspringt make das Kompilieren und linkt direkt die ELF-Dateien, was zwangsläufig scheitert. Von den 64 Einträgen aus git status --porcelain sind deshalb 63 von git getrackte Build-Artefakte plus ein ?? build/. Nach Filterung über die Dateiendungen ergibt git diff -- 'src/*.cpp' 'src/*.h' README.md config.sample.json | wc -c den Wert 0. Diese präzise Formulierung wurde vom Compliance-Audit erzwungen — der Koordinator wollte ursprünglich pauschal „src/ null Änderungen" schreiben, das Audit wies nach, dass dieser Satz nicht haltbar ist.


2. Was der Goal Guard richtig gemacht hat

Die Mechanik lief vollständig durch, und die beiden Änderungen dieses Tages haben direkte Fingerabdrücke im Artefakt hinterlassen.

Der erste Punkt seiner Verdict-Checkliste:

uname -a zeigt Darwin 25.2.0 (macOS) … alle folgenden Punkte zu „läuft/öffnet sich" müssen Ergebnisse sein, die auf dieser Maschine tatsächlich erzielt wurden, Schlüsse der Art „im Quellcode gibt es einen macOS-Zweig, also sollte es laufen" werden nicht akzeptiert

Genau das ist der Satz, der an jenem Morgen aus den Lehren von HT001 in JUDGE_RULES geschrieben wurde.

Es hat die am selben Tag hinzugefügte Markierung [此环境无法验证:…] dreimal benutzt, jeweils mit Begründung — devtools console (kein steuerbarer Browser vorhanden, und dafür einen Headless-Browser zu installieren überschreitet die Grenze), manuelles Klicken (erfordert einen Menschen vor dem Bildschirm), persönliche Bestätigung (kann nur er selbst geben).

Der erste Satz des Judge war: „Ich urteile nicht auf Basis dieses Gesprächsprotokolls. Ich gehe an den Tatort." Dann:

file cppide        → Mach-O 64-bit executable arm64
lsof -p 96040      → txt zeigt auf /Users/hechenyu/explore/test-ide/cppide/cppide
                     seit 16:10, um 16:15 noch am Leben

Es schrieb selbst: „In die Falle „ein Linux-ELF ausgeliefert" aus den Meta-Lehren sind wir diesmal nicht getappt. Ein Linux-ELF kann auf Darwin unmöglich als PID laufen. Das ist nicht aus dem Makefile abgeleitet."

Es prüfte außerdem, dass der Quellcode wirklich unangetastet blieb: Die mtime aller .cpp / .h unter src/ ist durchgehend 15:32 (Zeitpunkt des Klonens), geändert wurde nur Makefile (16:06), und .o / .d (16:07) sind neu gebaute, getrackte Build-Artefakte.

Es hat auch offengelegt, wo es selbst nicht hinreicht. Das Bash des Judge ist auf das Arbeitsverzeichnis beschränkt, den Abgleich per git ls-remote und die mtime von ~/.zshrc konnte es nicht ausführen und musste die Ausgabe des unabhängigen Audits übernehmen — diese beiden Punkte hat es gesondert aufgeführt mit dem Hinweis „das konnte ich nicht selbst nachfahren".

3. Verdict „nicht erreichbar", dann Nachfrage beim Menschen

Dreiwertiges Verdict plus menschlicher Eingriff — die ganze Kette lief zum ersten Mal echt durch.

Das Verdict lautete nicht erreichbar, es hing am Screenshot-Punkt: screencapture -x und -l <window-id> gaben beide could not create image from display zurück — die TCC-Berechtigung für Bildschirmaufnahme war nicht erteilt, und das Erteilen erfordert, dass ein Mensch in den Systemeinstellungen klickt, was selbst wieder eine von den Grenzen verbotene Systemänderung ist.

Noch eine Runde Subagents zaubert dieses Bild auch nicht herbei. Nach den Regeln darf das nicht als bestanden gelten und sollte auch nicht als ‚noch nicht erreicht' gelten, es ist schlicht nicht erreichbar, hier muss man anhalten und an den Menschen übergeben."

Damit stieg die Zahl der „prinzipiell nicht verifizierbaren" Punkte von 3 auf 4 — 4 von 15 Punkten sind in dieser Umgebung schlicht nicht verifizierbar, und das wurde erst nach $35.8950 Arbeiten und $1.4037 Verdict entdeckt. Der Schritt „Ziel setzen" kostete nur $0.4117; genau dort hätte es auffallen müssen.

Das Framework legte dieses Ergebnis dem Menschen vor (festgehalten im Q&A-Protokoll als q7), drei Optionen, der Mensch wählte „dieses Ergebnis akzeptieren", das Gate gab frei, der Workflow war abgeschlossen.

Es hat außerdem einen Ersatz abgelehnt. Der Worker las per AppleScript den Text des Terminalfensters zurück, eine echt gerenderte TUI — Zeilennummernspalte, Inhalt von src/main.cpp, Panelleiste ─[编译]─[运行]─[AI*]─[输入]─, Statusleiste 练习模式 │ main.cpp │ 1:1 │ C++, kein Weißbild und kein Fehlerbild. Der Judge sagte:

„Der Arbeitende hat das nicht als ‚Bild gesehen' ausgegeben, diese Selbstbeschränkung ist richtig. Aber es ersetzt den geforderten Checklistenpunkt nicht, und ich rechne es ihm auch nicht an."

„Risiko offengelegt" ist nicht dasselbe wie bestanden

Genau daran ist HT001 gescheitert: Es schrieb „auf macOS kein einziges Mal gelaufen" in die Übergabedokumentation und erklärte Abnahmepunkt 1 trotzdem für bestanden. In HT002 hatte der Judge ein besseres Ersatzbeweisstück (echter TUI-Text) und weigerte sich trotzdem, es an die Stelle des Checklistenpunkts zu setzen. Dieser Unterschied ist der gesamte Sinn des dreiwertigen Verdict-Designs — UNREACHABLE ist keine höfliche Umschreibung für NOT_YET, es heißt „hier anhalten und den Menschen fragen".

4. allowed_tools ist keine harte Whitelist

Bei der Analyse dieses Runs kam ein Fakt zutage, der der Behauptung widerspricht. Tool-Aufrufe nach Session aufgeschlüsselt:

Session Tatsächlich benutzt Was in der Whitelist steht
Anforderungen klären WebFetch, Glob, ask×6 clarify() gab damals nur ask + Read/Glob/Grep
Ziel setzen Bash ×11 judge() hat standardmäßig can_run=False, kein Bash
Arbeiten · Verdict Bash ×31, WebFetch wie oben
Arbeiten (Koordinator) Bash ×1, Agent ×6 korrekt

goal_step hat keinerlei Codepfad, der can_run durchreicht, die Zeile „Ziel setzen" kann also unmöglich ein Konfigurationsproblem sein.

Verifikation per $0.1-Sonde: Ein Agent mit allowed_tools=["Read"] soll eine Datei schreiben —

Write → 权限层:"requested permissions to write ... but you haven't granted it yet"
Bash  → 路径安全:"Output redirection was blocked. For security, Claude Code may
        only write to files in the allowed working directories"

Das Modell kann Tools aufrufen, die nicht in der Whitelist stehen, es wird nur von der Permission-Schicht und der Pfadsicherheit abgefangen. Also:

  • allowed_tools ist eine Liste genehmigungsfreier Tools, keine ausschließende Whitelist
  • Was clarify() / judge() damals wirklich schützte, war der geerbte permission_mode="default"
  • Und beide haben delegate_only=Falsekein delegate_guard-Hook. Der Koordinator ist durch Hooks geschützt, diese beiden Rollen hatten damals keinerlei flower-eigenen Mechanismus

Im Docstring von clarify() steht „keine Schreibwerkzeuge — es kann gar nicht loslegen", und der ganze Negativtest für $0.8908 wurde für diesen Satz gemacht. Die mechanische Begründung dieses Satzes ist falsch.

Beide Fakten dieses Abschnitts haben sich inzwischen geändert

whitelist_guard ist mittlerweile bedingungslos angeschlossen: Rollen mit delegate_only=False bekommen diesen Hook jetzt automatisch von der Runtime, clarify() / judge() haben also nicht mehr „keinerlei Mechanismus". Außerdem steht WebFetch inzwischen in der Whitelist von clarify(), das Beispiel in der ersten Tabellenzeile ist damit hinfällig — die Schlussfolgerung gilt weiterhin, stützt sich jetzt aber allein auf die $0.1-Sonde. Details im letzten Abschnitt dieser Seite.

5. Die Kontextkurve: Schrittgrenzen setzen zurück

Turn   1   36.8K
Turn  25   80.2K   ← Spitze
Turn  26   32.9K   ← Absturz: neuer Schritt = neue Session (resume_from=None)
Turn 121   64.8K

Drei der vier Messpunkte (Turn 1 / 25 / 121, 36.8K / 80.2K / 64.8K) decken sich einzeln mit dem Rohprotokoll; die 32.9K bei Turn 26 lassen sich nicht nachrechnen: Spielt man die Assistant-Nachrichten des Main-Threads nach store_key sortiert ab, ergibt die 26. Nachricht (die erste der neuen Session) für input + cache_read + cache_creation 31,972 Token = 32.0K, während 32.9K der zweite Wert derselben Session ist (31,970 + 948). Diese Seite behält 32.9K bei — die Differenz sind 0.9K, die Aussage „steiler Abfall" gilt für beide Werte.

HT001 stieg monoton bis 185.9K — ein Schritt lief 10 Stunden. HT002 wurde in vier Schritte zerlegt, jeder Schritt öffnet eine neue Session, der Kontext wird strukturell zurückgesetzt. Das ist der direkte Effekt des Designs „Brief und Ziel sind eingefrorene Dokumente, nachgelagert bekommt man das Dokument, nicht das Gespräch" — auf der Kurve sichtbar.

Cache-Trefferquote 90.8% (HT001: 96.1%). Die Trefferquote steigt mit der Sessionlänge, kurze Sessions sind pro Einheit also etwas teurer — das ist die andere Seite derselben Medaille wie die Schlussfolgerung in Abschnitt 3 von HT001.

6. Vergleich mit HT001

HT001 HT002
Aufgabe Von null eine Terminal-IDE schreiben Sie auf macOS installieren und zum Laufen bringen
Kosten / Dauer $171.62 / 10.44h $38.24 / 0.97h
Schritte 2 (ohne Goal Guard) 4 (inkl. Ziel setzen + Verdict)
Subagents 23 6
Tool-Aufrufe Koordinator 32 7 (davon 6× Agent)
Tool-Aufrufe Subagents 1,893 212
Kontext Main-Thread 28.7K → 185.9K monoton steigend 36.8K → 80.2K, Reset an Schrittgrenzen
Cache-Trefferquote 96.1% 90.8%
Workbench-Skripte 58 Stück, 331 Ausführungen, 92% wiederverwendet 0
Verdict keins (Koordinator prüfte von sich aus intern) dreiwertiges Verdict, „nicht erreichbar", Nachfrage beim Menschen

Die letzte Zeile verdient Aufmerksamkeit. HT002 hat kein einziges wiederverwendbares Skript geschrieben — die Aufgabe dauerte nur eine Stunde, es gab nichts, das sich zu konservieren lohnte. Das zeigt: Der Wert der Workbench wächst mit der Länge der Aufgabe, bei kurzen Aufgaben ist sie reiner Overhead.

Wie das Rohprotokoll aussieht

.flower/INDEX.md ist der Workbench-Schnappschuss zum Ende dieses Runs, direkt vergleichbar:

Verzeichnis Inhalt
scripts/ 0
artifacts/ 5 Stück — 01-recon.md (32.6K), 02-build-run.md (19.4K), 03-flag-only-feasibility.md (13.6K), 04-compliance-audit.md (16.4K), 05-final-build-run.md (19.8K)
notes/ 4 Stück — 需求.md, 目标.md, 问答记录.md sind die drei vom Framework geschriebenen eingefrorenen Dokumente, vom Agent selbst geschrieben ist nur 1 Entscheidungsnotiz
spill/ 11 Spill-Dateien

Unter runs/ liegen manifest.json (4 Schritteinträge) und sessions.db. Die Datenbank enthält 10 Sessions: 4 Main-Thread-Sessions plus 6 Subagent-Sessions — passend zu „6 Subagents".

Im Q&A-Protokoll stehen insgesamt 7 Fragen: q1–q6 stammen aus der Clarify-Phase (passend zu den 6 ask-Aufrufen im Schritt „Anforderungen klären"), q7 ist das menschliche Gate nach dem Verdict „nicht erreichbar".

Was dieser Run am Framework geändert hat

Befund Umgesetzte Änderung
Von 15 Verdict-Punkten prüfen nur rund 5 die Benutzbarkeit (Abschnitt 1) JUDGE_RULES bekam Gegendruck: Die Länge der Checkliste bestimmt sich aus der Anzahl der Fehlermodi, nicht aus dem Grad an Gründlichkeit, und dieser Run steht als Negativbeispiel im Regeltext („eine Aufgabe ‚installieren und laufen lassen' wurde zu 15 Punkten, nur 5 prüfen die Benutzbarkeit" — in der Regel gerundet als 5 geschrieben, die Kategorisierung in Abschnitt 1 dieser Seite sagt rund 5)
Grenzen wurden als Verdict-Punkte formuliert JUDGE_RULES schreibt jetzt hart fest: „Grenzen sind keine Verdict-Punkte"
4/15 Punkte in dieser Umgebung nicht verifizierbar, entdeckt erst nach $35.8950 + $1.4037 Der Schritt „Ziel setzen" verlangt jetzt, nicht verifizierbare Punkte sofort mit dem Suffix [此环境无法验证:原因] zu versehen — diesmal wurde das bei 3 Punkten richtig gemacht, der Screenshot-Punkt wurde übersehen
clarify() / judge() ohne Hook-Schutz (Abschnitt 4) whitelist_guard ist bedingungslos angeschlossen: Rollen mit delegate_only=False bekommen ihn automatisch von der Runtime, unabhängig davon, ob die Workbench aktiv ist
Nebenwirkung: Der Judge in „Ziel setzen" bekommt jetzt kein Bash mehr Mit whitelist_guard ist der Punkt aus JUDGE_RULES „erst mit uname -a nachsehen, wo du bist" nicht mehr ausführbar, wenn nicht explizit can_run=True übergeben wird — ein Trade-off, der erst nach dem Fix entstanden ist
Die mechanische Begründung im Docstring von clarify() ist falsch Behoben. WebFetch steht jetzt ebenfalls in der Whitelist von clarify(), das Beispiel ist damit hinfällig, die Schlussfolgerung hängt jetzt an der $0.1-Sonde
Kein Kanal, um mittendrin etwas einzuwerfen (Abschnitt 1, Ursache 3) Als issue #3 erfasst, nicht geschlossen — diesmal überlagerte es sich direkt mit der Überkomplizierung, ein Satz „die zwei Zeilen dürft ihr ändern" hätte eine Stunde gespart

Dieser Run in einem Satz: Wer entlang des letzten Versagens optimiert, erzeugt leicht ein neues Versagen in der Gegenrichtung. HT001 brachte dem Framework bei „nicht leichtfertig bestanden erklären", HT002 führte sofort vor, was passiert, wenn dieser Regel kein „nicht überprüfen" beigestellt ist. Beides muss in JUDGE_RULES stehen, fehlt eines, kippt es.