Where a draft is filed
When the Executive Assistant saves a draft in the user's Outlook (DraftMail, DraftReply), it
also writes the draft's record into the mesh: an Essentials/Email node with the
recipients, subject and body, status Draft, and the Outlook web link (draftLink) that opens the
draft. The record is what the Mail app lists, what a counterparty's page shows, and what the
message page's Save as Outlook draft / Send act on.
The order of places
The directive (maintainer, 2026-09-15) is to always look for a better place than the user's
home. The tools take an optional fileUnder:
fileUndergiven — the shared place the mail concerns: a CRM counterparty'sCorrespondence(Notus/Correspondence) or its deal (PartnerRe/Esl). The record is filed there andrelatedTopoints at it. The agent is told (Agent/ExecutiveAssistant) to find the counterparty first:search nodeType:Crm/Client partitions:all, matching the recipient's company or domain.- No
fileUnder— the user's own{user}/Mails. That folder is created as anEssentials/Mailboxthe first time, so the fallback is still a working Mail app page, and the answer tells the model the record went there because no shared place was named.
A mailing (PrepareMailing) is the exception. It stays under its owner, because its Send is
bound to the owner's partition (MailingSender.ApproverIsOwner).
Three rules the implementation holds
- The record never fails the draft. By the time the record is written, the draft is already
in Outlook. A refused or faulted record write is reported, with what was not written and why,
and the answer still starts
DRAFT SAVED — NOT SENT.Reporting failure would invite a second draft, which the amend-never-redraft rule forbids. - The content is the wire shape.
EmailContentis compiled by the mesh fromEssentials/Email/Source, so the compiled module writes it as a JSON object carrying"$type": "EmailContent"and camelCase members (DraftRecords.Content), and the owning hub types it. The Mailbox type's live test writes that exact shape against the real type and reads it back asEmailContent. - One bridge at the mesh edge. The write is composed reactively and bridged once through
ObserveCompletion, exactly likePrepareMailing.
Tests: src/MeshWeaver.Mail.MicrosoftGraph.Test/ExecutiveAssistantDraftRecordTests.cs executes each
case on a real mesh: the fallback, fileUnder, a refused record, a missing hub, a create response
without a link (read back by id), and a reply. Essentials/Mailbox/Test/MailboxLiveTests.cs covers
the in-mesh half.