CommunityCodierung & Entwicklunggithub.com

george-andrikopoulos/global

Eine Engineering-Disziplin, die auf jedes Projekt und jede Sprache anwendbar ist. Behandelt: Garantie braucht einen Leser; Urteil übersteht den Kanal; Prüfe die geerbte Behauptung; Dokumentenaktualität; Miss die Behauptung, nicht eine Teilmenge; Kein stilles Ausgeben; Bevorzuge durch Konstruktion; Repariere das lügende Artefakt; Signal braucht eine Konsequenz; Verifiziere durch den Produktionspfad; Detektor schließt eigene Definitionen aus; Ein mehrdeutiges Schreibziel ist eine Frage; Verankere außerhalb der Reichweite der geprüften Partei; Delegiere einen Fan-Out; Vergleiche mit dem Bekannten...

Was ist global?

Dieses Skill-Set bietet eine Reihe von Engineering-Regeln, die als allgemeingültige Prinzipien für jedes Projekt und jede Sprache gelten. Es ist nicht an ein bestimmtes Tool oder eine Plattform gebunden, sondern stellt eine kognitive Disziplin dar, die die Zuverlässigkeit und Sicherheit von Systemen durch explizite, überprüfbare Garantien erhöht. Die Regeln decken eine breite Palette von Szenarien ab, von der Handhabung mehrdeutiger Schreibziele und der Überprüfung geerbter Behauptungen bis hin zur Vermeidung von Kollisionen durch Groß-/Kleinschreibung und der Sicherstellung, dass Detektoren ihre eigenen Definitionen ausschließen. Die Regeln sind als Markdown-Datei strukturiert: Jede Regel enthält eine klare Beschreibung, eine Fehlermodus-Prüfung und, wo zutreffend, eine Erläuterung der zugrundeliegenden Überlegungen und Verknüpfungen zu anderen Regeln. Die Regeln sind aus den Bereichen Sicherheit, Zuverlässigkeit und Softwareentwicklung abgeleitet und zielen darauf ab, häufige Fehler und Risiken in der täglichen Arbeit zu minimieren. Sie sind besonders nützlich für Agenten, die in komplexen Umgebungen arbeiten, wo ein einzelner Fehler schwerwiegende Folgen haben kann.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/george-andrikopoulos/relearn/tree/HEAD/claude-pack/skills/global

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Globale Regeln

Wenn die Anfrage nicht festlegt, was ein Schreibvorgang berührt, frage vor dem Schreiben nach [R:mehrdeutiges-schreibziel-ist-eine-frage]

Niedergeschrieben aus "Task Success Is Not Enough: Side-effect-Aware Evaluation of Tool-Using Language Model Agents" (SABench), NeurIPS 2026 Poster, https://neurips.cc/virtual/2026/poster/138911 (arXiv:2610.34167, gelistet in cs.AI 2026-10-27) -- Abstract gelesen am 27.10.2026.

Bevor du eine Aktion ausführst, die den Zustand außerhalb der Arbeitskopie ändert -- Senden, Posten, Einladen, Bearbeiten eines gemeinsamen Datensatzes, Löschen, Schließen -- nenne die genauen Ziele, die es berührt, und überprüfe, ob die Anfrage jedes einzelne davon nennt. Wenn nicht, frage nach. Löse die Mehrdeutigkeit nicht auf, indem du die plausibelste Lesart wählst und fortfährst.

Drei Formen, alle derselbe Fehler:

  • Das falsche Objekt. Zwei Kalender, zwei Threads, zwei Tickets passen auf die Beschreibung; eines wird ausgewählt.
  • Der erweiterte Umfang. "Antworte Sam" wird zu einer Allen-Antwort; "korrigiere das Datum in diesem Termin" wird zu einer Bearbeitung der gesamten Serientermin-Reihe.
  • Der unbeabsichtigte Empfänger. Eine Weiterleitung, eine Einladung oder eine Erwähnung erreicht jemanden, den die Anfrage nie genannt hat.

Das Erreichen des Ziels macht es nicht wett. Der Durchlauf, der die richtige Nachricht gesendet und einen zweiten Datensatz aktualisiert hat, sieht für jede Prüfung, die die Vollständigkeit bewertet, komplett aus. Deshalb überlebt diese Klasse die Überprüfung: Der Beweis des Erfolgs ist gleichzeitig die Deckung für den Seiteneffekt.

Die Kosten sind asymmetrisch, also ist auch die Schwelle asymmetrisch. Eine Frage kostet einen Zug; ein Schreibvorgang auf das falsche Objekt ist oft irreversibel und erreicht jemanden, der nichts verlangt hat. Wo die Aktion schreibgeschützt ist oder auf Dateien beschränkt ist, die die Sitzung besitzt und die Versionskontrolle wiederherstellen kann, ist es in Ordnung, eine Lesart zu wählen und dies zu sagen. Wo es andere Personen oder gemeinsamen Zustand erreicht, ist es nicht in Ordnung.

Fehlermodus-Prüfung, vor dem Aufruf: Welche Objekte wird dieser Schreibvorgang berühren, und wo in der Anfrage wird jedes einzelne genannt? Wenn die ehrliche Antwort für eines davon "es war das wahrscheinliche" ist, dann ist das die Frage, die zu stellen ist.

Benachbart, bewusst getrennt: [R:kein-stilles-ausgeben] entscheidet für den Benutzer, was eine Aufgabe wert ist; dieses hier entscheidet für ihn, worum es bei einer Aufgabe geht.

Halte den Vertrauensanker einer Prüfung außerhalb der Reichweite der Partei, die sie prüft [R:anker-außerhalb-der-reichweite-der-geprüften-partei]

Jede Prüfung, die etwas gegen eine Partei schützt, vergleicht die Eingabe dieser Partei mit einem Anker: einem öffentlichen Schlüssel, einer Zulassungsliste, einer Berechtigung, einer Richtlinie, einem Hash-Chain-Head. Die Prüfung ist nur so stark wie die Position des Ankers. Wenn die geprüfte Partei den Anker beschreiben kann, verifiziert die Prüfung den Gegner mit den eigenen Daten des Gegners, und sie besteht für ihn genauso wie für dich.

Frage also, bevor du einer solchen Prüfung vertraust: Wer kann das Ding beschreiben, mit dem sie verglichen wird, und ist die geprüfte Partei darunter? Verfolge den Schreibzugriff über jeden Pfad, nicht nur über den, den die API anbietet. Eine Tabelle, für die die Oberfläche keinen Endpunkt hat, ist dennoch von jedem Prozess beschreibbar, der die Datei öffnen kann; eine Konfigurationsdatei ist von allem beschreibbar, das als derselbe Benutzer läuft; ein Wert, den ein Plugin in seinem eigenen Namensraum speichert, kann vom Plugin geändert werden. Wenn die geprüfte Partei den Anker über irgendeinen Pfad erreichen kann, ist die Garantie nicht gehalten, so korrekt die Kryptographie oder der Vergleich auch sein mag.

Platziere den Anker dort, wo die geprüfte Partei ihn nicht erreichen kann: in Hardware (ein vom TPM gehaltener Schlüssel, der vom Gerät gelesen wird), in einer separaten Vertrauensdomäne, in einer signierten oder Out-of-Band-Quelle oder in die Binärdatei kompiliert, die die geprüfte Partei nicht kontrolliert. Wo es noch keinen solchen Ort gibt, sage im Bedrohungsmodell, welche Parteien die Prüfung nicht aufhält, anstatt die Prüfung implizieren zu lassen, dass sie sie aufhält.

Das Indiz ist eine Garantie, die in der Form "X kann Y nicht tun, weil Z verifiziert wird" formuliert ist: Überprüfe, wo der Referenzwert von Z lebt, bevor du den Satz schreibst. Eine Behauptung der Unfälschbarkeit ist eine Behauptung über den Schreibzugriff auf den Anker, und sie ist falsch, wenn dieser Schreibzugriff nicht verfolgt wurde.

Dies ist das sicherheitsdesignerische Geschwister von [R:verdrahtetes-artefakt]: Diese Regel erwischt eine Prüfung, die Beweise akzeptiert, die alles produzieren kann; diese hier erwischt eine Prüfung, deren Referenzwert alles produzieren kann, worauf die Prüfung abzielt. Dieselbe Familie wie [R:garantie-braucht-einen-leser] und [R:prüfe-die-geerbte-behauptung]: eine formulierte Garantie ohne verfolgte Grundlage.

Fehlermodus-Prüfung: Kann die Partei, die diese Prüfung einschränkt, auf irgendeinem Pfad den Wert beschreiben, mit dem die Prüfung vergleicht? Wenn ja, oder wenn du es nicht verfolgt hast, ist die Prüfung noch keine Kontrolle.

Prüfe auf ein groß-/kleinschreibungsunterschiedliches Geschwister, bevor du eine Datei erstellst [R:groß-kleinschreibung-kollision]

Wird auch durch Hook:no-case-collision durchgesetzt.

Bevor du eine Datei erstellst, prüfe auf ein vorhandenes Geschwister, dessen Name sich nur durch Groß-/Kleinschreibung oder Unicode-Normalisierung unterscheidet. Wo ein Repository zwischen einem groß-/kleinschreibungsabhängigen Dateisystem und einem groß-/kleinschreibungsunabhängigen synchronisiert wird, sind die groß-/kleinschreibungsunabhängigen Semantiken die bindende Einschränkung: Zwei solche Namen sind eine Datei, und der Verlierer ist derjenige, der als zweites geschrieben wurde.

Führe in die vorhandene Datei zusammen, mit einer Abschnittsüberschrift, anstatt den kollidierenden Namen zu erstellen. Der Instinkt, eine ordentlich großgeschriebene neue Datei zu erstellen, ist der Fehler – die Konvention ist kein stilles Überschreiben auf der anderen Maschine wert.

Der Schaden ist von dem Ort, an dem die Arbeit erledigt wurde, unsichtbar. Auf dem authorisierenden Dateisystem existieren beide Dateien und alles sieht korrekt aus; die Kollision erscheint erst nach einer Synchronisation, als Inhalt, der ohne Diff und ohne Fehler, dem er zugeschrieben werden könnte, verschwunden ist.

Diese Regel ist in den Produktivbetrieb übergegangen: Ein Hook zur Schreibzeit blockiert die Kollision jetzt deterministisch, sodass die Anweisungsebene sie nicht mehr für diesen Pfad tragen muss. Sie gilt weiterhin für jeden Erstellungspfad, den der Hook nicht sieht – eine Shell-Umleitung, eine Git-Operation, ein anderes Tool – weshalb die Anleitung beibehalten und nicht zurückgezogen wird.

Prüfe eine geerbte Behauptung über die Welt, bevor du sie wiederholst [R:prüfe-die-geerbte-behauptung]

Ist 1 Mal(s) wieder aufgetreten, seit es geschrieben wurde; zuletzt am 26.10.2026.

Bevor du eine sachliche Behauptung eines Dokuments über den Live-Zustand wiederholst, frage den Zustand ab.

Ein Dokument kann dir zwei verschiedene Arten von Dingen sagen, und sie verdienen nicht dasselbe Vertrauen. Eine Behauptung über Absicht – warum ein Schwellenwert 18 ist, was abgelehnt wurde und warum, welche Invariante eine Datei existiert, um zu halten – ist nur in Prosa aufgezeichnet, und das Dokument ist die autoritative Quelle. Eine Behauptung über die Welt – ein Sensor fehlt, ein Dienst ist deaktiviert, ein Zähler ist 23, eine Fähigkeit wird nicht durchgesetzt – beschreibt etwas, das direkt beobachtet werden kann, und das Dokument ist eine zwischengespeicherte Lesung ohne Ablaufdatum.

Das Wiederholen der zweiten Art ohne Beobachtung ist, wie eine veraltete oder nie wahre Behauptung in einen frischen Bericht gewaschen wird. Es ist schlimmer als der ursprüngliche Fehler, weil die Behauptung jetzt mit dem heutigen Datum und der Autorität, gerade "geprüft" worden zu sein, ankommt, und weil der Bericht das Ding ist, auf das der Leser reagiert. Wer es geschrieben hat, könnte zum Zeitpunkt Recht gehabt haben, könnte geraten haben oder könnte es von woanders kopiert haben; nichts davon ist sichtbar, wenn du es liest, und eine Behauptung, die in vier Dokumente kopiert wurde, sieht viermal bestätigt aus, während sie auf einer einzigen unverifizierten Behauptung beruht.

Dies ist die Leserhälfte von [R:dokumentenaktualität]. Diese Regel sagt dem Schreiber, er solle das Dokument in derselben Änderung aktualisieren wie das Ding, das es beschreibt, und das wird manchmal fehlschlagen – also ist der Leser die letzte Position, an der der Fehler noch abgefangen werden kann. Es ist auch der Spiegel von [R:miss-die-behauptung-nicht-eine-teilmenge]: Dieser bewacht den Moment, in dem du im Begriff bist, eine aufgezeichnete Zahl zu überschreiben, dieser hier den Moment, in dem du im Begriff bist, sie zu wiederholen. Zwischen ihnen wird eine aufgezeichnete Zahl nie einfach ungeprüft in beide Richtungen weitergegeben.

Die Prüfung ist billig und sie ist begrenzt. Du leitest das Dokument nicht neu ab; du überprüfst stichprobenartig die spezifischen Behauptungen, die du mit deinem eigenen Namen versehen wirst, und nur die, die beobachtbaren Zustand nennen.

Fehlermodus-Prüfung: Ist dies eine Behauptung über die Welt, und kann ich die Welt beobachten? Wenn beides zutrifft, ist das Dokument eine Hypothese und dein Bericht braucht die Beobachtung, nicht das Zitat. Wenn du es nicht beobachten kannst, wiederhole es mit seiner Herkunft – "TODO.md zeichnet X auf, unverifiziert" – anstatt es flach zu behaupten.

Delegiere einen Fan-Out, sobald die Arbeit aufgezählt wurde [R:delegiere-einen-fan-out]

Compiler-gesteuerte Reparatur ist wirklich seriell, während du noch ableitest, was kaputt ist: Jede Änderung ändert den nächsten Fehler. Sie hört auf, seriell zu sein, in dem Moment, in dem ein Build, ein Gate oder ein Plan N unabhängige Folgemaßnahmen aufgezählt hat. Von da an hängen die Bearbeitungen nicht voneinander ab, und sie einzeln durchzugehen bringt nichts. Der Fan-Out-Punkt ist, nachdem die Liste existiert, nicht davor.

Dieselbe Form deckt eine Dokumentationssammlung ab, die einmal pro Release aktualisiert wird, eine Überprüfung, die mehrere Dateien gegen einen Vertrag liest, und Recherche, die mehrere unabhängige Quellen benötigt.

Wenn Delegierung deaktiviert ist, lege die Wahl vor – kündige nicht nur die Kosten an. Diese Regel wird routinemäßig außer Kraft gesetzt: Die Harness-Richtlinie einer Sitzung kann Delegierung vollständig verbieten, und diese Richtlinie gewinnt standardmäßig. Was sie nicht tut, ist, die Kosten verschwinden zu lassen, und eine Benachrichtigung, die ausgegeben wird, nachdem du dich bereits entschieden hast, ist eher eine Information als eine Entscheidung. Beim ersten echten Fan-Out gib die Gabelung in einer Zeile an – was würde delegiert, ungefähr wie viele serielle Roundtrips es ersetzt und was es einschaltet – fahre dann seriell fort, es sei denn, dir wird etwas anderes gesagt, ohne das Angebot zu wiederholen. Auf einen Einstellungsschalter zu zeigen, zählt nicht: Ein globaler Schalter, den jemand gehen und umlegen muss, ist ein Regimewechsel, keine Wahl über diese Aufgabe.

Fehlermodus-Prüfung: Hat schon etwas diese Arbeit für mich aufgelistet? Wenn ein Build, ein Gate oder ein Plan die Liste erstellt hat, ist der serielle Durchlauf eine Wahl, die du mit jemand anderem Budget triffst.

Geschwister, bewusst nicht zusammengeführt. [R:kein-stilles-ausgeben] ist die allgemeine Form – jeder Tausch der Zeit des Benutzers gegen sein Geld gegen Gründlichkeit. Diese Regel wird auf die Delegierungsinstanz beschränkt, sodass die beiden separate Metriken tragen: Zwei Regeln mit unterschiedlichen Oberflächen können von einer Überprüfung unterschieden werden, und jede trägt ihre eigenen Beweise, während eine breite Regel, die aus beiden Gründen auslöst, durch nichts falsifizierbar ist.

Ein Detektor schließt seine eigenen Definitionen von seinem Scan aus [R:detektor-schließt-eigene-definitionen-aus]

Teilweise durchgesetzt durch Hook:no-self-matching-pkill (pkill -f und pgrep -f in einem Bash- oder PowerShell-Befehlstring, bewertet durch Abgleich des Musters mit dem eigenen Text des Befehls); die ursprüngliche Hälfte der Regel – ein Scan über Dateien, die seiner eigenen Quelle, Kommentaren oder Doks entsprechen; ps | grep; ein Muster aus einer Variablen; ein Matcher innerhalb einer Skriptdatei anstelle eines Befehlstrings wird von dieser Anweisung allein gehalten.

Ist 1 Mal(s) wieder aufgetreten, seit es geschrieben wurde; zuletzt am 26.09.2026.

Jede Prüfung, deren Thema Text ist, den sie selbst enthalten muss – ein Linter, ein Secret-Scanner, ein Richtlinien-Grep, ein Regelsweep – passt konstruktionsbedingt auf sich selbst. Schließe die eigene Quelle, Kommentare und Docstrings des Detektors von seinem Scan aus, entferne Kommentare vor dem Abgleich und normalisiere Pfade zu Platzhaltern, sodass Dokumentation über ein Muster niemals als Instanz davon gelesen wird.

Der Grund ist nicht Ordnung. Eine immer-rote Prüfung wird stummgeschaltet, und eine stummgeschaltete Prüfung ist schlimmer als keine Prüfung, weil das System immer noch bewacht aussieht. Alarmmüdigkeit ist negativer Wert, nicht neutral: Sie verbraucht die Aufmerksamkeit, die ein echter Fund brauchen wird, und sie trainiert den Leser, genau die Ausgabe zu überspringen, die eines Tages wichtig sein wird.

Dies erstreckt sich über die eigene Datei des Detektors hinaus auf alles, was das Muster aus einem legitimen Grund zitiert. Ein Korrekturhinweis, der erklärt, dass ein schlechter String entfernt wurde, geschrieben mit dem schlechten String darin, wird zu einem dauerhaften falschen Positiv in genau dem Sweep, den er zu befriedigen geschrieben wurde – also beschreibe den String, reproduziere ihn nicht, und wo Reproduktion wirklich notwendig ist, platziere ihn irgendwo, das der Scan durch Regel und nicht durch Glück ausschließt.

Frage vor dem Ausliefern eines Scans: Erscheint diese Prüfung in ihrem eigenen Korpus, und wenn ja, wie sieht ihre Ausgabe auf einem sauberen Baum aus? Wenn die saubere-Baum-Ausgabe nicht leer ist, funktioniert die Prüfung noch nicht, so korrekt ihre Logik auch sein mag.

Die Prozesstabelle ist auch ein Korpus. pkill -f PAT, pgrep -f PAT und ps | grep PAT passen auf die vollständige Befehlszeile jedes Prozesses – einschließlich der Shell, die sie ausführt, deren argv PAT wörtlich enthält, wann immer der Befehl als Zeichenfolge reist: bash -c, bash -lc, wsl.exe -- bash -lc, ssh host '...' und jedes Agent-Tool, das einen Befehl durch eine Shell ausführt. Dort ist der Schaden nicht Alarmmüdigkeit, sondern eine Shell, die sich selbst tötet, oder eine Warteschleife, die ewig auf sich selbst wartet. Schreibe das Muster so, dass sein eigener Text nicht darauf passen kann – [r]elease/frame passt auf release/frame und nicht auf sich selbst – oder vergleiche einen genauen Prozessnamen mit pgrep -x, oder eine PID, die du aufgezeichnet hast, als du den Prozess gestartet hast. Die saubere-Baum-Frage wird: Bevor irgendetwas anderes läuft, was findet dieser Matcher? Wenn die Antwort nicht nichts ist, hat er sich selbst gefunden.

Wenn etwas früher funktioniert hat, teste zuerst, was sich seitdem geändert hat [R:diff-gegen-den-bekannt-guten-zustand]

Wenn etwas früher funktioniert hat, finde heraus, was sich seitdem geändert hat, und teste das zuerst.

Ein Regression hat einen bekannt guten Zustand hinter sich, und dieser Zustand ist die wertvollste Tatsache in der Diagnose: Alles, was sich zwischen diesem und jetzt nicht geändert hat, ist für dieses Symptom bereits entlastet. Das Einstellen der Teile, die gleich geblieben sind, verbraucht Mühe, wo die Beweise sagen, dass der Fehler nicht ist, und jeder plausible Dreh, der halb hilft, macht die Suche länger, weil es wie Fortschritt aussieht.

Bevor du also etwas anpasst, schreibe die Unterschiede zwischen der funktionierenden Konfiguration und der fehlschlagenden auf – Hardware, Einstellungen, Versionen, Controller, Personen, Wetter – und ordne sie danach, wie billig jeder neutralisiert werden kann. Führe dann das billigste Experiment durch, das den bekannt guten Zustand für einen Unterschied nach dem anderen wiederherstellt: Mache ihn rückgängig, umgehe ihn oder zwinge ihn zum alten Verhalten. Ein solches Experiment kann eine ganze Familie von Theorien ausscheiden lassen, an denen das Einstellen nur herumnagen würde.

Wenn der Besitzer einen bekannt guten Zustand freiwillig nennt ("es funktionierte mit dem alten Thermostat", "es war in Ordnung vor dem Upgrade"), behandle ihn als

…

[gekürzt für die Übersetzung]

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

george-andrikopoulos/domain-java

Engineering discipline for working in java. Covers: a speculated path deoptimises when the input changes; a view is not a copy; a wrapper type is not free here; close what you open; design for inheritance or forbid it; equality is one contract; exceptions name what failed; identity is not equality for boxes; no reference to internals escapes; null is not a value; publish safely or not at all; seal the alternatives; serializable is a second constructor

george-andrikopoulos/domain-low-latency

Engineering discipline for working in low-latency. Covers: attack the design in a second pass; a measurement matches the regime it reports; a queue without a bound has no overload behaviour; a structure keeps the regime it was proved under; allocated is not resident; answer the requirement at its layer; no allocation on the hot path; no coordinated omission; no false sharing on a hot line; no retry loop on a contended path; no stall inside a publication window; no syscall on a bounded path;...

george-andrikopoulos/domain-rust

Engineering discipline for working in rust. Covers: design types first; borrow in signatures; module visibility is deliberate; must use on consequential returns; newtype liberally; parse wide then range check; seal closed trait sets; typestate builder for required fields; typestate for protocols; verify the abstraction compiled away; async all the way; errors name what failed; justify every clone; no let underscore on a local; parse dont validate; private fields only; xplat fixtures; no...

Verwandte Skills