← All packages
The record · v0.3.0 · Apache-2.0

@flashyos/mail

The record of what an organisation sent, carrying none of it

mail/1 and the estate's mail control plane: a lane policy that refuses, a capture that demands a consent basis, a content-free event record, and a transport seam so the provider is a variable.

npm install @flashyos/mailnpm ↗source ↗

Why it exists

Eleven send helpers across seven repositories agreed about nothing, and not one recorded that a message existed — so a domain that had silently stopped delivering looked exactly like a week when nobody wrote to anyone. One send path, and a published record content-free enough that it can actually be published.

What it refuses to do
An address is never written into a leaf, and never hashed into one either. An address is drawn from a small enumerable space, so a hash of one is a reversible identifier rather than a redaction.

How it works

`mail/1` is a content-free, append-only record of what an organisation sent: a lane, a disposition, a counterparty domain and a time. No subject, no body, no address — which is what makes it publishable, and a log that cannot be published gets rebuilt privately by everyone who wants one.

Five lanes carry the consent rule onto the one channel nobody had gated. An agent may compose every word of a message to somebody who did not ask us for anything, and a named human sends it; `held` is a success rather than an error, because a draft waiting for its person is the product. `transactional` deliberately does not consult the suppression list — a person who left a digest has not asked to be locked out of their own account.

A delivery outcome is a transition rather than an edit: a bounce writes a NEW leaf naming what it supersedes, and the current disposition is derived. The published projection is an aggregate rather than a list, because order alone separates recipients inside one domain from each other, and a domain below the small-cell floor folds into `other` — with the floor and the folded count published, since an unstated suppression rule is indistinguishable from a domain nobody wrote to.

Related concepts
IntentMeshagentic autonomous organizationmachine-readable organizational trustAI agent trust register

Use it

Ask a domain whether it can authenticate its own mail
npx @flashyos/mail check flashy.gold

In practice

Notice that a domain stopped delivering
Volume, dispositions and delivery outcomes are counted per lane and per counterparty domain, so a provider that silently started bouncing reads as a change in the record rather than as a quiet week.
Answer why you hold an address
Every capture records the kind of basis, an https URL a stranger can open, and the purpose quoted from the page the person actually read. Nothing is backfilled, so the coverage figure falls only as people arrive through a form that records one.
Check a zone before it costs you a campaign
`check <domain>` reads SPF, DKIM and DMARC the way a receiving mail server would. A domain publishing p=reject with neither mechanism is asking every receiver to discard its own mail, and nothing else in a repository can tell you that.

How it stays honest

The projection refuses a document whose rows do not sum to its headline, so a breakdown built before its totals fails rather than publishing a quiet disagreement. The leaf shaper refuses a body carrying any of a named list of identifying fields, however it is spelled. The DNS check lives in the package and byte-identically in a dependency-free vendored copy, and a differential test runs both over nine synthetic zones and fails on any disagreement about the verdict — never by comparing constants, which is a test of how a rule is spelled rather than of what it decides.

Questions

What is mail/1?
A content-free, append-only record of the mail an organisation sends: lane, disposition, counterparty domain and time, published as an aggregate at /.well-known/mail.json. It carries no subject, no body and no address.
Why is an address never hashed into a leaf?
Because an email address is drawn from a small, enumerable space. A hash of one can be reversed by enumeration, so hashing it is not a redaction — it is a reversible identifier wearing one.
What does a lane decide?
Whether a message may be sent at all, and by whom. An agent composing to a stranger produces a held draft that a named human releases; only the operational lane is autonomous, and it is earned by a fetched handshake rather than asserted by the caller.
Why publish the number of delivery outcomes separately?
Because no bounces and no webhook wired look identical in every other figure. One is an organisation nobody writes back to and the other is instrumentation nobody connected, and they need opposite fixes.

The licence

Apache-2.0, read from the package’s own manifest. Embed it in anything, including closed software — that is what makes a spec adoptable and a verifier worth running. FlashyOS’s server side is AGPL-3.0-only instead, and a test in the monorepo asserts the direction between them: AGPL code may consume this, this may never consume AGPL code.

Keep reading

The standard
Also in the record
@flashyos/canon@flashyos/directory@flashyos/backlog@flashyos/shiplog@flashyos/checkpoint@flashyos/assetmesh@flashyos/delivery@flashyos/playbook@flashyos/mesh@flashyos/holding@flashyos/frontdoor