Skip to main content

Authority Policy

The core idea​

When AI Partner acts as you — sending email, replying to Slack DMs, joining meetings, placing phone calls — it needs to know what it's allowed to do alone and what requires your sign-off.

The Authority Policy is your answer to that question. It's a simple text file (workspace/AUTHORITY.md) with three sections:

  • Auto — execute immediately, no interruption, audit-logged
  • Draft + ask — draft the action, send it to you via Telegram for a one-tap approval
  • Block — never do this, no matter what

Every action that touches the real world runs through this gate first.


The decision flow​

Agent intends to act (e.g., reply to an email from your boss)
│
▼
Your policy is checked: what may it do here, to this person?
│
├─ verdict: "auto"
│ → Execute immediately
│ → Record it in your audit log
│ → Done
│
├─ verdict: "draft_and_ask"
│ → Draft the action (compose reply, prepare message)
│ → Send to ConfirmationChannel (your Telegram bot)
│ → You see: preview + 3 buttons
│ ┌──────────┬────────────┬──────────┐
│ │ ✅ Approve │ ✏️ Edit │ ⏭ Skip │
│ └──────────┴────────────┴──────────┘
│ → "Approve" → sends as-is
│ → "Edit" → reply with your correction → sends that instead
│ → "Skip" → leaves it for you to handle manually
│ → Timeout (default 10 min) → fallback action (usually skip)
│
└─ verdict: "block"
→ Refused entirely
→ Notification sent to you: "I was asked to [X] but it's blocked"

The agent never sends a message, moves money, or makes a commitment without hitting this gate first.


The AUTHORITY.md file​

Edit this in Settings → Workspace → AUTHORITY.md or directly at workspace/AUTHORITY.md. Changes take effect immediately — the file is hot-reloaded without restart.

## Auto
- action: read_.*
- action: archive_message
- action: send_message + counterparty: family

## Draft + ask
- action: reply_email + counterparty: colleague
- action: reply_email + counterparty: client
- action: send_slack_dm + counterparty: colleague
- action: send_telegram_dm + counterparty: vendor

## Block
- action: payments.*
- action: legal_commitment
- action: delete_.* + scope: production
- action: place_phone_call

Rule syntax​

Each rule is action: <pattern> optionally combined with counterparty: <class>:

FieldValuesNotes
actionAny action name or glob patternread_.* matches all read actions; payments.* blocks all payment actions
counterpartyfamily, colleague, client, vendor, unknown, publicRelationship class from CounterpartyStore
scopeproduction, staging, personal, etc.Optional context qualifier

Rules are evaluated top to bottom. The first match wins.


Counterparty classes​

Every person AI Partner interacts with on your behalf is resolved to a counterparty record with a relationship class. The CounterpartyStore links Bob's Slack username, bjones@acme.com, and his Telegram handle to one canonical record.

You assign a class when the person is first encountered (or AI Partner infers it from context):

ClassExamples
familySpouse, parents, siblings
friendPersonal contacts
colleagueCoworkers, direct reports
clientCustomers, paying users
vendorSuppliers, service providers
investorVCs, angels, board members
unknownAnyone not yet classified
publicBroadcast channels, mailing lists

Start conservative: block everything except reads, then open up categories as you build confidence. You can always change the policy without restarting.


Example policies by persona​

## Auto
- action: read_.*
- action: archive_message
- action: web_search
- action: send_message + counterparty: family

## Draft + ask
- action: reply_email + counterparty: investor
- action: reply_email + counterparty: client
- action: reply_email + counterparty: colleague
- action: send_slack_dm + counterparty: colleague
- action: join_meeting + counterparty: investor

## Block
- action: payments.*
- action: legal_commitment
- action: place_phone_call
- action: delete_.* + scope: production

The Telegram approval interface​

When a draft_and_ask verdict fires, you get a Telegram message like this:

AI Partner — Approval Required

📧 Reply to email from sarah@acme.com

Preview:
> Hi Sarah,
> Thanks for sending the proposal over. I've reviewed it
> and I'm happy to move forward — can we schedule a call
> this week to discuss terms?
>
> Best,
> Alex

[✅ Approve] [✏️ Edit] [⏭ Skip]
  • Approve — sends the draft exactly as shown
  • Edit — reply with your corrected text, then the agent sends that version
  • Skip — marks the action as deferred; the agent moves on and leaves this for you

If you don't respond within the timeout period (default: 10 minutes), the fallback action fires — usually skip. You can configure the timeout and fallback in Settings → Authority Policy.


The audit log​

Every decision is recorded — whether it ran automatically, came to you for approval, or was blocked. Review the full history in Settings → Audit Log.

Actions that move money or touch financial systems (Stripe, HubSpot, S3, Sentry, Outlook) are recorded separately as well, in a trail that can't be quietly edited after the fact.


Setting it up​

  1. 1
    Connect your Telegram bot

    Go to Settings → Messaging → Telegram and enter your bot token (from @BotFather) and your Telegram chat ID. This enables the ConfirmationChannel.

  2. 2
    Edit AUTHORITY.md

    Go to Settings → Workspace and edit the AUTHORITY.md file. Start conservative — block everything except reads, then open up specific action+counterparty combinations as you become comfortable.

  3. 3
    Test it

    Ask AI Partner to "draft a reply to [a colleague]'s latest email". With draft_and_ask in place, you should receive a Telegram approval request within seconds.