PASS Mailbox and Gmail ID form stable duplicate key
PASS Same message produces same duplicate key
PASS Different mailboxes produce different keys
PASS Missing message ID stops processing
PASS Missing text does not fall back to snippet
PASS Oversize body is not silently truncated
PASS Parsed result accepts allowed partnership
PASS Wrapped output is supported
PASS Unknown category rejected
PASS Unknown priority rejected
PASS String reply flag rejected
PASS String manual-review flag rejected
PASS Empty summary rejected
PASS Empty eligible reply rejected
PASS Oversize reply rejected
PASS Billing forced to manual queue
PASS Other category forced to manual queue
PASS Newsletter has no customer reply
PASS Spam has no customer reply
PASS AI manual flag closes send route
PASS Different Reply-To forces manual review
PASS No-reply sender never eligible
PASS Own-mailbox messages cannot start a reply loop
PASS List-unsubscribe identifies non-reply message
PASS Approve plus enabled sending reaches send state
PASS Approve in dry run sends no reply
PASS Decline sends no reply
PASS Missing approval sends no reply
PASS Null approval sends no reply
PASS String true is not approval
PASS Ineligible email stays closed even if approved
PASS Approved body is the exact saved body
PASS Model-supplied recipient cannot replace source sender
PASS Review packet includes body, original sender and draft
PASS Workflow JSON has unique names and node IDs
PASS All connection targets exist
PASS Workflow imports inactive with trigger disabled
PASS Default send switch is false
PASS Full email retrieval has Simplify off
PASS Attachments not downloaded
PASS Customer send does not automatically retry
PASS Reply uses original Gmail ID, exact draft and sender-only
PASS Approval offers approve and decline with 24-hour limit
PASS Only true branch of final gate reaches send route
PASS All write nodes use RAW data and manual column mapping
PASS Embedded Code node JavaScript compiles
PASS Loop processes one message per iteration
PASS Error-alert workflow also imports inactive

48 local logic and structural checks passed. No live API calls, n8n import, OAuth flow or end-to-end delivery test was performed.
