turn-eta — Sage, wann dieser Durchlauf fertig ist, und lerne mit jedem Mal dazu
Bevor die Arbeit beginnt, schreibe die Schritte als nummerierte Liste auf und gib an, wann sie abgeschlossen sein wird. Miss jeden Schritt, sobald er anfällt. Wenn der Durchlauf endet, schließe die Antwort mit der tatsächlichen Endzeit ab. Die nächste Schätzung liest dieses Protokoll.
Wann dies ausgeführt wird
Jeder Durchlauf, der echte Arbeit enthält — Bearbeiten einer Datei, Ausführen eines Befehls, Durchsuchen der Codebasis.
- Arbeit im Durchlauf → rufe
planvor dem Start auf und eröffne deine Antwort mit dem, was es ausgibt, in der Reihenfolge, in der es ausgegeben wird: zuerst die**ETA …**-Zeile für sich allein, dann die nummerierten Schritte. Die Endzeit ist das, worauf der Leser gewartet hat; die Schritte darunter sind die Begründung. Rufestep <id>auf, sobald jeder Schritt anfällt, unddone <id>, wenn die Arbeit des Durchlaufs abgeschlossen ist. - Der letzte Absatz ist ebenfalls eine Zeitangabe, und zwar abhängig davon, ob noch etwas läuft.
- Alles abgeschlossen, bevor du die Antwort schreibst → den gesamten Block, den
doneausgibt: die Abschlusszeile vondone. Zu diesem Zeitpunkt ist die ETA abgelaufen; sie erneut abzudrucken liefert dem Leser eine Schätzung, die die Uhr bereits widerlegt hat, während die Schritt-für-Schritt-Zeiten zeigen, wo es schiefgelaufen ist. - Es läuft noch etwas (Hintergrundjob, delegierte Aufgabe) → die Vorhersage:
**ETA 17:45**. Berechne sie beim Schreiben neu, füge niemals die Zahl ein, dieplanzuvor gedruckt hat.
- Alles abgeschlossen, bevor du die Antwort schreibst → den gesamten Block, den
- Reiner Konversationsdurchlauf (Beantworten einer Frage, Entscheiden, was gebaut werden soll) → nichts tun. Das ist Rauschen.
- Ein Einzeiler-Fix ist den Aufwand ebenfalls nicht wert. Verwende ihn, wenn es mehr als einen Schritt gibt.
Befehle
Reines Node, keine Installation. Rufe es von dem Ort auf, an dem der Skill installiert ist.
# vor der Arbeit — benenne die Schritte und erhalte eine ETA
node <skill>/scripts/eta.js plan \
"Fehler reproduzieren" "Datums-Parser korrigieren" "Testdaten aktualisieren" "Suite erneut ausführen" \
--provider anthropic --model claude-opus-5 --size M
# **ETA 17:45** (14 min)
#
# 1. Fehler reproduzieren
# 2. Datums-Parser korrigieren
# 3. Testdaten aktualisieren
# 4. Suite erneut ausführen
#
# 4 Schritte, ~14 min (3,5 min/Schritt bei anthropic/claude-opus-5 M, 6 Durchläufe)
#
# (letzte 6 Schätzungen 3 min zu lang)
# turn id: 48i35qek
# jedes Mal, wenn ein Schritt anfällt — gemessen, der Rest wird mit dem gemessenen Tempo neu geschätzt
node <skill>/scripts/eta.js step 48i35qek
# 2/4 Datums-Parser korrigieren — 8m 06s
#
# **ETA 17:49** (4 min später)
# wenn die Arbeit des Durchlaufs abgeschlossen ist
node <skill>/scripts/eta.js done 48i35qek
# **FINISHED 17:48** (geschätzt 14 min / tatsächlich 17 min)
# was das Protokoll aktuell sagt
node <skill>/scripts/eta.js stats
Benenne die Schritte, zähle sie nicht einfach. plan lehnt eine bloße Zahl ab. Eine Anzahl, die niemand überprüfen kann, ist kein Plan – benannte Schritte erlauben der lesenden Person, vor Beginn „überspringe 3“ zu sagen. Setze diese nummerierte Liste an den Anfang deiner Antwort, dann erledige die Arbeit.
Du musst deine eigenen --provider und --model übergeben. Eine Shell kann nicht sehen, welches Modell sie antreibt. Verwende die Bezeichnungen, mit denen du dich selbst kennst – --provider anthropic --model claude-opus-5, --provider openai --model gpt-5-codex, --provider google --model gemini-3-pro. Fehlt etwas, landet es unter unknown/unknown, was immer noch funktioniert, aber alle Modelle zusammenwirft.
--size ist S (kleine Korrektur), M (normal, Standard) oder L (großer Block). Grob ist in Ordnung; es verhindert nur, dass kleine Durchläufe den Durchschnitt großer verzerren.
Die Turn-ID ist erforderlich. plan gibt eine aus; verwende sie bei jedem step und dem abschließenden done – step 48i35qek, done 48i35qek. Ein anderer Agent, der am selben Projekt arbeitet, schreibt in dasselbe Protokoll, daher schloss ein Aufruf ohne ID früher denjenigen Durchlauf, der gerade offen war – den eines anderen. step und done lehnen jetzt ohne ID ab. Ein Durchlauf, den seit vier Stunden niemand mehr berührt hat, gilt als aufgegeben.
Wo das Protokoll gespeichert wird
<Projektwurzel>/.eta/<Provider>/<Modell>/log.tsv
Innerhalb des Projekts, sodass ein Agent, dessen Berechtigungen in seinem Arbeitsverzeichnis enden, dennoch seine eigene Historie lesen kann. Projektwurzel ist das nächstgelegene .git aufwärts, ansonsten das aktuelle Verzeichnis. Provider und Modell sind Ordner, sodass das Tempo eines Modells nicht stillschweigend zu dem eines anderen wird.
Füge .eta/ zur .gitignore hinzu. Es ist eine Messung deiner Maschine bei deinen Durchläufen; es bedeutet niemand anderem etwas und ändert sich bei jedem Durchlauf.
Setze TURN_ETA_DIR auf ein anderes .eta-Verzeichnis, um die Historie projektübergreifend zu teilen. Es wird nur konsultiert, wenn das lokale Protokoll zu dünn ist, um etwas auszusagen.
Wie die Schätzung besser wird
done zeichnet die Schätzung, die tatsächliche Dauer und die Schrittzeiten auf. plan liest sie zurück und nimmt die Median-Minuten pro Schritt, wobei es von der engsten Übereinstimmung nach außen geht und auf der ersten Stufe mit mindestens 3 abgeschlossenen Durchläufen stoppt:
- dieser Provider + Modell + gleiche Größe
- dieser Provider + Modell
- dieser Provider, jedes Modell
- alles im
.etadieses Projekts - das gemeinsame Protokoll in
TURN_ETA_DIR, gleiche Reihenfolge - sonst 4 Minuten pro Schritt
Median statt Mittelwert, damit ein einzelner langer Durchlauf nicht jede zukünftige Schätzung mit sich zieht. Nur die letzten 20 Durchläufe pro Stufe zählen. plan gibt aus, welche Stufe verwendet wurde, sodass die Zahl nie ein Rätsel ist.
Während des Durchlaufs vermischt step diese Historie mit dem Tempo, das dieser Durchlauf tatsächlich läuft, gewichtet nach dem Fortschritt: bei Schritt 1 von 4 trägt die Historie noch drei Viertel, bei Schritt 3 trägt dieser Durchlauf drei Viertel. Ein langsamer erster Schritt verschiebt die Endzeit, ohne sie zu kapern.