Chemenu kompiliert Rohnotizen zu einem verlinkten, quellengebundenen Wiki: raw/ -> types/ + tools/ -> kb/ -> reports/. Was mechanisch ist, macht tools/wikitool; was Urteil braucht, macht ein Agent unter Contracts, deren Grenzen in Code durchgesetzt sind statt im Prompt. Dieser Commit ist der Startpunkt der oeffentlichen Historie. Die vorherige Entwicklung fand in einer privaten Instanz statt und ist nicht Teil dieses Repositorys; ihre Erzaehlung steht vollstaendig in CHANGES.md, das mit 44 Eintraegen von 0.1.0 bis 2.1.0 erhalten geblieben ist. Der mitgelieferte Korpus ist ein Testbett und eine Demo: 170 Seiten ueber den Stack selbst - Gates, Lint, Versionierung, Suche, das Wiki-Muster. Er dokumentiert das Werkzeug mit den eigenen Mitteln des Werkzeugs. Lizenz: AGPL-3.0 fuer den Stack (tools/, types/), CC-BY-4.0 fuer die Inhalte. Die Grenze zwischen beiden ist der Dateiplan, den dist export berechnet - siehe NOTICE.
12 KiB
type, concept_type, tags, created, modified, related, sources, confidence, confidence_base, provenance, summary
| type | concept_type | tags | created | modified | related | sources | confidence | confidence_base | provenance | summary | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| types/concept.md | workflow |
|
2026-08-03 | 2026-09-01 |
|
|
0.88 | 0.88 | sourced | Mass-Update Gate: publish endet mit 42 (Freigabe durch den Menschen noetig) ab 10 gezaehlten Dateien; generierte Dateien und work/ werden committet, aber seit 1.5.0 nicht gezaehlt; freigegeben per --confirm <token> |
Mass-Update Gate
Typ: workflow
Definition
Das Mass-Update Gate ist ein Sicherheitsmechanismus, der die Ausführung pausiert und explizite Bestätigung anfordert, bevor mit Vorgängen fortgefahren wird, die eine große Anzahl von Seiten betreffen würden. Dies verhindert versehentliche Massenänderungen und stellt sicher, dass beabsichtigte großflächige Änderungen überprüft werden.
Kernpunkte
-
Farzas Regel: „Wenn ein Vorgang ≥10 Seiten ändert, halte an und fordere Bestätigung an"1
-
Zweck: Verhindert versehentliche Massenaktualisierungen, die schwer rückgängig zu machen wären
-
Begründung: Ein
git pushzuorigin/mainist die einzige Aktion in diesem System mit echten, irreversiblen externen Auswirkungen - sie ist sofort öffentlich sichtbar (Commit-Verlauf, mögliche CI-Auslöser, andere Clients ziehen) und ein Revert birgt immer noch Risiken. Jede andere wikitool-Schreiboperation ist lokal und billig rückgängig zu machen, daher ist das Gate speziell aufpublishbegrenzt, nicht auf jeden Befehl. -
Implementiert (2026-08-07):
tools/wikitool publishzählt die Dateien, die vongit status --porcelainnach dem Staging berührt werden. Unter der Schwelle (Standard 10,--thresholdzum Überschreiben) committed und pusht es automatisch, genau wie zuvor - Aufnahme-/Erstellungs-/Update-Vorgänge auf einzelnen Seiten werden nicht beeinflusst und führen nie zu Aufforderungen. Bei oder über der Schwelle wird 1 mit einemMass-Update Gate-Fehler beendet, der jede geänderte Datei auflistet und weigert sich zu committen oder zu pushen. -
--yeszurückgezogen für einen Clearance-Exit-Code (2026-08-28): Das Gate öffnete sich ursprünglich mit einem--yes-Flag, genehmigt durch einen Menschen, aber vom Agenten eingegeben - also lebte der Genehmigungsdatensatz nur in Konversation, nicht in irgendetwas, das das Tool oder ein späterer Leser überprüfen konnte. Drei Sitzungen zeigten die gleiche Form:publishausführen, beobachten, wie es sich weigert,--yeserneut ausführen in derselben Wendung, technisch den dokumentierten Befehl befolgen, während kein Mensch die Dateiliste je sah. Der Ersatz hat drei Teile:- Ein eigener Exit-Code. Ein ausgelöstes Gate beendet sich mit 42 (
EXIT_NEEDS_CLEARANCE), nicht 1 - ein drittes Ergebnis neben Erfolg und Validierungsfehler, bedeutet „ein Mensch muss diese Ausgabe sehen, bevor irgendetwas fortgeht". Ein Agent, ein Hook, eine CI-Aufgabe oder ein Scorer können es alle von „deine Eingabe war falsch, behebe es und versuche es erneut" unterscheiden. - Die Prozedur lebt in der Ausgabe, nicht in der Anweisungsschicht. Die Weigerung druckt, was sich ändern würde, jede gezählte Datei und die genaue
--confirm <token>-Zeile, die sie veröffentlicht.instructions/gates.mdsagt nur „zeige dem Benutzer die Ausgabe und halte an" - ein Rezept, das im Voraus aufgeschrieben ist, ist eines, das ein Agent von Anfang bis Ende ohne einen Menschen durchführen kann, was die drei Vorfälle jeweils aussahen. - Der Token bindet Genehmigung an einen Changeset.
--confirmnimmt eine Zusammenfassung der gezählten Dateiliste plus des Veröffentlichungsziels, daher macht das Anfassen einer weiteren Datei es ungültig und das Gate fragt wieder mit der neuen Liste.--yeshatte das nie: Es veröffentlichte, was immer im Arbeitsbaum war, wenn es lief, nicht unbedingt was der Mensch sah.
Was dies NICHT tut, ehrlich gesagt: es beweist nicht, dass ein Mensch irgendetwas eingegeben hat. Der Token sitzt im eigenen Kontext des Agenten, und ein Agent, der das Gate umgehen möchte, kann dies tun. Das ist ein bewusster Kompromiss - ein früheres Design, das tatsächlich unabhängigen Beweis erforderte (ein Ticket von einem zweiten Terminal eingelöst) war korrekt und unbrauchbar, daher bleibt die Durchsetzung hier billig und die Frage „hat ein Mensch es wirklich genehmigt?" wurde auf die Eval-Schicht verschoben, wo
clearance-was-asked-forundclearance-ended-the-turn(tools/chemenu/evals/trajectory.py) die ganze Flugbahn statt eines einzelnen Aufrufs sehen können. - Ein eigener Exit-Code. Ein ausgelöstes Gate beendet sich mit 42 (
-
Generierte Dateien zählen nicht mehr mit (
1.5.0, 2026-08-31):kb/index.md,kb/log.md,kb/provenance.mdund jedeINDEX.mdwerden weiterhin gestaged, committet und gepusht, gehen aber nicht mehr in die Zählung gegen die Schwelle ein - aus demselben Grund wiework/: sie tragen keine Entscheidung. Jede von ihnen ist überindex rebuildbzw.sources rebuild-indexaus dem Baum reproduzierbar, ihre Freigabe entscheidet also nichts und erzeugt nur die Prüfermüdung, gegen die die Schwelle existiert. Die Bausteine lagen bereits vor:is_generated()ingit_publish.pykannte die Liste,GATE_EXEMPT_PREFIXES = ("work/",)undcounted_files()boten den Mechanismus; verbunden waren beide nie,is_generatedgruppierte nur die Anzeige unter „rebuilt by wikitool - no review needed". Gemessen an drei realen Ingests desselben Tages: 14 Dateien 14 → 9 gezählt, 16 → 9, 11 → 5 - alle drei hätten nicht mehr angehalten. Die Schwelle selbst blieb bei 10, und ein Test hält fest, dass zehn echte Seiten weiterhin auslösen, damit die Ausnahme nicht still zur Abschaltung wird.2 -
Zwei Konsequenzen der Ausnahme: Die Weigerungszeile führt beide Gründe getrennt auf („3 under work/ and 5 generated by wikitool committed but not counted"), weil ein Prüfer die Differenz zwischen 14 geänderten und 9 gezählten Dateien sonst für einen Fehler hält - und weil Scratch-Zustand und abgeleitete Ausgabe nicht dasselbe sind. Und der
--confirm-Token fasst seither nur noch zusammen, was ein Mensch tatsächlich gelesen hat: eine neu gebauteINDEX.mdmacht eine erteilte Freigabe nicht mehr ungültig.2 -
Das alte Zählverhalten war ungetestet. Alle 67 Gate-Tests liefen grün, bevor die Tests für die Ausnahme geschrieben waren - kein Test hatte je behauptet, dass generierte Dateien mitgezählt werden. Ein Teil der Erklärung, warum es so lange unbemerkt blieb.2
-
Agent-Vertrag: Exit 42 beendet die Wendung. Dem Benutzer die Ausgabe des Befehls wörtlich zeigen, einschließlich Dateiliste, und anhalten; die Ausgabe selbst benennt den nächsten Schritt. Siehe AGENTS.md-Abschnitt „Tool error contract" und
instructions/gates.md. -
Ursprünglicher Vorschlag war breiter als das Gebaute: Die früheste Analyse-Quelle schlug Bestätigungs-Gates vor jeder riskanten Massenoperation vor - auch vor Massen-Löschungen und Massen-Umklassifizierungen, mit einem konfigurierbaren Schwellenwert.3 Gebaut wurde davon nur der
publish-Pfad; ein Lösch- oder Umklassifizierungs-Gate existiert nicht, aus demselben Grund, aus dem das Gate oben aufpublishbegrenzt bleibt - jeder anderewikitool-Schreibvorgang ist lokal und billig rückgängig zu machen.
Beispiele
- 2026-08-31 - Der Fix für die Gitea-Issues #12 und #13 berührte 21 Dateien.
publishendete mit 42, druckte die Aufschlüsselung nach Bereich und die--confirm-Zeile; der Agent gab die vollständige Liste wieder und stoppte, Torben gab frei, der bestätigte Publish erzeugte40adbb7mit 593 Einfügungen und 73 Löschungen. Anschließend wurde gegen das Repository geprüft, dassHEADgleichorigin/mainist undVERSION1.2.0liest, statt der Erfolgszeile des Werkzeugs zu vertrauen4 - 2026-08-31 - Drei gewöhnliche Ingests (Comma Bug, Issue Triage, Auto Mode) blieben nacheinander am Gate stehen, obwohl keiner eine Massenänderung war. Die Beobachtung löste die Ausnahme für generierte Dateien aus; nachgerechnet lagen die drei Changesets danach bei 9, 9 und 5 gezählten Dateien2 Vorgänge, die das Gate auslösen:
wikitool xref link-source --entities E1,E2,E3,E4,E5,E6,E7,E8,E9,E10(10+ entities), wenn direkt vor einempublishausgeführt wird, das alle auf einmal bereitstellt- Massenaufnahme mehrerer Quelldateien auf einmal
- Bulk-Seitenerstellung bei Lint-Fixes (wie die 2026-07-31-Operation, die 36 Seiten erstellte)
Gate-Verhalten (wie in tools/wikitool publish implementiert):
git status --porcelainzuerst (bevor irgendetwas bereitgestellt wird), um die genaue Anzahl und Liste der geänderten Dateien zu erhalten- Gezählt werden nur Dateien, die eine Entscheidung tragen: alles unter
work/und alle generierten Dateien sind seit1.5.0von der Zählung ausgenommen, werden aber mit committet2 - Wenn Anzahl < Schwelle: Commit und Push sofort, wie immer
- Wenn Anzahl >= Schwelle ohne passendes
--confirm <token>: Exit 42, drucke die Anzahlen, das Veröffentlichungsziel, die volle gezählte Dateiliste und die genaue--confirm-Zeile, die es veröffentlicht; nichts wird committet oder gepusht - Erneutes Ausführen mit diesem Token veröffentlicht normalerweise. Ein falsches, erfundenes oder überholtes Token beendet sich wieder mit 42 mit der aktuellen Liste, statt etwas zu veröffentlichen, das der Benutzer nicht sah
Wann zu verwenden
- Als Sicherheitsprüfung in wikitool CLI-Befehlen
- Für Vorgänge, die viele Seiten ändern oder referenzieren
- Wenn der Benutzer versehentliche Massenänderungen verhindern möchte
Wann NICHT zu verwenden
- Für Vorgänge auf einzelnen Seiten
- Wenn der Benutzer explizit mit --force umgeht
- In automatisierten Skripten, bei denen das Gate den nicht-interaktiven Gebrauch brechen würde
Verwandte Concepts
- Content Quality Control - Qualitätsrahmen, den Massenaktualisierungen bewahren sollten
- wikitool - Das CLI-Tool, das dieses Gate implementieren könnte
- Workflow Orchestration - Koordinierte Vorgänge, die Gates benötigen könnten
Beziehungen
- wird gespiegelt durch: Iteration and Cost Limits
- wendet an: Structural Enforcement over Documented Rule
- grenzt ab gegen: Bulk Operations
Siehe auch
- Source - LLM Improvements Sonnet Analysis
- Iteration and Cost Limits
- Source - LLM Improvements Production Agent Gaps 2026
- Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31
- Structural Enforcement over Documented Rule
- Bulk Operations