Skip to content

docs: Email Security CLI and AI triage - #363

Merged
maximelb merged 3 commits into
masterfrom
docs/mailsec-ai-triage
Aug 28, 2026
Merged

docs: Email Security CLI and AI triage#363
maximelb merged 3 commits into
masterfrom
docs/mailsec-ai-triage

Conversation

@maximelb

Copy link
Copy Markdown
Contributor

Two pages for a new Email Security section.

CLI

The whole limacharlie mailsec surface, plus the five behaviours that bite a script author if nobody states them:

  • Actions preview until --confirm — right default for an operation whose blast radius is every mailbox that received an attack.
  • alert_only is a success, not a failure — the action was decided and deliberately not performed because the org is not in enforce mode.
  • Filters are tri-state — an unset boolean means unconstrained, not false.
  • The EML download is audited and requires a justification, because it takes a person's actual mail out of the tenant.
  • Backtest reports what it could not examine (skipped_no_raw, truncated, and precision: null rather than 0), so a precision figure is never read as covering more than it did.

AI triage

Worked examples rather than anything installed for you. An earlier draft had the extension write these records on subscribe — disabled and deliberately incomplete — which left an operator hunting for records they never asked for while the extension had already made shape decisions that belong to them. Documented examples an operator adapts is the honest form.

The reasoning survives as why the example looks this way: what the agent may do is the mailsec.act permission on its key rather than a product setting (a prompt is a request, not a control); budgets and turn limits belong to the session; the user-report trigger has no verdict filter because a human reporting something is evidence the scorer did not have; and the message trigger fires on suspicious rather than malicious because the undecided band is where the analyst toil is.

Verification

Commands and flags checked against the CLI rather than written from memory — all 22 documented commands resolve. Doing that surfaced a real bug: message eml's file option was --output, shadowing the global --output <format>, so --output yaml would have silently written a file named yaml. Fixed in python-limacharlie#344 and documented here as --out-file.

Note: the limacharlie mailsec CLI ships in that PR and is not in a released package yet, so these pages describe a surface that lands with it.

Documents the agent, its key, and the trigger rules as examples an operator
adapts rather than records an extension installs. The extension deliberately
installs nothing: a disabled record that still needs a credential and an edit
before it works is the worst of both, and it makes the product opinionated about
a composition that belongs to the customer.

Keeps the reasoning the code carried: what the agent may do is the mailsec.act
permission on its key rather than a product setting, budgets are the session's,
the user-report trigger has no verdict filter, and the message trigger fires on
suspicious rather than malicious.

NOT PUSHED — see the note on the branch. This repo is public and Email Security
is pre-GA.
Two pages for the Email Security section.

CLI: the whole `limacharlie mailsec` surface, plus the five behaviours that
bite a script author if they are not stated — actions preview until --confirm,
`alert_only` is a success rather than a failure, filters are tri-state so an
unset boolean means unconstrained rather than false, the EML download is
audited and requires a justification, and backtest reports what it could NOT
examine so a precision figure is never read as covering more than it did.

AI TRIAGE: worked examples rather than anything installed for you. An earlier
draft had the extension write these records on subscribe, disabled and
deliberately incomplete — which left an operator hunting for records they did
not ask for, while the extension had already made shape decisions that belong
to them. Documented examples an operator adapts is the honest form.

The reasoning the code carried survives as why the example looks the way it
does: what the agent may DO is the mailsec.act permission on its key rather
than a product setting (a prompt is a request, not a control), budgets and turn
limits are the session's, the user-report trigger has no verdict filter because
a human reporting something is evidence the scorer did not have, and the
message trigger fires on `suspicious` rather than `malicious` because the
undecided band is where the analyst toil is.

Commands and flags verified against the CLI rather than from memory: all 22
documented commands resolve, and documenting `message eml` surfaced a real
collision — its file option was `--output`, which shadowed the global
`--output <format>` so that `--output yaml` would silently write a file named
'yaml'. Fixed in python-limacharlie and documented here as --out-file.
lcbill
lcbill previously approved these changes Aug 28, 2026
A `!!! warning "Private beta"` at the top of both pages, and the nav section
titled "Email Security (Private Beta)" so the status is visible in the sidebar
without opening a page.

Says the three things a reader actually needs: access is per-organization and
the extension will simply be absent if they do not have it; the surface may
change in ways that are not backwards compatible, so pin a CLI version if you
script against it; and talk to us before relying on it in production.

Worth being explicit rather than tasteful about this. These pages describe
commands that ship in an unreleased CLI, against an API whose event shapes are
still moving — a reader who scripts against them on the assumption of stability
has been misled by our silence, not by anything we said.
@maximelb
maximelb merged commit c99d2a9 into master Aug 28, 2026
7 checks passed
@maximelb
maximelb deleted the docs/mailsec-ai-triage branch August 28, 2026 16:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants