A per-message total. Besides the number of files and the largest single file, your plan now has a limit on the total of all files in one message (features.attachments.maxTotalSize in GET /api/billing/plans, in bytes of the raw files). A message over it is refused with 550 Email rejected: Attachments exceed <plan>'s total of <MB>MB per message (this message: <MB>MB).
The 10 MB whole-message ceiling is gone. The platform ceiling on the encoded message now sits above every plan's limits, so you normally meet your plan's limit first. The previous guidance of "keep files under about 7 MB" no longer applies. Recipients' mail providers still have their own receive limits, which differ: Gmail accepts up to 50 MB, many corporate gateways and other providers stop at 20 to 25 MB of encoded message.
Every attachment is virus-scanned before the message is accepted, whatever its size. A message that carries malware is refused with a 550. If the scanner is briefly unavailable the message is not accepted: SMTP gets a temporary 451 4.3.2 that your mail server retries on its own, and the same condition over HTTP is a 503 with Retry-After.
Messages with attachments are judged by the general content bar. The lower bar that transactional Motor Blocks get for plain mail does not apply once real files are attached. Inline images and other functional parts do not count as attachments.
Attachment refusals are specific over HTTP. Where a send reaches the converged path, plan refusals are 413 attachment_too_large or attachments_total_too_large, 422 too_many_attachments, attachment_type_not_allowed or attachments_not_allowed, each with plan, limit and actual in the body.