The administrator security baseline

Administrator·15 minutes to read

<!-- surface: admin-groups/group-approval-rules -->

Eight settings, reviewed before the first member signs in, and where each one lives today: the organisation's settings, the admin dashboard, the egress proxy, team plugin policy, organisation rules, push notifications, model routing and templates, and the review instructions the automatic reviewer reads.

Before the first member signs in

#SettingWhereWhat to set
1Where model calls are processedOrganisation → Policies, the residency row (no source screen — sheet idiom Sm-46)EU/EEA only is the default at provisioning; EU/EEA first prefers a model processed inside the EU/EEA and still fails outside it rather than leaving the area; Anywhere a model requires is the owner's alone and needs the organisation's name typed under Confirm processing outside the EU/EEA.
2Internet accessSettings → Computer (Sm-49) → Internet access; the organisation-wide Network policy row on Organisation → Policies (no source screen — sheet idiom Sm-46), now the live four-mode editorFour modes, set on the Network policy row by an organisation admin: Only the sites built in; Only the sites below (the built-in package, certificate and time hosts, plus whatever the organisation adds); Only the sites below, without the built-in list; and Anywhere on the internet, which needs a written reason and is admin-only — Only an organisation admin can change internet access.. A destination is a hostname, a subdomain group or an IPv4/IPv6 address range, each with an optional port, and the list holds up to 500. An organisation that has never set a mode runs as Anywhere on the internet until an admin picks one; private and local addresses are refused in every mode. The policy holds for a program that ignores the computer's proxy settings too: the computer's kernel lets only its egress proxy open connections out, and every computer, the hosted one included, tests that rule at boot and does not start when it does not hold. A member whose organisation is on a mode Settings → Computer's own two radios do not offer sees that mode named on a third line instead of an empty radio group. The row itself reads Applies to every computer in this organisation. Group scope and lock wait for a customer (D43). — group scope and lock on the Network policy row wait for a customer who asks for them.
3Plugin policyPlugins, per plugin; read back on Organisation → Policies, the Plugin policy rowEach plugin is Allowed, Blocked or Required; a Required plugin cannot be uninstalled by a member; blocking a plugin never blocks the site itself.
4Organisation rulesOrganisation → RulesOne instruction, up to 500 characters., applied on any of chat, computer, routines, channels; the count line reads N of M rules. The recommended block rules — production deployments, external e-mail, payments, accepting legal terms — and allow rules for routine, safe work go here as ordinary organisation rules. Beside them, Approval rules holds the organisation's own Ask first and Allow automatically rules, which every member's bots work under and see locked in their own Settings → Rules. A people group's page (Organisation → Group settings → the group) has its own Approval rules for this group: they apply to that group's members' bots — a bot whose owner is in the group, or a Team Bot assigned or granted to it — in addition to the organisation's, never in place of them; the members see them locked, marked Set for <group>, and cannot turn them off.
5Members' own automatic-review rulesSettings → General, the rules section (Sm-47)Ask members to prefer Allow once over a saved rule. An automatic-allow rule expires and is renewed with one click within seven days of lapsing. A saved rule never covers local execution, whatever it is worded to say. There is no organisation lock on a member's toggle yet.
6Model allowlistOrganisation → Policies, the Model allowlist row (no source screen)Applies to every model call made for this organisation: chats, the reviewer, group replies, memory consolidation and skill compilation. The platform's own reviewer fallback reads only the redacted card and is not affected. and A model you allow runs only where your residency policy admits.
7Template sharingOrganisation → Policies, the Template sharing row (no source screen)Who members may publish templates to. Team keeps them inside this organisation; switching to Team moves existing public templates back to the team. Off, Team or Public; until an administrator chooses, Team on the Enterprise plan (or its trial) and Public on every other plan; a template's own audience starts unselected.
8On-demand spendSettings → Usage & Billing (Sm-51), the On-Demand card and its Set a monthly limit selectOff by default; enabling needs a ceiling and a stored payment method on a web subscription; a member ceiling never raises the organisation's (the lower binds). Edits are admin-only: Only an administrator can change usage settings for this organisation.

Organisation rules: the block list and the allow list

Two different lists answer two different questions, and only one of them has a screen today.

The recommended block sentences — no production deployments from this organisation, no external e-mail without review, no payments, never accept legal terms on the organisation's behalf — and the recommended allow sentences for routine, safe work go on Organisation → Rules (row 4 above) as ordinary organisation rules: they steer the run itself.

The automatic reviewer that decides an approval card reads a separate list, org_policies.review_instructions — team-wide instructions for the reviewer — but no screen or command sets it today. This page names that as a gap rather than pointing an administrator at a setting that does not exist; the reviewer's other source is each member's own automatic-review rules (row 5).

Members' own automatic-review rules

Every member carries their own automatic-review toggle, default on, on Settings → General. Turning it off disables only the rule-released automatic-allow path — everything that needed approval still asks. There is no organisation-wide lock on that toggle yet.

Notifications

The two-gate rule for push notifications waits for the mobile app; nothing in this build implements it yet, so this page names the switch that exists instead. A bot's own Notifications row — Get notified when this Bot finishes or needs input — is the first gate. A push reaching a member's phone needs that switch and the device's own notification permission; the phone half of the rule arrives with the mobile app.

Delegation and the product switch

Delegate to coding agents is off by default: while it is off, no bot in the organisation hands coding work to a connected coding service, and a member whose bot tries reads Could not pass this to <bot>: delegation to coding agents is turned off by an admin of this organisation. A personal organisation has no such switch: its bots always may.

Botseon for this organisation stops every run start for every member — chats, routines and channels alike — and deletes nothing; an administrator turns it back on when the reason for stopping has passed.

Both are recorded to the audit log (org.delegation_toggled, org.product_toggled).

What the audit log records

Organisation → Audit reads Who changed what in this organisation, newest first., with a Tamper check line (Verified unbroken … or A break was found …) and an Export control offering From, To, Request export, Download and Chain unbroken.

The action vocabulary an export carries:

actionwhen it is written
org.team_created, org.renamedthe organisation is provisioned, or its name changes
org.member_invited, org.invitation_accepted, org.invitation_revoked, org.member_role_changed, org.member_removedan invitation or a membership changes
org.product_toggled, org.delegation_toggled, org.residency_changed, org.rule_changed, org.limits_overriddena Policies or Rules row is changed; a people group's approval rule writes org.rule_changed with the group as its target and the group's name and the setting (approvalRules) in its details
org.template_sharing_changed, model.allowlist_changed, org.byok_changedthe template-sharing switch, the model allowlist or the bring-your-own-key switch changes
org.computer_stoppedOrganisation → Computers Stop is used
org.access_requested, org.access_decided, org.join_domains_changeda domain-join access request is filed or decided, or the join-domain list changes
org.team_bot_added, org.team_bot_removed, bot.visibility_changeda bot is shared with the team, unshared, or its visibility changes
org.team_bot_published, org.team_bot_withdrawn, org.team_bot_chat_openeda bot is published to the team as a Team Bot, withdrawn, or a teammate first opens their own chat with it
bot.manager_added, bot.manager_removed, bot.manager_editeda Team Bot owner names or drops a manager, or a manager edits the bot's profile, skills, plugins, secrets or Slack app (the row names the manager, never a secret's value)
bot.slack_app_created, bot.slack_app_installed, bot.slack_app_removeda Team Bot owner registers a Slack app of the bot's own, installs it in a workspace, or removes it (the row names the Slack app id, never a credential)
org.team_bot_assigned, org.team_bot_deleted_by_admin, bot.slack_app_connectedan admin sets who a Team Bot is for (all members, none, or named groups), an admin deletes a Team Bot from the team (the owner keeps the bot), or a bot is connected to the organisation's Slack app
bot.connection_borrow_asked, bot.connection_borrow_approved, bot.connection_borrow_deniedin a shared thread a Team Bot asks one person whether it may use another person's connection, and that person approves or refuses (the row names the plugin and the two people, never a credential)
org.member_group_created, org.member_group_renamed, org.member_group_deleteda people group is created, renamed, or deleted (soft — the row survives, so the log can still say who was in it)
org.member_group_member_added, org.member_group_member_removeda member is put into a people group, or taken out of one (soft, and out of every assigned bot's audience at once)
audit.export_requested, audit.export_downloaded, audit.chain_verified, audit.chain_brokenthe audit log itself is exported or verified
billing.seats_synced, billing.seats_sync_failed, billing.on_demand_enabled, billing.on_demand_disabled, billing.limit_changedseats or on-demand billing settings change
privacy.erase, privacy.erase_replayeda subject-erasure request runs, or replays after a restore
template.published, template.withdrawn, template.installed, template.exported, bot.version_cut, bot.version_restoreda template or a bot version is published, withdrawn, installed, exported, cut or restored
package.submitted, package.reviewed, package.published, package.withdrawn, package.uninstalled, package.installed, package.update_approveda plugin package moves through submission, review (or a member's own publication, where the organisation does not require review) or install
skill.enabled, skill.disabled, skill.published, skill.edited, skill.deleted, skill.useda member switches a skill on or off for a bot, publishes it to the team, edits it or deletes it, or a bot reads one during a run (the row names the skill, its version and its content hash, never its text)
package.policy_changedan admin allows, blocks or requires a team package (the row carries the state before and after, and the reason given)
mcp.server_added, mcp.tools_approved, mcp.server_removeda member adds an MCP server, approves the tool list it publishes, or removes it (the row names the server, and the host of its address or the program it runs; never a header, an environment value, a command argument or the rest of the address)
mcp.change_accepted, mcp.change_refuseda member accepts or refuses a change a server made to its tool list (the row carries the hash approved before and the hash published, not the tools' descriptions)
mcp.server_granted, mcp.grant_revokeda member lets one of their bots use a server, or takes that away (the row names the server and the bot)
mcp.signed_in, mcp.reconnect_needed, mcp.sign_in_revokeda member signs in to a server at its supplier, that sign-in stops working (nobody's act, so the row has no actor and names the member in its details), or it is revoked when the server is removed (never a token)
org.plugin_policy_changed, org.mcp_allowlist_changedan admin allows, blocks or requires a plugin (the state before and after, and the reason given), or changes which MCP servers members may add themselves (the switch, and the lines added and removed)
org.sso_configured, org.sso_mode_changed, auth.sso_refusedan admin's test sign-in through the identity provider saves the SAML configuration (the domains and the provider's entity id), an admin turns single sign-on off, on or required (the state before and after), or the sign-in callback refuses a SAML response (no actor; the reason — signature, audience, expired, replayed, request, domain, not a member — never the response itself)
org.skill_catalogue_approval_toggledan admin switches the optional approval of skills from the catalogue on or off (the state before and after)
org.skill_publish_policy_toggledan admin switches Allow members to publish for personal skills on or off (the state before and after)
org.desktop_minimum_version_changedan admin sets, changes or removes the minimum version of the desktop app (the version before and after)
connector.installed, connector.uninstalled, connector.account_added, connector.account_renamed, connector.account_removeda member installs or uninstalls a connector, or adds, renames or removes one of its accounts (the row names the connector, the account and its label; an uninstall lists every account it took down and how many bot grants went with them)
connector.signed_in, connector.disconnecteda member signs in to a connector account (through the vendor's consent, a bank link or a pasted key) or disconnects it (the row names the member, the connector, the account label and the scopes granted or declared; never a token, a key, a code or a state)
connector.account_granted, connector.grant_revokeda member lets one of their bots use a connector account, or takes that away (the row names the account and the bot)
connector.reconnect_neededa connector account stops working because the vendor refused a call, a watch read or a refresh, or a bank consent lapsed (nobody's act, so the row has no actor and names the member in its details)
org.setup_manifest_proposed, org.setup_manifest_decided, computer.setup_rana Team Setup manifest is proposed, decided, or run on a computer
org.rule_proposed, org.rule_proposal_decided, audit.index_rebuilt, compliance.page_publisheda member proposes or decides an organisation rule, the audit index is rebuilt after a restore, or a Trust Centre compliance page is published

The table above describes 101 of the 147 names in AUDIT_ACTIONS (packages/core/src/audit-actions.ts, counted 2026-10-14). Every connector.* row targets the connector's slug, which is what the audit page's Connector filter matches. The other 46 are in the vocabulary and can appear in an export; their rows are not written here yet:

abuse.signal, api.key_created, api.key_revoked, auth.signin, billing.dispute_opened, billing.event_replayed, billing.mode_mismatch, billing.refund_recorded, billing.team_limit_changed, bot.instructions_changed, bot.instructions_restored, bot.memory_kinds_changed, bot.placement_changed, bot.tool_denies_changed, computer.bot_moved, computer.checkpoint_taken, computer.reclaimed, computer.rehearsal_decided, computer.rehearsal_started, computer.rolled_back, conversation.exported, mail.address_suppressed, member.external_mail_rule_changed, member.style_profile_consented, member.style_profile_revoked, model.providers_excluded_changed, org.action_recording_changed, org.attachment_quota_exceeded, org.bot_email_changed, org.created_via_platform, org.deletion_requested_via_platform, org.isolation_changed, org.mcp_stdio_toggled, org.memory_policy_changed, org.otel_export_changed, org.plugin_review_toggled, org.privacy_training_mode_changed, org.skill_script_review_toggled, privacy.export_completed, privacy.restrict, routine.guard_paused, routine.guard_resumed, template.guide_installed, webhook.endpoint_created, webhook.endpoint_deleted, webhook.endpoint_disabled, webhook.endpoint_updated, webhook.secret_rotated.

Sign-up abuse controls

A new account on the hosted edition needs an address that can receive mail, and the same person cannot quietly hold two accounts on one mailbox.

Three guards run on Create an account, in this order, and the order is the point — each refusal costs less than the one after it:

  1. The domain. A disposable or temporary-mail domain, or a domain that accepts no mail at all, is refused with Use an address you can receive mail on. — one sentence for both causes, which names neither the block list nor which of the two fired.
  2. How many accounts one network has just made. More than five in a rolling hour is refused with the same sentence a rate-limited sign-in gets, so neither page ever confirms whether an address already has an account.
  3. The per-address sign-in limit, unchanged, which the sign-in page has always used.

Addresses are compared by their canonical form, not the literal string typed: a +suffix is ignored, and for Gmail so are dots in the name. Someone who signs up as ida+work@example.com when ida@example.com already exists is signed into that existing account rather than given a second one. Nothing is merged, because there was only ever one account.

What is recorded, and what is not

Each refusal — and each alias sign-in, and each trial rejected for a duplicate card — appends one row to abuse_signals. A row holds a keyed hash and never an address, never a network address, and never anything about a payment card. The hash columns accept nothing but a 64-character digest, so a caller that passed a raw address would be refused by the database rather than stored. Rows older than 90 days are removed as new ones are written; nothing schedules a sweep. The table is not readable by the application role, and no bot, tool or plugin can reach it.

An organisation is named on a signal only where one exists — a refusal at sign-up happens before anyone is signed in — and where one is named, the organisation's own audit log carries a matching abuse.signal row.

The operator verbs

These are for whoever runs the deployment, not for an administrator of a single organisation, and they are cross-tenant:

botseon ops abuse domains add <domain>      # refuse new accounts on this domain
botseon ops abuse domains allow <domain>    # lift a refusal, including one the built-in list makes
botseon ops abuse domains list              # the current overlay, and the signal counts behind it

add and allow are both idempotent — running either twice, or allowing a domain that was never blocked, is not an error — and a domain moves between the two lists rather than joining both. They write an overlay beside the built-in list, which is read fresh on every sign-up, so a change takes effect without a redeploy. The built-in list itself is never edited by these commands.

list prints domains and counts per kind and no hash and no address: it reads aggregates only, so even this privileged report cannot become a way to ask whether one particular person tried to sign up.

Last verified against build c0f77aa.