Sandboxes und Promotion
Richten Sie einen KI-Coding-Agenten sicher auf Ihre Produktionsdatenbank — erfasst, beobachtet, durch ein Gate promotet und umkehrbar.
Teil von Agent-Safe Change Control. Die
keon sandbox- undkeon ledger-Befehle sowie die hier beschriebene Konsolen-Sandboxes-Ansicht sind live — ein aktuelles keon ist erforderlich (cli-v0.1.46+).
Kisenon lässt Sie einem Coding-Agenten (Claude Code, Cursor, Ihrem eigenen) eine Datenbank übergeben, die er frei ändern kann — ohne die Produktion zu gefährden. Eine Sandbox ist ein Pro-Lauf-Fork Ihres Branches mit einer eingeschränkten Anmeldeinformation, einem Live-Aktionsprotokoll und einem serverseitigen Promote-Schritt. Diese Seite deckt die vollständige Schleife ab: erfassen → arbeiten → promoten → landen (umkehrbar) → beweisen.
Warum es sicher ist
Zwei Garantien, beide deterministisch — kein LLM sitzt im Vertrauenspfad:
- Der Agent kann die Produktion nicht berühren. Er verbindet sich mit einer eingeschränkten,
nicht-superuser Anmeldeinformation zu einem Fork. Er hält niemals eine Anmeldeinformation, die
mainschreiben kann. Die Promotion läuft serverseitig und wendet nur Änderungen an, die bereits in der Sandbox bestanden haben. - Sie sehen genau, was er tat. Jede Anweisung wird zugeordnet und an eine schreibgeschützte Konsole gestreamt — das echte SQL, keine Zusammenfassung.
Die Schleife
keon sandbox run \
--migrate "alembic upgrade head" \
--verify "pytest tests/db"
# → green/red verdict + schema diff + a sandbox you can inspect
keon sandbox promote <id> # cp applies the validated changes to mainDer Agent behält die Kontrolle über die Schleife; die Grenze ist es, die sie sicher macht.
Dauerhafte Erfassung
Das Aktionsprotokoll ist die Wahrheitsquelle für Promote, also muss es vollständig sein.
Jede Sandbox trägt einen capture_state — ok oder lost. Wird die Erfassung jemals
kompromittiert, kippt der Zustand auf lost und bleibt dort: eine verlorene Sandbox
kann nicht promoten (409 sandbox_capture_lost) und wendet niemals still eine
partielle Änderung an. Es gibt keine Auto-Heilung — verwerfen Sie sie und führen Sie die Arbeit in einer
frischen Sandbox erneut aus. keon sandbox get / list zeigen die Erfassungsgesundheit.
Promote: self-serve oder von Menschen genehmigt
Jedes Projekt wählt einen promote_mode:
| Modus | Wer committet zu main |
|---|---|
self (Standard) | Der Agent promotet, sobald seine Prüfungen bestehen — innerhalb seiner Grenzen. |
human | Der Agent schlägt vor; ein Owner/Admin prüft das Diff + Aktionsprotokoll und klickt Approve. |
In einem human-Projekt landet keon sandbox promote nichts: Die Sandbox wird
in awaiting_approval geparkt, und die Antwort enthält next_step: "approve" sowie
einen approve_hint, der den Befehl nennt und wer ihn ausführen darf. Der Exit-Code
verhindert, dass ein Skript das Parken als gelandete Änderung liest:
| Exit | Bedeutung |
|---|---|
0 | Auf main gelandet. |
1 | Fehlgeschlagen — nichts ist gelandet. |
3 | In awaiting_approval geparkt — noch nichts gelandet. stderr enthält einen sandbox_awaiting_approval-Umschlag; ein Owner/Admin muss keon sandbox approve <id> ausführen. |
Ein Verdict (keon sandbox verdict <id> green|red) steuert nur ein künftiges Promote
oder Approve und wird deshalb nur angenommen, solange die Sandbox active oder
awaiting_approval ist. In jedem anderen Status gibt es
409 sandbox_verdict_not_accepted zurück.
Explosionsradius-Trockenlauf
Bevor Sie promoten, können Sie die Plattform bitten, zu messen, was das Promote tun würde — echte Lock-Level, echte Lock-Halte-Dauern, echte Zeilenzahlen — statt aus dem Anweisungstext zu raten:
keon sandbox dry-run <id>Die Plattform spielt den exakten Anweisungssatz der Sandbox gegen zwei kurzlebige
Wegwerf-Forks des Elternteils ab — einen am aktuellen HEAD des Elternteils (wo Locks,
Dauern und Zeilen gemessen werden) und einen am Fork-Punkt der Sandbox (die
Divergenz-Baseline) — und zerstört dann beide. Es berührt niemals main, und der
Agent erhält niemals eine Anmeldeinformation zu einem der Forks. Der Trockenlauf ist beratend:
er erzeugt den Bericht, er blockiert niemals ein Promote.
Er beantwortet auch die Frage, die ein statisches Diff nicht kann: hat sich die Realität unter dem
Agenten bewegt? Jede Anweisung, die einen Fehler wirft oder eine andere Anzahl von Zeilen betrifft, an
Eltern-HEAD als am Fork-Punkt, wird als Konflikt aufgezeigt — z. B.
ein UPDATE ... WHERE id = 2, dessen Zielzeile auf main nach dem
Fork gelöscht wurde.
Der abgeschlossene Bericht trägt:
| Feld | Bedeutung |
|---|---|
statements[].lock_level | Stärkster Lock, den die Anweisung in der Promote-Transaktion neu nimmt (z. B. AccessExclusiveLock für ein Tabellen-Rewrite). |
statements[].lock_wait_est_ms | Gemessene Ausführungszeit auf dem Head-Fork — die Untergrenze, wie lange der Lock auf main gehalten wird. |
statements[].rows_measured | Auf dem Head-Fork betroffene Zeilen (0 für DDL). |
statements[].divergence | {kind:"error"} oder {kind:"row_count"}, wenn sich die Anweisung an HEAD anders verhält als zur Fork-Zeit. |
rollup.conflicts | Jede Divergenz, plus ein baseline_unavailable-Marker, falls die Baseline-Bahn nicht laufen konnte — sodass ein Gate auf „keine Konflikte" bei einer degradierten Messung geschlossen fehlschlägt. |
rollup.max_lock_level / rollup.duration_ms_total | Aggregierte Lock-Stärke und gesamte Replay-Zeit. |
capture_advanced / parent_head_lsn | Veraltungssignale: der Bericht ist ein Snapshot, und ein erneuter Lauf ist günstig. |
Die Endpunkte sind POST /v1/sandboxes/{id}/dry-run (startet einen asynchronen Lauf, 202)
und GET /v1/sandboxes/{id}/dry-run (der neueste Datensatz). Ein fehlgeschlagener Trockenlauf
trägt einen maschinenlesbaren error_code
(capture_fence_failed, incomplete_capture, fork_failed,
compute_unreachable, replay_infra_failed, timeout). Das Blast radius-
Panel auf der Sandbox-Detailseite rendert denselben Bericht in der Konsole.
Ein Promote rückgängig machen
Ein Promote ist umkehrbar. Bevor cp die validierten Anweisungen auf
main anwendet, verankert es den exakten Vor-Promote-Zustand des Eltern-Branches (eine LSN). Ein
Befehl rollt den Branch zurück zu diesem Anker:
keon sandbox undo <id> # restore the parent branch to its pre-promote stateDer Connection-String des Elternteils ist unverändert — Clients verbinden sich erneut mit demselben
Endpunkt. Undo ist eine Owner/Admin-Aktion; Anmeldeinformationen mit Agenten-Fähigkeit werden abgelehnt
(403 scope_insufficient), weil ein Undo verwirft, was auch immer auf dem
Branch nach dem Anker gelandet ist.
keon sandbox get <id> trägt ein undo-Objekt — undoable, restored_lsn,
undone_at und einen blocked_reason, wenn es nicht laufen kann
(superseded_by_later_promote, already_undone). Undo zielt nur auf das jüngste
Promote und lehnt mit 409 ab (sandbox_not_promoted,
undo_anchor_missing, undo_anchor_invalidated), sobald der Anker weg ist.
Es bleibt verfügbar, solange der Anker gültig ist und innerhalb Ihrer Speicher-
Aufbewahrung — es gibt keinen separaten Countdown.
Undo stellt per LSN wieder her: es rollt alles nach dem Anker zurück, nicht nur die promotete Änderung — einschließlich direkter Writes und späterer Agenten-Sitzungen auf diesem Branch. Siehe Common pitfalls.
Emittierte Migrationen
Jedes gelandete Promote emittiert eine deterministische up/down-SQL-Migration — kein LLM, generiert aus der erfassten Schemaänderung und rundlauf-validiert auf einem Wegwerf-Fork, bevor es angeboten wird. Rufen Sie es ab:
keon sandbox migration <id> --out ./migrations --waitDas Artefakt trägt das up- und down-SQL (files[], jede mit einer role),
coverage, down_fidelity, etwaige uncovered_seqs, ein validation-Ergebnis
und eine sha256. Das Artefakt ist nur Schema — es enthält niemals
Datenschreibvorgänge —, und coverage gibt an, wie viel des Promotes es abbildet:
coverage | Bedeutung |
|---|---|
full | Jede erfasste Änderung ist im Artefakt enthalten. |
partial | Ein Teil der erfassten DDL wird vom Schema-Diff nicht abgedeckt; er wird wörtlich angehängt und in uncovered_seqs aufgeführt. |
schema_full | Jede Schemaänderung ist abgedeckt, aber das Promote hat auch DML (INSERT / UPDATE / DELETE) ausgeführt, die das Artefakt nicht enthält. data_omitted: true und omitted_data_seqs benennen diese Schreibvorgänge. |
down_fidelity ist full (down macht up vollständig rückgängig), structural (down
stellt die Struktur wieder her, nicht die Daten — wird statt full gemeldet, sobald
Daten ausgelassen wurden oder up destruktiv war), partial (für nicht abgedeckte
Anweisungen gibt es kein generiertes down) oder none. Um die Datenschreibvorgänge
eines Promotes rückgängig zu machen, verwenden Sie keon sandbox undo, nicht das
down-Skript.
Terminale Zustände sind validated,
validation_failed, emission_failed und no_schema_changes. v1 emittiert
sql; GET /v1/sandboxes/{id}/migration (und .../migration/files/{role})
liefern es. Die Emission läuft, nachdem das Promote landet, und blockiert oder kehrt es niemals
um — ein reines Daten-Promote meldet einfach no_schema_changes.
Signiertes Ledger
Jedes Promote und Undo hängt einen signierten, hash-verketteten Datensatz an ein Pro-Projekt-Ledger an — eine offline-verifizierbare Attestierung dessen, was sich geändert hat. Die Verifizierung braucht kein Netzwerk und vertraut Kisenon nicht:
keon ledger list --project <id> # the chain (reports chain_ok)
keon ledger export <id> --out att.json # one attestation document
keon ledger verify att.json # offline; exit 0 iff valid
keon ledger keys --save # pin the signing keys you trustkeon ledger verify prüft die Ed25519-Signaturen und die Hash-Kette und
meldet präzise Fehler (signature_invalid, statement_chain_mismatch,
seq_gap, key_untrusted, chain_broken, …); Vertrauen ist dreiwertig
(trusted / untrusted / unverified). Routen: GET /v1/sandboxes/{id}/ledger, GET /v1/projects/{projectId}/ledger, GET /v1/ledger/keys.
Hat cp keinen signierenden Schlüssel konfiguriert, gelingen Promotes weiterhin, sind aber unsigniert (
ledger_enabled: false) — das Signieren ist nicht bedingungslos.
Was eine Sandbox nicht ist
- Keine Code-Sandbox — sie schränkt Ihre Datenbank ein, nicht den Prozess des Agenten.
- Kein LLM-Richter — Erfassung, Replay und Prüfung sind byte-deterministisch.
Probieren Sie es aus
Probieren Sie es aus auf kisenon.com und sehen Sie den quickstart.
Agentensichere Änderungskontrolle (ASCC)
Das System, mit dem Sie einen KI-Agenten sicher auf eine echte Datenbank richten können — begrenzt, zugeordnet, geprüft, umkehrbar.
Leitplanken
Budgets, Policy-Stufen, eingeschränkte Autorität, Risiko-Lint und Explosionsradius-Prüfungen — was einen Agenten stoppt, bevor er Ihnen schadet.