CCOSIGNET

Blog · Comparison

Slack approval buttons vs payload-bound approvals

Posting an Approve / Reject button to Slack is the most common way teams add a human step to an automation. It’s a fine notification. As the security gate on an AI-agent action, a typical implementation has a specific gap: it does not produce portable cryptographic evidence of what was approved.

A well-designed native approval can pause and bind a specific tool call inside its own platform. This comparison is about the common chat-button pattern and what Cosignet adds outside the platform that requested the decision.

What a Slack button actually proves

A typical Slack approval flow proves that a person (or whoever holds that Slack account) clicked a button at a point in time. Implementers can bind that click to backend state, but the binding is application-specific and usually remains dependent on platform and application logs. For a high-risk action that leaves three things open:

What payload-bound approval adds

Cosignet keeps the human step but changes what the human signs. The approver confirms with a device passkey, and the WebAuthn signature covers a challenge built from the action itself:

challenge = nonce ‖ SHA-256(payload)

Now the approval is inseparable from the operation. Change any field afterward and the signature no longer matches. The result is evidence about one specific action, signed by a key that never leaves the approver’s device, with biometric or PIN user verification required.

Side by side

PropertySlack Approve buttonCosignet (payload-bound)
Bound to the exact actionImplementation-dependent; not cryptographic by defaultYes — signature over nonce ‖ SHA-256(payload)
Proof of approverPlatform account eventEnrolled WebAuthn credential with user verification; real-world identity depends on enrollment
Resists post-approval driftImplementation-dependent; only if execution re-checks the approved stateYes — altered payload breaks the signature
Independently verifiable audit trailUsually no — depends on platform/application logsYes — public RFC-6962 transparency log + open verifiers
Works behind NAT / firewallNeeds Slack connectivityYes — long-poll over your outbound connection
Notification UXNative in SlackWeb Push, Telegram, email, or Slack link

When a Slack button is fine

Honesty matters: if the action is low-risk, easily reversible, and you only need a heads-up plus a quick ack, a Slack button is the right amount of friction. A platform-native approval may also be enough when all execution and evidence stay inside that platform. Reach for payload-bound approval when the action is irreversible (deploys, fund transfers, data deletion, secret rotation, admin commands), when you need an audit trail that holds up later, or when an AI agent — not a fixed script — is choosing the arguments.

Cosignet is an approval and evidence layer, not an executor or policy engine: it doesn’t run the action or replace your existing controls. It makes the human decision real. For the broader picture, see human-in-the-loop for AI agents.