Python 프로세스가 정상 종료됐다는 말은 그 안에서 맡긴 업무가 확인됐다는 뜻과 다르다. 화면 입력을 하지 않은 채 끝나거나 결과 파일을 저장하지 못했어도 종료 코드만 보면 성공처럼 보일 수 있다. 나는 실행기의 종료와 업무의 결과, 그 결과를 나중에 읽을 수 있는 기록을 나눠 확인하도록 만들었다.
종료 코드와 호스트 결과가 함께 있어야 한다
Python child의 exit 처리에서는 code가0이고 active.result가 있어야 오류 없는 종료 후보가 된다. 결과가 없으면 PROGRAM_EXECUTION_NOT_VERIFIED로 처리한다. stdout에 성공 문구를 출력했다는 것만으로 active.result를 대신하지 않는다. SDK가 호스트 경로에서 받은 결과와 단순 콘솔 출력을 구분한다.
이 조건이 모든 서비스의 서버 저장을 직접 검사하는 한 줄은 아니다. 실제 결과의 뜻은 executeRecipe와 매체별 구현이 정한다. 나는 exit 조건 하나를 만능 업무 판정으로 설명하지 않는다. 운영체제의 프로세스 상태와 호스트가 보유한 업무 결과가 다른 층이라는 경계를 먼저 세운 것이다.
오류 종류를 출력 문장만으로 덮지 않는다
시작 실패와 의존성 없음, 검증되지 않은 실행은 다른 오류로 남긴다. 이미 active.run.error에 기록된 문제도 종료 코드0보다 앞에 둔다. 마지막 Python 줄이 정상적으로 끝났다는 이유로 앞에서 발생한 전달 실패나 입력 오류를 없애지 않으려는 순서다.
중지한 실행은 취소 상태로 끝나지만 이미 외부에 전달된 행동의 취소를 뜻하지 않는다. 결과 미확정 오류는 확인 필요로 남는다. 나는 실패와 중지, 확인 필요를 모두 빨간 성공 실패 표시에 묶기보다 왜 다음 행동을 할 수 없는지 설명하는 상태로 두는 편이 낫다고 봤다.
산출물이 있으면 보관 단계도 결과에 포함한다
finish는 결과와 materialize 연결이 있으면 실제 산출물을 실행 폴더에 보관하는 처리를 호출한다. 이 단계가 실패하면 PROGRAM_OUTPUT_NOT_SAVED를 남기고 확인 필요로 분류한다. 브라우저에서 결과를 만들었어도 다음 사람이 그 자료를 읽을 수 없으면 완료라고 말하기 어려웠다.
materialize가 선택적인 연결이라는 코드 조건도 함께 본다. 이 실행기 함수가 모든 결과의 내용과 형식을 스스로 검증한다고 과장하지 않는다. 파일 크기와 hash, 필요한 내용 확인은 해당 산출물 경로에서 맡아야 한다. 결과를 받았다는 사실과 사용할 수 있게 보관했다는 사실을 구분한 것이다.
호스트 완료와 원장 저장도 실패할 수 있다
연결을 닫고 호스트의 finish를 호출한 뒤 result.json 원장을 저장한다. manifest의 최근 상태도 실행 당시 hash와 현재 파일이 같을 때만 갱신한다. 이 후처리에서 오류가 나면 PROGRAM_RESULT_NOT_SAVED와 needs_review로 바꾼다. 결과 보고의 실패도 실행 결과의 일부로 본 것이다.
저장 자체가 실패했다면 디스크에 최종 상태가 확실히 남았다고 말할 수 없다. 메모리에서 확인 필요로 끝난 것과 원장이 정상 보관된 것은 다른 근거다. 나는 예외를 잡았다는 이유로 복구까지 완료됐다고 보고하지 않는다. 다음 진단은 실제 남은 파일과 서비스 결과를 함께 읽어야 한다.
기존 검증은 실제 결과 파일을 읽는다
제품 보관함 시험은 fixture에서 Python 실행 뒤 호스트와 실행 상태, 완료 단계 수를 확인한다. 이어 실행 폴더의 CSV를 실제로 열어 이번 입력이 들어 있는지 본다. 노트북 경로는 executed.ipynb의 실행 셀을 읽는다. 파일 이름만 생긴 것을 업무 결과라고 보지 않는 비교다.
노트북 실행기는 오류가 나도 finally에서 부분 진행과 오류 셀을 저장하도록 되어 있다. 그러나 쓰기 실패까지 없다는 보장은 아니다. 이번 글은 그 코드와 기존 시험을 읽었고 새 브라우저 실행을 하지 않았다. 합성 모듈 시험과 홈페이지 발행 확인도 원본 제품의 신규 현장 검수와 구별한다.
완료는 나중에 확인할 수 있어야 한다
실행 중에는 화면에 결과가 보여도 시간이 지나면 그 화면은 바뀐다. 누가 어떤 정의로 무엇을 처리했고 어떤 산출물을 남겼는지 읽을 수 있어야 다른 사람과 다른 대화에서 이어갈 수 있다. 나는 성공 표시를 즉시 보여 주는 것만큼 그 표시를 나중에 설명할 기록이 중요하다고 생각한다.
맞춤 회사 프로그램에서도 저장 버튼의 응답과 실제 장부 반영, 첨부 파일 보관은 다른 확인이다. 종료 코드와 파일 생성처럼 기술적으로 쉬운 신호 하나를 전체 업무 완료로 바꾸지 않아야 한다. 제작자의 관점에서 완료 기준을 깊게 보는 일은 기능을 더하는 일만큼 실제 사용성을 바꾸는 작업이었다.