chain이라는 내부 플래그를 두고 스텝마다 책임을 넘기는 전략을 택했습니다.chain 플래그로 결정해 자연스럽게 중간 탈출이 가능하도록 했습니다.fetch를 호출할 때 await를 생략해 새 요청을 트리거하되, 실패 로그는 catch에서 남기도록 했습니다.school_record_submission 같은 엔티티에 process_status, process_error를 두어 어느 구간에서 멈췄는지 추적했습니다.hold로 두어 사람이 검토할 수 있게 했습니다.NextResponse.json({ success: true })를 반환합니다. 백엔드 로그에선 fetch(... chain: true) 형태로 다음 스텝을 호출합니다.ocr-scan 단계는 모든 첨부파일을 처리한 뒤 submission을 만들고, chain이 true라면 AI 추출을 호출합니다. 실패 시에는 recordProcessError로 에러 요약을 저장합니다.chain을 false로 넣으면 해당 단계만 실행하고 종료할 수 있어 재처리에 유용합니다.process_status 변경을 web dashboard에서 직접 볼 수 있게 만들었습니다.fetch 호출을 기다리지 않다 보니, Node.js 런타임이 요청 종료와 동시에 프로세스를 닫아버리는 문제가 있었습니다. 이를 막기 위해 가벼운 헬스체크 응답을 반환하기 전에 fetch를 큐에 넣고, Promise가 시작되도록 void fetch(...)가 아닌 fetch(...).catch(...) 형식으로 작성했습니다.