Wie Sie die Änderungen eines Agenten prüfen
Ein Änderungssatz sind alle Dateien, die ein Coding-Agent für einen Auftrag angelegt, geändert oder gelöscht hat. Ein Agent kann in einer Minute zwanzig Dateien ändern. Alle mit derselben Sorgfalt zu lesen, schafft niemand.
Eine Prüfung nach Risiko findet die riskanten Dateien und liest diese zuerst. Eine Lektion zuvor liest einen kleinen Diff mit dem Auge; diese Lektion ordnet einen ganzen Änderungssatz.
Am Ende dieser Lektion
Notiz
Ich kann den Änderungssatz eines Coding-Agenten nach Risiko ordnen, bevor ich ihn lese.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Änderungssatz | alle Dateien, die für einen Auftrag geändert wurden |
| Ausufern | Änderungen über das hinaus, was der Auftrag verlangte |
| Abhängigkeit | ein Paket, das der Code zum Laufen braucht |
| Warnzeichen | ein Hinweis, dass eine Änderung Sorgfalt braucht |
| Gewicht | wie viele Punkte ein Warnzeichen wert ist |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Fünf Zeichen, dass eine Änderung Sorgfalt braucht
Eine Datei, die der Auftrag nicht nannte, heißt Ausufern. Ein gelöschter Test oder ein Test mit weniger Zeilen kann eine kaputte Funktion verstecken. Eine geänderte Konfigurationsdatei kann ändern, wie alles gebaut wird.
Eine sehr große neue Datei ist schwer zu lesen. Eine neue Abhängigkeit bringt Code mit, den niemand im Team geschrieben hat. Jedes davon ist ein Warnzeichen.
Durchgerechnetes Beispiel: Warnzeichen und Gewichte
| Warnzeichen | Wann es gesetzt wird | Gewicht |
|---|---|---|
| Test gelöscht | Eine Testdatei wird gelöscht | 5 |
| Test geschrumpft | Eine Testdatei verliert mehr Zeilen, als sie gewinnt | 3 |
| außerhalb des Auftrags | Der Auftrag nannte die Datei nicht | 3 |
| Konfiguration | package.json, package-lock.json oder ci.yml | 2 |
| groß | Mehr als 200 Zeilen hinzu und weg | 1 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Punkte zählen, ordnen, dann lesen
Addieren Sie die Gewichte der Warnzeichen einer Datei zu ihrer Punktzahl. Ordnen Sie die Dateien mit der höchsten Punktzahl zuerst. Bei Gleichstand bleibt die ursprüngliche Reihenfolge.
Lesen Sie dann die obersten Dateien ganz, Zeile für Zeile. Die unteren Dateien werden trotzdem gelesen, aber sie verstecken die riskanten nicht mehr. Ein gelöschter Test schickt die ganze Änderung zurück.
Ein häufiger Fehler
Warnung
Viele denken, eine Prüfung heiße, jede Zeile mit derselben Sorgfalt zu lesen. Bei 400 Zeilen verstecken sich die zehn riskanten unter den sicheren. Ordnen Sie zuerst nach Risiko und lesen Sie dann jede riskante Datei ganz.
Die Modellhilfe schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const basis = process.env.AI_URL || \"http://ai:4000\";' '// Die Token einer Antwort oder null, wenn sie keine nennt.' 'function zaehlen(daten, name) {' ' return daten.usage && typeof daten.usage[name] === \"number\" ? daten.usage[name] : null;' '}' > model.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Modellhilfe schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function fragen(nachrichten, probe, max) {' ' try {' ' const res = await fetch(basis + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: nachrichten, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"Status \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, eingabe: zaehlen(d, \"prompt_tokens\"), ausgabe: zaehlen(d, \"completion_tokens\"), aufgezeichnet: false };' ' } catch (fehler) {' ' console.log(\"Aufgezeichnete Probe: Kein Modell hat geantwortet (\" + fehler.message + \").\");' ' return { text: probe, eingabe: null, ausgabe: null, aufgezeichnet: true };' ' }' '}' 'module.exports = { fragen };' >> model.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Skript zur Risikoprüfung schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '// Der Auftrag nannte zwei Dateien. Der Agent gab sieben zurück.' 'const erlaubt = [\"kiosk.js\", \"kiosk.test.js\"];' 'const KONFIG = [\"package.json\", \"package-lock.json\", \"ci.yml\"];' 'const GEWICHT = { \"Test gelöscht\": 5, \"Test geschrumpft\": 3, \"außerhalb des Auftrags\": 3, \"Konfiguration\": 2, \"groß\": 1 };' > risiko.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Skript zur Risikoprüfung schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const aenderungen = [' ' { pfad: \"kiosk.js\", hinzu: 12, weg: 2, art: \"geändert\" },' ' { pfad: \"kiosk.test.js\", hinzu: 1, weg: 9, art: \"geändert\" },' ' { pfad: \"preise.json\", hinzu: 1, weg: 1, art: \"geändert\" },' ' { pfad: \"alt.test.js\", hinzu: 0, weg: 40, art: \"gelöscht\" },' ' { pfad: \"package.json\", hinzu: 1, weg: 0, art: \"geändert\" },' ' { pfad: \"README.md\", hinzu: 3, weg: 0, art: \"geändert\" },' ' { pfad: \"utils/format.js\", hinzu: 230, weg: 0, art: \"neu\" },' '];' 'const vorher = [\"datum-tools\"];' 'const nachher = [\"datum-tools\", \"geld-format\"];' >> risiko.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Skript zur Risikoprüfung schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function zeichen(a) {' ' const aus = [];' ' const istTest = a.pfad.indexOf(\".test.\") >= 0;' ' if (istTest && a.art === \"gelöscht\") aus.push(\"Test gelöscht\");' ' if (istTest && a.art === \"geändert\" && a.weg > a.hinzu) aus.push(\"Test geschrumpft\");' ' if (erlaubt.indexOf(a.pfad) < 0) aus.push(\"außerhalb des Auftrags\");' ' if (KONFIG.indexOf(a.pfad) >= 0) aus.push(\"Konfiguration\");' ' if (a.hinzu + a.weg > 200) aus.push(\"groß\");' ' return aus;' '}' 'function punkte(a) {' ' return zeichen(a).reduce(function (summe, z) { return summe + GEWICHT[z]; }, 0);' '}' >> risiko.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Skript zur Risikoprüfung schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const reihe = aenderungen.slice().sort(function (a, b) { return punkte(b) - punkte(a); });' ' reihe.forEach(function (a) {' ' console.log(punkte(a) + \" \" + a.pfad + (zeichen(a).length ? \": \" + zeichen(a).join(\", \") : \"\"));' ' });' ' nachher.filter(function (d) { return vorher.indexOf(d) < 0; })' ' .forEach(function (d) { console.log(\"neue Abhängigkeit: \" + d); });' >> risiko.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Skript zur Risikoprüfung schreiben, Teil 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' const weg = aenderungen.some(function (a) { return zeichen(a).indexOf(\"Test gelöscht\") >= 0; });' ' console.log(weg ? \"zurückschicken: ein Test wurde gelöscht\" : \"in dieser Reihenfolge prüfen\");' ' const f = \"Schreiben Sie in einem kurzen Satz, warum man eine gelöschte Testdatei zuerst ansieht.\";' ' const probe = \"Ein gelöschter Test kann eine kaputte Funktion verstecken, weil sie niemand mehr prüft.\";' ' const antwort = await fragen([{ role: \"user\", content: f }], probe, 60);' ' console.log(\"Das Modell sagte: \" + antwort.text);' '}' 'main();' >> risiko.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Risikoprüfung ausführen
docker exec -w /home/node/project agent node risiko.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Was der Run ausgibt
| Zeile | Was sie zeigt |
|---|---|
| 8 alt.test.js: Test gelöscht, außerhalb des Auftrags | Die riskanteste Datei, zuerst gelesen |
| 5 package.json: außerhalb des Auftrags, Konfiguration | Eine Konfigurationsdatei, die der Auftrag nie nannte |
| 4 utils/format.js: außerhalb des Auftrags, groß | Eine große neue Datei, die niemand wollte |
| 3 kiosk.test.js: Test geschrumpft | Der genannte Test hat Zeilen verloren |
| 3 preise.json: außerhalb des Auftrags | Eine Preisdatei, die der Auftrag nie nannte |
| 3 README.md: außerhalb des Auftrags | Eine Textdatei, die der Auftrag nie nannte |
| 0 kiosk.js | Die eine Datei, um die es im Auftrag ging |
| neue Abhängigkeit: geld-format | Neuer Code von außerhalb des Teams |
| zurückschicken: ein Test wurde gelöscht | Die Entscheidung für den ganzen Änderungssatz |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.