operator-approval-loop
Makes your agent manage message sending with human approval. It ensures important messages are reviewed before being sent.
What it does
This system ensures important messages drafted by an AI agent to others are reviewed and approved by a human before being sent. It keeps a record of everything sent and who approved it.
When to use it
- ✓When an AI agent writes replies to customers or partners.
- ✓When you need an exact record of who approved each message.
- ✓When you want to prevent incorrect or duplicate messages from being sent.
Example of what to ask your AI
“Please review and approve this message for the client regarding their order status.”
Want more? Open the sections below.
How to use
The easiest way: copy the message below and paste it into Claude, ChatGPT, Cursor or any AI. It reads the skill and follows the instructions.
Skill link
Ready-to-paste message
How it works
When a message is created, it's saved as a draft and flagged for review. A human reviews the draft, approving or rejecting it. If approved, the system logs who approved it and when, ensuring the exact approved message is sent.
Installation
Easiest way: copy the skill link and paste it into Claude, ChatGPT or Cursor asking it to follow the instructions.
In the terminal (Claude Code, Codex, Cursor), in your project folder:
npx skills add affaan-m/ECC --skill operator-approval-loopOr download just the file:
curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/skills/operator-approval-loop/SKILL.md -o SKILL.mdTechnical content (original SKILL.md)
Original text by the author, straight from GitHub.
Operator Approval Loop
An agent that talks to external counterparties should never send on its own judgment and should keep the operator informed internally. This skill defines the contract: every outbound draft is filed as an obligation, an operator decides on the exact text, and a delivery ledger proves what went out.
When to Use
- An agent drafts replies to customers, suppliers, investors, or partners in a shared channel, email, or chat, and a human must approve before send.
- You need an audit trail that links each sent message to the exact draft text, the operator who approved it, and the decision time.
- You have seen a stale approval release a rewritten draft, or two workers deliver the same approved message twice.
- Drafts keep re-asking counterparties for facts the ledger already holds.
How It Works
Objects
| Object | Meaning |
|---|---|
| Obligation | One thing we owe a counterparty. Status moves drafted, then approved or rejected, then sent. Carries direction, counterparty, channel, and an updated_at epoch. |
| Draft | Sidecar row holding the exact draft text, a sha256 of that text, origin coordinates (platform, channel, thread, user), and priority (P0 to P3). One per obligation, replaced on re-file. |
| Decision | An operator's approve or reject, recorded with the operator id, a nonce, and the draft epoch it was made against. |
| Approval snapshot | Immutable text, hash, epoch and destination recorded by the already-authorized decision writer. Missing snapshots cannot grant dispatch. |
| Claim | Durable reservation with a random token and state; at most one active claim per obligation. |
| Delivery | Ledger row proving one send or notice for one (obligation, decision) pair. |
The reference schema is in references/approval-ledger.sql.
Filing a draft
- Clean inputs. Strip control characters, collapse whitespace in single-line fields, and enforce length caps (draft, summary, context, counterparty). Empty or oversized fields are refused, not truncated silently.
- Run the baseline gate (below). It may refuse the filing.
- Hash the draft text with sha256. The hash prefix goes into the summary so the approval panel shows which text it is approving.
- Upsert. If an open drafted obligation already exists for the same
(counterparty, channel), replace the draft sidecar and advance the
obligation's
updated_at. That advance is the epoch rotation: any decision keyed to the old epoch can no longer release the new text. Otherwise insert a new obligation with statusdrafted. - Route the filing receipt only to a configured, verified internal ops destination. If the origin is that internal destination, acknowledge there. Never-silent means internal reporting, not an automatic external reply. Keep draft hashes, approval status, operator identity and workflow metadata out of counterparty-visible channels. Unknown or unclassified origins stay quiet; a direct message is not automatically internal.
If a verified internal destination is unavailable, retain the filing result in the internal tool result or operator surface. Never fall back to an external or unknown origin. A tool result exposed to outsiders is not an internal surface.
Filing a draft does not authorize an external response. Any policy-permitted clarifying question or neutral response is a separate outbound decision, subject to the existing mention, channel, draft-only, frozen and never constraints in counterparty-channel-discipline. It must not disclose internal approval metadata.
Baseline gate
Before any draft is filed, query the current baseline for the counterparty (a temporal ledger, contract store, or CRM):
- Signed or delivered contract on record: refuse the filing with the evidence and a recommendation. Asking a counterparty about specs after signing is the exact failure this gate exists to stop.
- Operator override:
force_despite_signed_contractlets the filing through and stamps[BASELINE_OVERRIDE_SIGNED_CONTRACT]into the draft context. - Gate service unreachable: the filing proceeds and the context is stamped
[BASELINE_CHECK_UNAVAILABLE]. The panel sees that the guard was off. Failures never silently disable the gate. - When facts are available, attach the freshest few to the context as a
[BASELINE FACTS: ...]digest so the draft lands with current truth.
Deciding
…
FAQ
What happens if the message draft changes after it's approved?
If the draft changes after approval, it needs to be reviewed and approved again. This ensures the final sent message is the one the human actually agreed to.
How does the system prevent the same message from being sent twice?
The system keeps a record of all sent and approved messages. Before sending, it checks if an identical message has already been sent based on the corresponding approval.
What is the 'baseline gate'?
It's an initial check that looks at existing information about the recipient (like signed contracts) before allowing a draft to be created. This prevents the agent from asking for information that should already be known.
Details
Original description by the author
Operator approval contract with internal filing notices for agent-drafted outbound messages, hashed drafts, epoch-keyed decisions, durable delivery claims and receipts, and a pre-draft baseline gate. Use when an agent drafts messages to external counterparties and a human operator must approve, reject, or steer each send before it leaves.
repo: affaan-m/ECC
Popularity
- GitHub stars
- 280k
- Ranking position
- #246
- License
- MIT
- Updated
- 10/15/2026
Comments
- …
More skills from this repository
accessibility
Helps your agent create interfaces that everyone can use. Ensures websites and apps work well for people with disabilities, like those who are blind or have reduced mobility.
affaan-m/ECC
agent-architecture-audit
Makes your agent check if everything is working correctly. It finds and fixes problems in AI systems, ensuring they perform as expected.
affaan-m/ECC
agent-eval
Helps your agent compare different AI coding tools. It measures which one is faster, cheaper, and more reliable for specific tasks.
affaan-m/ECC
agent-harness-construction
Makes your agent better understand how to perform tasks. It optimizes the tools and instructions the agent uses to increase its chances of success.
affaan-m/ECC
Similar skills
discernment-nudge
Has your agent add follow-up questions after giving an important answer. It's useful for ensuring you think carefully about advice or plans before acting.
anthropics/skills
interview-me
Asks questions to understand exactly what you need. Ensures the agent grasps your real need before starting work.
addyosmani/agent-skills
slack
Allows your agent to read discussions and collaborate in Slack conversations. It uses the assigned bot to interact with tasks and routines.
paperclipai/paperclip