Welche Agent Pull Request Gates müssen einen Merge sperren?
Sieben messbare Agent Pull Request Gates stoppen unsicheren Code: Tests, CodeQL, Abhängigkeiten, Secrets, Autorisierung, Migration und Rollback.

Ein Agent kann einen sauberen Diff, eine überzeugende Beschreibung und Code liefern, der ein kurzes Review besteht, und die Anwendung trotzdem angreifbar oder nicht wiederherstellbar machen. Die Merge-Entscheidung muss deshalb auf messbaren Nachweisen aus dem Repository beruhen, nicht auf dem selbstsicheren Ton des Agenten oder der Größe des Patches.
Ich setze sieben sperrende Gates ein: Tests, CodeQL, Dependency Review, Secret Scanning, Autorisierungsprüfungen, eine Migrationsprobe und die Verifikation des Rollbacks. Jedes beantwortet eine andere Fehlerfrage. Eine grüne Testsuite beweist nicht, dass ein neues Paket sicher ist. Ein sauberer statischer Befund sagt nichts darüber aus, ob eine Datenbankmigration die meistgenutzte Tabelle sperrt.
Diese Gates gelten gleichermaßen für Änderungen von Menschen und Agenten. Agenten verändern Menge, Geschwindigkeit und Form der Fehler, rechtfertigen aber keine eigene schwächere Spur. Wenn eine Änderung nicht dieselben Nachweise wie jeder andere Pull Request liefern kann, darf sie nicht gemergt werden.
Ein Gate muss Nachweise statt Ratschläge liefern
Ein Merge Gate braucht ein reproduzierbares Pass- oder Fail-Ergebnis für genau den Commit, der in den geschützten Branch gelangt. Ein Kommentar mit der Bitte, eine Abhängigkeit zu prüfen, ist ein Ratschlag. Ein Required Check mit Paket, Version, Advisory und Schwellwert ist ein Nachweis.
Diese Unterscheidung zählt, weil viele Sicherheitsfunktionen standardmäßig erst nach dem relevanten Entscheidungspunkt berichten. Ein Scanner kann einen Alert, eine E-Mail oder ein Issue erzeugen, während der Merge-Button verfügbar bleibt. Das Team nennt Scanning dann aktiviert, obwohl es nichts sperrt. Prüfen Sie bei jedem Gate vier Eigenschaften:
- Es läuft auf dem aktuellen Head Commit des Pull Requests.
- Der Branch-Schutz verlangt sein benanntes Ergebnis.
- Ein übersprungener, abgebrochener oder in ein Timeout gelaufener Job gilt nicht als bestanden.
- Das Ergebnis enthält genug Details, um die Entscheidung zu reproduzieren.
Legen Sie die Policy im Repository ab. Ein kleines Manifest lässt sich leichter prüfen als eine Sammlung von Einstellungen, die nur Administratoren kennen:
merge_gates:
tests: required
codeql: required
dependency_review: required
secret_scan: required
authorization: required
migration_rehearsal: required_when_changed
rollback_verification: required
required_when_changed ist kein Schlupfloch. Das Gate erkennt zuerst relevante Dateien und führt dann die Probe aus oder meldet ausdrücklich not applicable. Path-Filter dürfen einen Required Check nicht dauerhaft offen lassen. Der Agent darf seine eigene riskante Änderung auch nicht von der Prüfung ausnehmen.
Begrenzen Sie Workflow-Berechtigungen auf das Minimum des jeweiligen Jobs. Pull-Request-Code ist eine nicht vertrauenswürdige Eingabe, selbst wenn der Branch zur eigenen Organisation gehört. Ein Gate, das dem geprüften Code ein Schreib-Token oder Produktions-Secret zugänglich macht, kann ein größeres Problem erzeugen als das, das es finden sollte.
Schützen Sie die Identität des Checks genauso wie seine Logik. Branch-Regeln verlangen oft einen Statusnamen. Zwei Workflows mit demselben Namen können dazu führen, dass der schwächere Job die Regel erfüllt. Geben Sie dem Policy-Job einen eindeutigen Namen, beschränken Sie Änderungen an seiner Datei und verlangen Sie ein Review durch die zuständigen Owner. Erzeugt eine Merge Queue einen neuen Merge Commit, müssen die Gates auf diesem Commit erneut laufen oder ihre Ergebnisse an die Queue-Revision gebunden sein. Der Nachweis für den gestrigen Head gilt nicht für den heutigen Merge.
Behandeln Sie die Gate-Konfiguration als sensiblen Code. Ein Pull Request, der einen Schwellwert ändert, einen Pfad entfernt, ein Query Pack herabstuft oder eine Ausnahme ergänzt, verändert die Aussage aller späteren grünen Ergebnisse. Zeigen Sie Policy-Diffs deutlich und verlangen Sie einen Maintainer, der die betroffene Kontrolle versteht. Ein Agent darf eine solche Änderung vorschlagen, aber nicht leichter passieren, weil er den eigenen Prüfer bearbeitet.
Tests sperren beobachtbare Regressionen
Das Test-Gate muss jede Änderung sperren, die spezifiziertes Verhalten auf den unterstützten Runtime- und Datenbankversionen bricht. Es muss dieselben Build-Eingaben verwenden wie der spätere Merge Commit, einschließlich gesperrter Abhängigkeiten, generierter Dateien, Feature Flags und Schema-Zustand.
Agenten können die nächstliegende Assertion sehr gut erfüllen. Ein Fallback macht vielleicht einen Test grün und beschädigt gleichzeitig Fehlerbehandlung, Pagination, Nebenläufigkeit oder einen benachbarten API-Vertrag. Verlangen Sie bei einer Verhaltensänderung passende Tests, messen Sie Qualität aber nicht an neuen Testzeilen. Prüfen Sie, ob der Test fehlschlägt, wenn die Implementierung entfernt oder zurückgesetzt wird.
Ein brauchbares Test-Gate hat getrennt benannte Ebenen:
- Unit Tests für lokale Logik und Randfälle.
- Integrationstests für Datenbank, Queue, Cache und externe Serviceverträge.
- Contract Tests für öffentliche Request- und Response-Formen.
- Einen kleinen Smoke Test des gebauten Artefakts.
Beheben Sie flakey Tests, statt sie automatisch bis zum Erfolg zu wiederholen. Ein Retry darf Diagnosematerial sammeln, das Endergebnis muss aber den ersten Fehler sichtbar machen. Sonst kann der Agent Code mergen, von dem nur bewiesen ist, dass er gelegentlich funktioniert.
Der Smoke Test sollte das Artefakt starten, einen Health Endpoint und einen sinnvollen Schreibpfad ausführen und es sauber beenden. Wer nur Quellcode testet und die gepackte Anwendung nie startet, übersieht fehlende Dateien, schlechte Umgebungsdefaults, kaputte Migrationen und Startabstürze. Für einen Webdienst kann das Ergebnis kompakt aussehen:
{"commit":"abc123","build":"pass","startup_ms":842,"health":200,"write_read_cycle":"pass"}
Verwenden Sie keinen universellen Coverage-Prozentsatz als primäres Gate. Coverage kann ungetestete Änderungen zeigen, aber hohe Werte lassen sich mit schwachen Assertions erreichen. Sperren Sie nach den erforderlichen Suiten und dem geänderten Verhalten. Coverage-Bewegungen sind zusätzliche Review-Nachweise.
Schützen Sie die Tests vor der Implementierung, die sie beurteilen. Wenn ein Pull Request eine Regel ändert und zugleich die Assertions auf das neue Ergebnis umschreibt, kann die Suite bestehen, während sich der Vertrag unbemerkt verschiebt. Ein Reviewer muss geänderte Tests mit der öffentlichen API, dem Issue oder der Abnahmebedingung vergleichen. Für Parser, Validatoren, Abrechnung und Zugriffskontrollen helfen Mutation Tests oder bewusst falsche Eingaben. Entscheidend ist, ob die Suite eine plausible fehlerhafte Implementierung ablehnt.
Bewahren Sie bei einem Fehler Testartefakte auf. Dazu gehören der fehlerauslösende Seed, das genaue Datenbank-Image, von Secrets bereinigte Service-Logs und der Reproduktionsbefehl. Ein Status ohne Reproduktionsdaten zwingt den nächsten Menschen oder Agenten zum Raten. Begrenzen Sie die Aufbewahrung nach den Datenregeln des Repositorys und laden Sie niemals einen Produktions-Snapshot hoch, nur weil sich der Fehler damit leichter nachstellen lässt.
CodeQL sperrt bekannte Codepfade zu Schwachstellen
Das CodeQL-Gate muss neue Findings mit hoher Sicherheit in den Sprachen und generierten Artefakten sperren, die CodeQL tatsächlich analysiert. Ein sauberes Ergebnis darf nicht als Beweis für die Sicherheit der gesamten Anwendung gelten.
GitHub beschreibt CodeQL als System, das Code in eine abfragbare Datenbank kompiliert und Queries darüber ausführt. Dadurch kann es Daten durch den Code verfolgen, statt nur verdächtigen Text zu suchen. Die Aussage ist trotzdem durch Sprachunterstützung, erfolgreichen Build, Query-Auswahl und den analysierten Code begrenzt. Schließt der Datenbank-Build einen Service unbemerkt aus, deckt das grüne Ergebnis weniger ab als angenommen.
Verwenden Sie einen Workflow mit expliziten Sprachen und fester Query-Policy:
name: codeql
on: [pull_request]
permissions:
contents: read
security-events: write
jobs:
analyze:
strategy:
matrix:
language: [javascript-typescript, go]
steps:
- uses: actions/checkout@v4
- uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
queries: security-extended
- uses: github/codeql-action/autobuild@v3
- uses: github/codeql-action/analyze@v3
Pinnen Sie fremde Actions in einem echten Repository an geprüfte Commit-Digests. Tags halten das Beispiel lesbar, aber ein veränderlicher Tag erweitert die Vertrauensgrenze eines erforderlichen Security-Jobs.
Legen Sie vor dem ersten Alert fest, was sperrt. Normalerweise sperre ich neue Findings am vereinbarten Severity- und Precision-Schwellwert, während vorhandene Schulden in einer Baseline sichtbar bleiben. Werden am ersten Tag alle historischen Ergebnisse gesperrt, folgt oft eine Massenverwerfung. Dauerhaftes Ignorieren erzeugt eine blinde Stelle. Die Baseline braucht Owner und Termine.
Prüfen Sie die analysierte Dateimenge, wenn sich Services, Sprachen oder Build-Befehle ändern. Ein neuer Mobile Client, generierter Resolver oder separates Backend kann einen weiteren Analyzer oder Build-Schritt brauchen. „CodeQL bestanden“ ist nur aussagekräftig, wenn Reviewer sagen können, was CodeQL untersucht hat.
Trennen Sie Analysefehler von sauberen Analysen. Kann Autobuild ein Paket nicht kompilieren, muss der Job einen Infrastruktur- oder Konfigurationsfehler melden, nicht null Findings. Speichern Sie das Erstellungslog der Datenbank und die Zahl analysierter Quelldateien je Sprache. Vergleichen Sie sie mit dem Basis-Branch und markieren Sie unerklärliche starke Rückgänge. So fällt auf, wenn ein Build-Edit das verwundbare Modul ausschließt und der Check nur deshalb schneller und grün wird.
Prüfen Sie Dismissals wie Policy-Änderungen. Ein False Positive braucht eine konkrete Erklärung zum Codepfad und zur Query. Suppression-Kommentare müssen eng, zugeordnet und im Diff sichtbar sein. Ein repositoryweiter Ausschluss generierter Dateien kann passen. Prüfen Sie vorher, ob dort keine von Menschen gepflegten Templates oder Generator-Eingaben liegen.
Dependency Review stoppt Risiken vor der Installation
Dependency Review muss einen Pull Request sperren, wenn sein Dependency-Diff ein Paket oder eine Version einführt, die eine ausdrückliche Policy verletzt. Dazu können bekannte Advisory-Schweregrade, verbotene Lizenzen, unerwartete Paketquellen und direkte Abhängigkeiten ohne Owner gehören.
Dieses Gate unterscheidet sich von einem Vulnerability Alert für das Repository. Ein Alert sagt, dass eine anfällige Abhängigkeit im Branch liegt. Dependency Review fragt, ob dieser Pull Request den Dependency Graph verschlechtert. GitHubs Dependency Review vergleicht Manifeste und Lockfiles im Pull Request, wodurch die Entscheidung rechtzeitig und zuordenbar wird.
Verlangen Sie konsistente Lockfiles. Ändert ein Agent package.json, aber nicht das Lockfile, oder bearbeitet er das Lockfile ohne passende Manifeständerung, muss der Job fehlschlagen. Installationsbefehle, die in CI neue Versionen auflösen, sind nicht deterministisch und können einen anderen Graph testen als den, den Reviewer gesehen haben.
Eine kompakte Policy kann so aussehen:
dependency_policy:
fail_on_severity: high
deny_licenses:
- AGPL-3.0
allow_sources:
- registry.npmjs.org
- proxy.golang.org
require_owner_for_direct_additions: true
Die genaue Lizenzliste ist eine rechtliche und produktbezogene Entscheidung und sollte nicht blind kopiert werden. Wichtig ist die Erklärung im Repository und die Ausgabe des auslösenden Pakets.
Genehmigen Sie ein Paket nicht automatisch, weil sein Name einer vorgeschlagenen Bibliothek ähnelt. Agenten können Paketnamen erfinden, verlassene Forks wählen oder für einen kleinen Helper einen großen Client hinzufügen. Der Review-Output muss neue direkte und transitive Pakete, Registry, aufgelöste Version, Lizenz und Advisory-Status zeigen. Dann kann ein Reviewer fragen, ob vorhandener Code oder eine kleinere Abhängigkeit genügt.
Schlägt die Ermittlung des Dependency-Diffs fehl, bleibt das Gate geschlossen. Ein nicht erreichbarer Advisory Feed kann das Anhalten des Merges rechtfertigen, nicht ein grünes Ergebnis. Für Notfälle darf es einen dokumentierten Override durch einen benannten Maintainer geben, dessen Grund am Commit bleibt.
Prüfen Sie das Installationsverhalten in einem isolierten Job, dessen Netzwerkzugriff auf genehmigte Registries begrenzt ist. Lifecycle Scripts und Build Plugins führen während der Installation Code aus. Ein Paket kann daher riskant sein, auch wenn die Anwendung es nie importiert. Erfassen Sie neue Install Scripts, native Binärdateien und fremde Registries. Der Job darf keine Publishing-Zugangsdaten, Cloud-Tokens oder einen beschreibbaren Cache mit vertrauenswürdigen Builds teilen.
Vendored Code und Container-Images gehören in dieselbe Entscheidung, auch wenn die normale Manifestprüfung sie nicht sieht. Vergleichen Sie Image-Digests, Base-Image-Namen, Git-Submodule und eingecheckte Archive. Release-Eingaben brauchen unveränderliche Digests. Ein Tag wie latest verhindert eine spätere Reproduktion, weil sich seine Bytes ohne neuen Diff ändern können.
Secret Scanning muss Diff und Historie prüfen
Secret Scanning muss sperren, wenn ein Pull Request ein Credential-Muster oder ein verifiziertes aktives Secret einführt, auch in Test-Fixtures, gelöschten Dateien, generierten Bundles oder früheren Pull-Request-Commits.
Push Protection und Pull-Request-Scanning lösen verwandte, aber verschiedene Probleme. Push Protection kann ein erkanntes Secret vor dem Remote stoppen. Ein Pull-Request-Gate prüft bereits übertragene Inhalte und kann Contributors oder Token-Typen abdecken, die vorher nicht erkannt wurden. Ein Alert ohne Branch-Schutz sperrt keinen Merge.
Scannen Sie die vollständige Commit-Spanne gegen den Basis-Branch, nicht nur das endgültige Dateisystem. Ein Agent kann in einem Commit ein Token hinzufügen und im nächsten entfernen. Im Git-Verlauf bleibt es erhalten und kann bereits Logs oder Caches erreicht haben. Behandeln Sie es als offengelegt, widerrufen oder rotieren Sie es, bereinigen Sie die vorgeschlagene Historie und führen Sie den Check erneut aus.
Verwenden Sie synthetische Fixtures, die sich nicht authentifizieren können. Ein Fixture sollte klar als Testwert erkennbar sein und ein lokal definiertes Muster erfüllen, statt einen echten Cloud-Key nachzuahmen. Breite Allowlists sind gefährlich, weil Fehler und Angreifer das ignorierte Verzeichnis irgendwann finden. Ausnahmen müssen exakt, geprüft und nahe an der Detektorkonfiguration liegen.
Kombinieren Sie Pattern-Detektoren mit Entropieprüfungen und, falls der Provider es sicher unterstützt, einer Credential-Verifikation. Pattern Matching hat weniger Netzwerk- und Offenlegungsrisiken, verpasst aber eigene Token-Formate. Eine Verifikation reduziert Unsicherheit, sendet jedoch Teile eines möglichen Secrets an einen anderen Service. Sie darf nie eine vom Pull Request gelieferte, nicht vertrauenswürdige Gegenstelle verwenden. Dokumentieren Sie, welche Detektoren prüfen, welche lokal bleiben und welche Daten CI verlassen.
Scannen Sie gängige Codierungen und generierte Ausgaben, ohne jede zufällige Zeichenfolge als Credential zu behandeln. Base64, URL-Encoding und minifizierte Bundles können ein Secret verbergen, das in einem Quellschritt offen stand. Setzen Sie den Schwellwert mit geprüften Fixtures und behandeln Sie Detektor-Updates als Policy-Änderungen. Ein lauter Scanner trainiert Dismissals, ein stiller erzeugt falsche Sicherheit.
Die Gate-Ausgabe braucht den Ort, aber nicht den Wert:
{"result":"fail","detector":"generic-api-token","commit":"abc123","path":"config/dev.env","line":7,"fingerprint":"sha256:8f2c..."}
Geben Sie niemals den vollständigen Treffer in CI-Logs oder Kommentaren aus. Maskierung kann zu spät kommen, weil Logsysteme, Benachrichtigungen und Jobartefakte die Ausgabe kopieren.
Secret Scanning ersetzt kein Review der Repository-Berechtigungen. Ein Workflow kann ein Produktions-Secret lesen, ohne es in den Diff zu schreiben. Ein Agent kann einen Deployment-Job ändern und es abziehen. Halten Sie Secrets von Pull-Request-Jobs fern, beschränken Sie Workflow-Rechte und verlangen Sie menschliches Review für CI-Definitionen.
Autorisierungschecks halten verbotene Aktionen verboten
Das Autorisierungs-Gate muss beweisen, dass jede geschützte Operation den falschen Akteur abweist und den vorgesehenen Akteur an der Servicegrenze zulässt. Login-Tests allein testen keine Autorisierung.
Teams vermischen häufig Authentifizierung, Autorisierung und Sichtbarkeit in der Oberfläche. Authentifizierung stellt fest, wer die Anfrage sendet. Autorisierung entscheidet, ob diese Identität diese Aktion auf diesem Objekt ausführen darf. Das Verstecken eines Admin-Buttons in React ändert keine Entscheidung in einer Go-API. Akzeptiert das Backend die Anfrage, bleibt die Anwendung offen.
Erstellen Sie eine Berechtigungsmatrix für geänderte Endpoints und Geschäftsaktionen. Sie muss klein genug für ein Review sein und Ownership- sowie Tenant-Grenzen enthalten:
read_private_project:
anonymous: deny
member: deny
other_tenant: deny
owner: allow
admin: allow
update_project:
anonymous: deny
other_tenant: deny
owner: allow
Generieren Sie Tests aus der Matrix oder codieren Sie entsprechende tabellengesteuerte Fälle in der Service-Sprache. Jeder Deny-Fall muss den echten Handler mit realistischen IDs aufrufen. Mocks, die die Autorisierungs-Middleware ersetzen, können die Route bestätigen und dabei genau die geprüfte Kontrolle überspringen.
Testen Sie Zugriff auf Objektebene, nicht nur Rollen. Zwei Benutzer können beide member sein und zu verschiedenen Organisationen gehören. Ändern Sie Ressourcen- und Tenant-ID getrennt, um unsichere direkte Objektreferenzen zu finden. Prüfen Sie außerdem Bulk Endpoints, Exporte, Hintergrundjobs und GraphQL Resolver, die Kontrollen gewöhnlicher REST-Handler oft umgehen.
Lassen Sie das Gate scheitern, wenn eine neue geschützte Route keine Policy-Zuordnung hat. Damit wird fehlende Autorisierung vom Bauchgefühl zum messbaren Defekt. Der Serverstandard muss deny sein. Eine ausdrückliche Allow-Regel lässt sich leichter prüfen als verstreuter Code, der nur bekannte schlechte Fälle abweist.
Agenten kopieren oft einen benachbarten Handler, erhalten seinen Happy Path und verlieren die Ownership-Prüfung. Die Matrix macht diese Auslassung sichtbar und gibt Reviewern einen stabilen Vertrag, wenn Rollen oder Tenant-Regeln später wechseln.
Testen Sie Autorisierung nach der Normalisierung von Eingaben. Groß- und Kleinschreibung, alternative ID-Formate, doppelte Query-Parameter und verschachtelte Objektreferenzen können gleichwertige Anfragen durch verschiedene Codepfade senden. Testen Sie den direkten Endpoint sowie Batch- und Importwege zur selben Aktion. Nimmt ein Background Worker den finalen Schreibvorgang vor, geben Sie Akteur- und Tenant-Kontext an den Job weiter, statt ihn als allmächtigen Benutzer zu behandeln.
Protokollieren Sie die erwartete Entscheidung und die auslösende Policy-Regel, aber keine privaten Objektdaten. Ein brauchbarer Fehler nennt Akteursklasse, Aktion, Objektklasse und erwarteten Status. Er gibt weder Access Token noch vollständigen Datensatz aus. So kann ein Reviewer ein kaputtes Fixture von einer echten Privilegänderung unterscheiden.
Die Migrationsprobe misst Sperren und Umkehrbarkeit
Das Migrations-Gate muss jede vorgeschlagene Schemaänderung auf einer produktionsähnlichen Kopie anwenden, Kompatibilitätsproben ausführen und Dauer, Locks und Rollback-Verhalten vor dem Merge erfassen. Erfolg auf einer leeren Testdatenbank beweist wenig.
Verwenden Sie einen bereinigten Snapshot oder generierte Daten mit ähnlichen Tabellengrößen, Indizes, Constraints und Verteilungen. Exakte Produktionsdaten gehören nicht in Pull-Request-Infrastruktur. Ziel ist realistischer Betriebsdruck ohne persönliche oder vertrauliche Datensätze.
Proben Sie die echte Deployment-Reihenfolge. Bleiben alte App-Instanzen während der Migration aktiv, testen Sie alten Code mit neuem Schema und neuen Code mit dem Übergangsschema. Eine nullable Spalte ist meist kompatibel. Das Umbenennen einer Spalte in einem Schritt kann jede noch aktive alte Instanz brechen.
Speichern Sie maschinenlesbare Nachweise:
{"migration":"20260727_add_project_state","apply_ms":18420,"max_lock_ms":310,"old_app_probe":"pass","new_app_probe":"pass","down":"pass"}
Setzen Sie Schwellwerte je Datenbank und Tabellenklasse. Ein Lock von 300 Millisekunden ist für eine Tabelle harmlos und für eine andere störend. Reviewer müssen das gewählte Limit neben dem Messwert und der verwendeten Datenbankversion sehen.
Prüfen Sie bei PostgreSQL Operationen, die eine Tabelle neu schreiben, einen Constraint validieren oder beim Indexbau Schreibvorgänge blockieren. Bevorzugen Sie Expand-and-Contract: neue Form ergänzen, Code für beide Formen deployen, kontrolliert backfillen, Reads umstellen und die alte Form später entfernen. Ein weiterer Pull Request kostet weniger als Improvisation während eines Ausfalls.
Nicht jede Migration kann eine sichere down-Operation haben. Eine gelöschte Spalte verliert Daten, eine Transformation lässt sich eventuell nicht eindeutig umkehren. Verlangen Sie dann eine getestete Vorwärtsreparatur oder einen Backup-Restore-Punkt. Eine irreversible Migration nur wegen einer Down-Datei rollbackfähig zu nennen, ist unehrlich.
Testen Sie Retries und Teilfehler. Ein Deployment kann nach dem Erstellen eines Indexes und vor dem Eintrag in die Migrationshistorie stoppen. Der nächste Versuch darf weder Daten beschädigen noch dauerhaft scheitern. Unterbrechen Sie die Probe an einer kontrollierten Grenze, führen Sie sie erneut aus und vergleichen Sie Schema und Ledger. Ein langer Backfill muss an einem gespeicherten Cursor fortsetzen, und dieselbe Charge darf bei doppelter Ausführung keine Daten duplizieren oder löschen.
Messen Sie neben der Dauer auch Platten- und Replikationseffekte. Ein Table Rewrite kann temporären Speicher verbrauchen, Write Ahead Logs vergrößern und Replikas verzögern. Das Gate braucht keine perfekte Produktionsprognose, sollte diese Werte aber am Probedatensatz erfassen und mit Limits des Datenbank-Owners vergleichen. Sonst kann eine lokal schnelle Migration das Produktionsvolume füllen.
Rollback-Verifikation muss den Recovery-Pfad ausführen
Das Rollback-Gate muss den Kandidaten in einer isolierten Umgebung deployen, repräsentativen Zustand erzeugen, die unterstützte Rollback-Methode auslösen und beweisen, dass die frühere Version korrekt lesen und schreiben kann. Ein aufgeschriebener Plan ist keine Verifikation.
Trennen Sie Application Rollback und Data Rollback. Das Zurücklenken von Traffic auf eine frühere Binärdatei dauert vielleicht Sekunden, während ein destruktives Schema oder eine Datentransformation nicht umkehrbar ist. Das Gate muss beides berichten. Kann die alte App nicht mit dem neuen Schema laufen, markieren Sie den Kandidaten als nicht umkehrbar und verlangen Sie einen gestuften Deployment-Plan.
Eine praktische Reihenfolge:
- Aktuellen Main Commit deployen und repräsentative Datensätze anlegen.
- Auf das Pull-Request-Artefakt aktualisieren und geänderte Pfade ausführen.
- Im aktualisierten Zustand neue Datensätze erzeugen.
- Vorheriges Artefakt oder Snapshot mit dem dokumentierten Control wiederherstellen.
- Read-, Write-, Queue- und Hintergrundjob-Probes ausführen.
Der Check soll Artefakt- und Snapshot-IDs, Zeitpunkte und Probe-Ergebnisse behalten, aber keine Zugangsdaten oder kopierten Kundendaten. Die Recovery-Zeit ist ein Nachweis für das eigene Betriebsziel und kein allgemeines Versprechen.
Snapshots helfen nur, wenn jemand beweist, dass sie alles Nötige enthalten. Dateien, Object Storage, Queue-Zustand, Schemaänderungen und externe Nebenwirkungen können außerhalb eines Server-Snapshots liegen. Nennen Sie diese Grenzen im Ergebnis. Eine bereits gesendete Zahlung, E-Mail oder ein Webhook lässt sich nicht durch einen Datenbank-Restore zurückholen.
Machen Sie die Rollback-Probe stärker als einen Health Check. Lesen Sie einen Datensatz von vor und einen von nach dem Upgrade, aktualisieren Sie beide bei bestehender Kompatibilität und verarbeiten Sie je einen Queue-Job beider App-Versionen. Vergleichen Sie sichtbare Ausgabe, nicht nur Statuscodes. Ein Server, der 200 liefert und dabei ein neues Feld verliert oder einen Enum falsch liest, ist nicht wiederhergestellt.
Testen Sie das Control, das die Rufbereitschaft verwendet. Wenn der Produktions-Rollback ein Artefakt auswählt, einen Snapshot wiederherstellt oder Traffic umschaltet, muss die Probe dieselbe Oberfläche und denselben Berechtigungspfad nutzen. Ein privates Skript auf dem Laptop eines Engineers ist kein Betriebsmittel. Der Nachweis muss zeigen, dass die vorgesehene Operator-Rolle ohne dauerhafte Admin-Rechte wiederherstellen kann.
Koder.ai unterstützt Source Export, Deployment und Hosting, Snapshots sowie Rollback. Dort gebaute Anwendungen können diese konkreten Artefakte in das Gate einbinden, statt Recovery nur im Pull Request zu beschreiben. Auf jeder Plattform gilt dasselbe: Recovery-Control ausführen und die wiederhergestellte Anwendung prüfen.
Ein Required Check muss alle sieben zusammenfassen
Die endgültige Merge-Entscheidung sollte einen stabilen Policy-Check verlangen, der alle sieben Ergebnisse für den genauen Head Commit prüft. Jobnamen ändern sich, Matrix-Jobs vervielfachen sich, optionale Pfade überspringen Arbeit. Ein kleiner Aggregator verhindert, dass der Branch-Schutz von der Policy abweicht.
Jedes Gate sollte ein signiertes oder von der Plattform attestiertes Ergebnis mit Commit, Policy-Version, Ausgang und Nachweisort liefern. Der Aggregator weist fehlende, veraltete, neutrale und abgebrochene Ergebnisse zurück. Er darf Erfolg nie aus einem Job ableiten, der nichts gemeldet hat.
{
"commit": "abc123",
"policy": "merge-gates-v3",
"results": {
"tests": "pass",
"codeql": "pass",
"dependency_review": "pass",
"secret_scan": "pass",
"authorization": "pass",
"migration_rehearsal": "not_applicable",
"rollback_verification": "pass"
},
"decision": "allow"
}
Definieren Sie für Notfälle einen engen Override-Pfad. Er verlangt einen benannten Maintainer, eine zweite Freigabe, eine Begründung, ein Ablaufdatum und ein Follow-up-Issue. Der Agent darf seine eigene Ausnahme weder beantragen noch genehmigen. Melden Sie Overrides zusammen mit normalen Gate-Ergebnissen, damit sie nach dem Vorfall sichtbar bleiben.
Diese Checks kosten bei manchen Pull Requests Minuten und bei Migrationen deutlich mehr. Das ist vertretbar, wenn konkrete Nachweise entstehen. Führen Sie günstige Gates zuerst aus, brechen Sie überholte Commits ab, cachen Sie vertrauenswürdige Build-Eingaben und reservieren Sie vollständige Umgebungsproben für relevante Pfade. Schwächen Sie kein Gate, nur damit das Dashboard schneller grün wird.
Machen Sie zuerst den aktuellen Zustand sichtbar. Schreiben Sie alle sieben Namen in eine Policy-Datei, verbinden Sie jeden mit einem erforderlichen Ergebnis und zwingen Sie übersprungene Arbeit zu einer Erklärung. Der erste Agent Pull Request, der diesen Datensatz nicht liefern kann, hat eine Lücke im Delivery-System gefunden, bevor sie die Produktion erreicht.
FAQ
Sollten Agent Pull Requests strengere Regeln als menschliche Änderungen haben?
Verwenden Sie für beide dieselben sperrenden Nachweise. Mehr automatische Checks sind wegen der Geschwindigkeit von Agenten sinnvoll, aber ein menschlicher Diff kann dasselbe Secret, denselben Autorisierungsfehler oder dieselbe unsichere Migration einführen.
Darf ein menschlicher Reviewer ein fehlgeschlagenes Merge Gate überstimmen?
Ja, aber nur über eine enge, protokollierte Ausnahme mit zwei Verantwortlichen, Begründung und Ablaufdatum. Der Agent, der die Änderung erzeugt hat, darf die eigene Ausnahme nie genehmigen.
Bedeutet ein bestandener CodeQL-Check, dass der Pull Request sicher ist?
Nein. Er bedeutet, dass die gewählten Queries im erfolgreich analysierten Code kein sperrendes Ergebnis gefunden haben. Abhängigkeiten, Laufzeitautorisierung, Secrets, Konfiguration und Recovery brauchen eigene Nachweise.
Was passiert, wenn ein erforderlicher Scanner nicht verfügbar ist?
Der Check muss geschlossen fehlschlagen oder blockiert bleiben. Bei einem Notfall verwenden Sie den dokumentierten Override, statt ein unbekanntes Ergebnis in einen Pass zu verwandeln.
Muss Secret Scanning gelöschte Commits untersuchen?
Es sollte die vollständige Commit-Spanne des Pull Requests prüfen. Ein hinzugefügtes und später gelöschtes Secret bleibt im Verlauf und muss vor Annahme der bereinigten Änderung rotiert werden.
Wie testet man Autorisierung in einem Pull Request?
Rufen Sie echte Service-Handler mit einer Matrix aus Identitäten, Rollen, Tenants, Objekten und Aktionen auf. Nehmen Sie Deny-Fälle und Ownership-Wechsel auf, denn Login und versteckte UI-Controls beweisen keine Serverautorisierung.
Braucht jede Datenbankmigration ein Down-Skript?
Nein. Manche destruktiven Änderungen lassen sich nicht ehrlich umkehren. Verlangen Sie stattdessen eine getestete Vorwärtsreparatur oder Backup-Wiederherstellung und kennzeichnen Sie die Änderung als nicht umkehrbar.
Was unterscheidet Rollback-Planung von Rollback-Verifikation?
Planung beschreibt die vorgesehenen Recovery-Schritte. Die Verifikation führt sie am Kandidaten und repräsentativem Zustand aus und prüft, ob die frühere Version korrekt lesen und schreiben kann.
Wie verhindern Teams, dass sieben Gates jeden Pull Request bremsen?
Führen Sie günstige Checks zuerst aus, brechen Sie überholte Runs ab, cachen Sie vertrauenswürdige Eingaben und proben Sie Migrationen nur bei relevanten Änderungen. Jedes Gate liefert ausdrücklich pass oder not applicable.
Welches Ergebnis sollte der Branch-Schutz verlangen?
Verlangen Sie ein stabiles Policy-Ergebnis, das alle sieben Gates für den genauen Head Commit bündelt. Fehlende, alte, übersprungene, abgebrochene oder neutrale Ergebnisse müssen zurückgewiesen werden.