Communitygithub.com

operator-approval-loop

Vertrag für Operator-Freigaben mit internen Hinweisen zu agentenerstellten ausgehenden Nachrichten, gehashten Entwürfen, epochenbasierten Entscheidungen, dauerhaften Zustellungsansprüchen und -belegen sowie einer Basisprüfung vor dem Entwurf. Verwenden Sie dies, wenn ein Agent Nachrichten an externe Gegenüber verfasst und ein menschlicher Operator jede Sendung genehmigen, ablehnen oder steuern muss, bevor sie rausgeht.

Was ist operator-approval-loop?

Dieses Skill definiert einen Freigabeworkflow für KI-Agenten, die Nachrichten an externe Parteien senden. Es erzwingt eine menschliche Genehmigung vor dem Versand und erstellt eine unveränderliche Prüfspur aus Entwurfs-Hashes, Operator-Entscheidungen und Zustellungsbelegen. Der Workflow unterteilt sich in die Schritte: Entwurf einreichen (mit SHA-256-Hash), Operator-Genehmigung oder -Ablehnung, sowie Zustellung mit einmaligen Claims, die konkurrierende Zustellungen verhindern. Optional kann eine zeitgesteuerte automatische Genehmigung aktiviert werden. Das Skill ist plattformunabhängig und wird über eine Referenzimplementierung mit SQLite und Python getestet. Es eignet sich besonders für Use Cases, bei denen Agenten mit Kunden, Lieferanten oder Partnern in geteilten Kanälen kommunizieren und eine vollständige Audit-Trail erforderlich ist.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/operator-approval-loop

In Ihrer bevorzugten KI fragen

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

Dokumentation

Operator-Genehmigungsschleife

Ein Agent, der mit externen Gegenübern kommuniziert, sollte niemals allein nach eigenem Ermessen senden und den Operator intern informieren. Dieses Skill definiert den Vertrag: Jeder ausgehende Entwurf wird als Verpflichtung abgelegt, ein Operator entscheidet über den genauen Text, und ein Zustellungsjournal beweist, was rausgegangen ist.

Wann verwenden

  • Ein Agent verfasst Antworten an Kunden, Lieferanten, Investoren oder Partner in einem gemeinsamen Kanal, per E-Mail oder Chat, und ein Mensch muss vor dem Senden genehmigen.
  • Sie benötigen eine Prüfspur, die jede gesendete Nachricht mit dem genauen Entwurfstext, dem genehmigenden Operator und dem Entscheidungszeitpunkt verknüpft.
  • Sie haben erlebt, dass eine veraltete Genehmigung einen neu geschriebenen Entwurf freigegeben hat, oder zwei Mitarbeiter dieselbe genehmigte Nachricht zweimal zugestellt haben.
  • Entwürfe fragen Gegenüber immer wieder nach Tatsachen, die das Journal bereits enthält.

Funktionsweise

Objekte

ObjektBedeutung
VerpflichtungEine Sache, die wir einem Gegenüber schulden. Status wechselt entworfen, dann genehmigt oder abgelehnt, dann gesendet. Trägt Richtung, Gegenüber, Kanal und einen updated_at-Zeitstempel.
EntwurfNebenreihe mit dem genauen Entwurfstext, einem SHA-256 davon, Ursprungskoordinaten (Plattform, Kanal, Thread, Benutzer) und Priorität (P0 bis P3). Einer pro Verpflichtung, wird bei erneuter Einreichung ersetzt.
EntscheidungGenehmigung oder Ablehnung eines Operators, aufgezeichnet mit der Operator-ID, einer Nonce und dem Entwurfszeitstempel, gegen den sie getroffen wurde.
Genehmigungs-SnapshotUnveränderlicher Text, Hash, Zeitstempel und Ziel, aufgezeichnet vom bereits autorisierten Entscheidungsschreiber. Fehlende Snapshots können keine Zustellung gewähren.
AnspruchDauerhafte Reservierung mit einem zufälligen Token und Zustand; maximal ein aktiver Anspruch pro Verpflichtung.
ZustellungJournalzeile, die einen Sendevorgang oder Hinweis für ein (Verpflichtung, Entscheidung)-Paar belegt.

Das Referenzschema befindet sich in references/approval-ledger.sql.

Einreichen eines Entwurfs

  1. Eingaben bereinigen. Steuerzeichen entfernen, Leerzeichen in einzeiligen Feldern zusammenziehen und Längenbegrenzungen durchsetzen (Entwurf, Zusammenfassung, Kontext, Gegenüber). Leere oder überdimensionierte Felder werden abgelehnt, nicht stillschweigend abgeschnitten.
  2. Basisprüfung ausführen (siehe unten). Sie kann die Einreichung ablehnen.
  3. Entwurfstext mit SHA-256 hashen. Das Hash-Präfix geht in die Zusammenfassung, damit das Genehmigungspanel zeigt, welchen Text es genehmigt.
  4. Upsert. Wenn bereits eine offene entworfenene Verpflichtung für dasselbe (Gegenüber, Kanal) existiert, den Entwurf-Seitenwagen ersetzen und das updated_at der Verpflichtung fortschreiben. Diese Fortschreibung ist die Epochenrotation: Jede Entscheidung, die mit der alten Epoche verknüpft ist, kann den neuen Text nicht mehr freigeben. Andernfalls eine neue Verpflichtung mit Status entworfen einfügen.
  5. Die Einreichungsquittung nur an ein konfiguriertes, verifiziertes internes Betriebsziel weiterleiten. Wenn der Ursprung dieses interne Ziel ist, dort quittieren. Niemals still: Interne Berichterstattung, kein automatisches externes Antworten. Entwurfs-Hashes, Genehmigungsstatus, Operator-Identität und Workflow-Metadaten aus für Gegenüber sichtbaren Kanälen heraushalten. Unbekannte oder nicht klassifizierte Ursprünge bleiben still; eine Direktnachricht ist nicht automatisch intern.

Wenn ein verifiziertes internes Ziel nicht verfügbar ist, das Einreichungsergebnis im internen Tool-Ergebnis oder der Operator-Oberfläche behalten. Niemals auf ein externes oder unbekanntes Ziel zurückfallen. Ein Tool-Ergebnis, das Außenstehenden zugänglich ist, ist keine interne Oberfläche.

Das Einreichen eines Entwurfs autorisiert keine externe Antwort. Jede richtliniengemäße klärende Frage oder neutrale Antwort ist eine separate Ausgangsentscheidung, unterliegt den bestehenden Einschränkungen (Erwähnung, Kanal, nur Entwurf, eingefroren und niemals) in der Disziplin des Gegenüber-Kanals. Sie darf keine internen Genehmigungs-Metadaten preisgeben.

Basisprüfung

Vor der Einreichung eines Entwurfs die aktuelle Basislinie für das Gegenüber abfragen (ein zeitliches Journal, Vertragsspeicher oder CRM):

  • Unterzeichneter oder zugestellter Vertrag in den Aufzeichnungen: Die Einreichung mit Nachweis und Empfehlung ablehnen. Ein Gegenüber nach Spezifikationen zu fragen, nachdem ein Vertrag unterzeichnet wurde, ist genau der Fehler, den diese Prüfung verhindern soll.
  • Operator-Überschreibung: force_despite_signed_contract lässt die Einreichung durch und fügt [BASELINE_OVERRIDE_SIGNED_CONTRACT] in den Entwurfskontext ein.
  • Prüfdienst nicht erreichbar: Die Einreichung wird fortgesetzt und der Kontext mit [BASELINE_CHECK_UNAVAILABLE] gestempelt. Das Panel sieht, dass die Sicherung ausgeschaltet war. Fehler deaktivieren die Prüfung niemals stillschweigend.
  • Wenn Fakten verfügbar sind, die aktuellsten als [BASELINE FACTS: ...]-Digest an den Kontext anhängen, damit der Entwurf mit aktueller Wahrheit ankommt.

Entscheiden

Das Genehmigungspanel listet Verpflichtungen mit Status entworfen und Richtung wir_schulden_ihnen auf. Genehmigen oder Ablehnen schreibt eine Entscheidungszeile, die die Entwurfsepoche (draft_updated_ts) trägt, und wechselt den Verpflichtungsstatus in derselben Transaktion. Eine Entscheidung, deren Epoche nicht mit dem aktuellen updated_at übereinstimmt, ist veraltet und darf nichts freigeben.

Für eine bereits autorisierte Genehmigungsentscheidung fügt dieselbe Transaktion eine unveränderliche obligation_approval_snapshots-Zeile ein: Entscheidungs- und Verpflichtungs-IDs, aktuelle Entwurfsepoche, genauer Text und SHA-256, Plattform/Kanal/Thread und Art draft_sent. Der Entscheidungsschreiber muss vor dem Schreiben die Autorisierung herstellen; die Referenz authentifiziert niemals einen Operator oder erzeugt eine Entscheidung. Automatische Genehmigungsrichtlinien werden von der Referenz weder aktiviert noch erweitert. Legacy-Entscheidungen ohne Snapshots erfordern explizite Abstimmung oder eine neue Genehmigung; niemals die Erlaubnis aus dem aktuellen veränderlichen Entwurf zurückdatieren.

Zustellen

Die SQLite-Referenz ist references/approval_claims.py. Sie gewährt Sendeerlaubnis, ruft aber niemals den Transport auf. Eine vorhandene lokale Referenzdatenbank verwenden, die aus dem SQL-Fixture initialisiert wurde; das Modul wendet keine Schema- oder Produktionsmigrationen an. Nur ein vertrauenswürdiger Entscheidungsschreiber darf Genehmigungsdatensätze füllen. Alle Schreiber müssen Fremdschlüssel und rekursive Trigger aktivieren und die Schema-Sicherungen einhalten; administrative Datenbankmanipulation liegt außerhalb dieses Modells.

  1. Gebundene genehmigte Entwürfe ermitteln. Ermittlung ist keine Erlaubnis. claim() öffnet eine eigene BEGIN IMMEDIATE-Transaktion, validiert die aktuelle genehmigte Epoche, den genauen Text, den berechneten SHA-256 und das vollständige Ziel gegen den Snapshot und fügt einen eindeutigen Anspruch ein, bevor es seinen Token zurückgibt. Ein Konflikt stoppt den Arbeiter vor dem Transport. Abgeschlossene Quittungen können nicht erneut beansprucht werden.
  2. begin_dispatch() validiert die Bindung erneut und ändert atomar claimed in dispatching mit dem Token. Nur der gewinnende Aufrufer erhält nach dem Commit den genauen draft_text und das Ziel. Niemals Text neu generieren, einen veränderlichen Seitenwagen für den Transport erneut lesen oder die Nutzlast für einen weiteren Versuch wiederverwenden. Ein verschachtelter Aufrufer-Transaktion wird abgelehnt; die Erlaubnis darf nicht von einem späteren Commit des Aufrufers abhängen. Keine Datenbanktransaktion bleibt über den Transport hinweg offen.
  3. Ein bestätigtes erfolgreiches Ergebnis geht an complete(), das atomar die Zustellungskoordinate aufzeichnet, den Anspruch als zugestellt markiert und die Verpflichtung auf gesendet setzt. Identische Vervollständigung ist ein No-Op; widersprüchliche Koordinaten schlagen fehl. Der UNIQUE-Schlüssel der Quittung dedupliziert Datensätze, nicht vorherige externe Effekte.
  4. Ausnahmen, Zeitüberschreitungen, Arbeitertod nach begin-dispatch oder fehlgeschlagene Quittungspersistenz hinterlassen einen blockierten Versuch. mark_unknown() zeichnet Unsicherheit auf. Unbekannte Ansprüche verfallen nie, werden nie erneut geöffnet, automatisch wiederholt oder erlauben einer anderen Entscheidung für diese Verpflichtung, sie zu umgehen. Ein vertrauenswürdiger Aufrufer kann reconcile() mit bestätigter erfolgreicher Koordinate und Nachweis verwenden; das Modul überprüft diesen Nachweis nicht. Eine fehlende Quittung ist kein Beweis für Nichtzustellung.

Die Garantie ist ein automatischer Zustellungsversuch pro genehmigter Entscheidung, nicht genau-einmalige externe Zustellung. Ein Absturz nach begin-dispatch, aber vor dem Transport, kann null Sendungen und einen gehaltenen Anspruch hinterlassen. Das Freigeben eines unbekannten Ergebnisses für einen neuen Versuch würde das Abschirmen des ursprünglichen Ausführers und die Überprüfung der Anbieter-Semantik erfordern; diese Referenz stellt bewusst keine solche Wiederholungsoperation bereit.

AnspruchszustandErlaubte nächste Zustände
claimeddispatching oder vor Dispatch abgebrochen
dispatchingdelivered oder unknown
unknowndelivered nur durch vertrauenswürdige Abgleichung
delivered, cancelledTerminal; Entscheidungsschlüssel kann nicht wiederverwendet werden

Während ein Anspruch aktiv ist, frieren Datenbanksicherungen Schreibvorgänge auf Verpflichtung, Entwurf und Entscheidung ein, einschließlich Ersetzungen. Snapshots und Ansprüche können nicht gelöscht werden. Abbrechen einer beanspruchten Operation mit ihrem Token vor erneuter Einreichung; das veraltete Token gewährt dann nichts. Nach Beginn des Dispatches neue Bearbeitungen oder Widerruf für die Abstimmung zurückhalten. Dies serialisiert Änderungen, anstatt vorzugeben, eine laufende Operation zurückzurufen.

Abgelehnte Entscheidungen und Legacy-Zeilen ohne Entwurfs-Seitenwagen/Snapshots gelangen nie in diesen externen Entwurfs-Sendepfad. Melden Sie sie in der internen Operator-Oberfläche zur manuellen Bearbeitung. Interne Quittungsfußzeilen bleiben intern: genehmigt von <operator> · Quittung <decision_id> · Entwurf sha256 <prefix>. Niemals bereits genehmigten externen Text ändern, um Workflow-Metadaten anzuhängen.

Fokussierte lokale Validierung verwendet temporäre Datenbanken, separate Verbindungen und einen simulierten Versuchszähler, keinen Anbieter oder eine echte Nachricht: python3 -m unittest discover -s tests/skills -p 'test_approval_delivery_claims.py'. Die Tests erfordern Python 3.11+ mit SQLite-Serialisierungsunterstützung; die Referenz verwendet nur die Standardbibliothek. Die bestehenden Desk-Pattern-Vertragsprüfungen bleiben eine separate Kompatibilitätsprüfung.

Zeitbegrenzte automatische Genehmigung (optional)

Ein Entwurf kann auto_send_after (Epochensekunden) tragen. Ein Durchlauf genehmigt Entwürfe, deren Frist ohne Entscheidung abgelaufen ist, und zeichnet Operator auto-ttl auf. Die Zustellung erfolgt dann über den normalen Pfad. Operatoraktionen gewinnen immer: Eine Entscheidung wechselt den Status, bevor der Durchlauf ihn sieht, und eine erneute Einreichung rotiert die Epoche und verschiebt oder löscht die Frist. Der Durchlauf überprüft Status und Epoche innerhalb der Schreibe-Transaktion, sodass ein Wettlauf als No-Op aufgelöst wird. Entwürfe ohne Frist bleiben für immer hart gesperrt.

Signalverknüpfung

Ein Entwurf kann die eingehende Verpflichtung benennen, die er beantwortet (signal_obligation_id). Dies ist der einzige wahrheitsgemäße Link für die Latenzmessung (eingehendes Signal zu entworfeuer Antwort) und ermöglicht dem SLA-Scan, diesen eingehenden Eintrag als beantwortet zu behandeln. Die Einreichung ablehnen, wenn die referenzierte Zeile nicht existiert.

Beispiele

Entwurf einreichen

file_request(
  draft="Vielen Dank, wir können den Slot bis Freitag halten. Welches Startdatum passt?",
  counterparty="acme-lieferant",
  context="Antwort auf Lieferfensterfrage",
  origin_platform="slack", origin_channel="#acme-geteilt",
  origin_thread="1712345678.000100", priority="P1",
  signal_obligation_id=412)
-> {obligation_id: 431, draft_sha256: "9f2c...", refiled: false}

Das konfigurierte, verifizierte interne Betriebsziel sieht: Entwurf zur Genehmigung eingereicht (P1, sha 9f2c8a1b). Warte auf Operator. Der für das Gegenüber sichtbare Ursprungskanal erhält keine Einreichungsmitteilung. Wenn kein verifiziertes internes Ziel verfügbar ist, bleibt die Quittung im internen Tool-Ergebnis oder der Operator-Oberfläche, ohne externen Fallback.

Erneute Einreichung nach Lenkung

Der Operator bittet um einen kürzeren Entwurf. Die erneute Einreichung für dasselbe (Gegenüber, Kanal) gibt refiled: true zurück, der Seitenwaggentext und -hash ändern sich, und updated_at rückt vor. Eine Genehmigung, die auf der alten Panel-Zeile geklickt wird, trägt die alte Epoche und wird ignoriert.

Zurückweisung durch Basisprüfung

DeskApprovalError: Basisprüfung hat diesen Entwurf abgelehnt: Das Journal zeigt einen unterzeichneten Vertrag für 'acme-lieferant'. Nachweis: Rahmenvereinbarung ausgeführt am 2026-08-14. Empfehlung: nicht fragen. Erneut einreichen mit
force_despite_signed_contract=true, wenn dies wirklich ein neuer Thread ist.

Zustellungsfußzeile in einem internen Kanal

Bestätigt für Freitag, Startdatum 2026-09-08.
genehmigt von operator-a · Quittung 118 · Entwurf sha256 9f2c8a1b2d3e4f50

Invarianten zum Testen

  • Einreichungsquittungen gehen nur an konfigurierte, verifizierte interne Betriebe; der Ursprung erhält eine nur, wenn er dieses verifizierte interne Ziel ist.
  • Ein unbekannter Ursprung bleibt still. Ein nicht verfügbares internes Ziel verwendet das interne Tool-Ergebnis oder die Operator-Oberfläche, ohne externen Fallback.
  • Zweimalige Einreichung für dasselbe (Gegenüber, Kanal) ergibt eine Verpflichtung, zwei Epochen.
  • Eine Entscheidung mit einer veralteten Epoche führt nie zu einer Zustellungszeile.
  • Zwei gleichzeitige Anspruchsteller ergeben eine Sendeerlaubnis; Verlierer versuchen niemals den Transport.
  • Unbekannte Ergebnisse und fehlgeschlagene Quittungspersistenz aktivieren niemals einen automatischen Wiederholungsversuch.
  • Erfolgreicher Abschluss zeichnet die Quittung und den Sendestatus in einer Transaktion auf.
  • Eine geänderte Epoche, Text, Hash oder Ziel kann keinen Anspruch erwerben oder beginnen.
  • Aktive Ansprüche blockieren erneute Einreichung; nur ein vor dem Dispatch erfolgter Abbruch kann diese Sperre aufheben.
  • Nicht verfügbare Prüfung stempelt den Marker; Prüfung bei unterzeichnetem Vertrag verweigert ohne Force.
  • Auto-ttl feuert niemals gegen Text, den der Operator seitdem erneut eingereicht hat.

Individual skills in this repo

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

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Verwandte Skills