12장 이메일·폼·캘린더 쓰기를 초안과 실행으로 나눈다
외부 쓰기 행동은 내용을 만드는 단계와 실제 전송 단계를 분리한다. 이메일 초안은 로컬 파일로 저장할 수 있지만 보내기는 수신자, 참조, 숨은 참조, 제목, 첨부, 본문 해시를 승인 영수증과 대조한 뒤 한 번만 실행한다. 폼도 입력과 제출을 분리하고, 캘린더는 후보 시간 만들기와 초대 발송을 나눈다.
{
"kind":"send_email",
"to":["leasing@candidate-a.example"],
"cc":[],
"bcc":[],
"subject":"임대 조건 확인 요청",
"attachments":[],
"bodyHash":"sha256:fixture-value",
"expiresAt":"2026-08-05T18:00:00+09:00"
}
승인 화면에는 바뀐 부분을 강조한다. 주소 표시명에 숨은 외부 주소가 없는지 정규화하고, 첨부가 승인 뒤 추가되지 않았는지 본다. 전송 응답을 잃었을 때는 같은 메일을 즉시 다시 보내지 않고 발신함이나 멱등 키로 처리 여부를 확인한다.
실습 12 초안-전송 경계
문의 메일을 drafts/candidate-a.md로 만든다. 수신자를 가상 외부 주소로 바꾼 뒤 기존 승인으로 보내려 하면 approval-mismatch가 나와야 한다. 실제 메일 계정은 연결하지 않는다.