허구 주문 5행 분업: 완료 수량 7과 미완료 2행을 다시 맞추기

같은 주문표를 여러 작업으로 나누면 계산 책임은 선명해지지만, 결과를 다시 합칠 때 누락과 중복이 생길 수 있습니다. 이 실습은 허구 주문 다섯 행을 완료 집계·미완료 행 보존·금액 계산 가능 여부로 나눕니다. 실제 AI 작업자를 병렬 실행한 기록이 아니라, 분업 결과가 같은 원본을 가리키는지 검산하는 로컬 예제입니다.

준비: 다섯 주문과 네 열

첨부 ZIP의 orders.csv는 아래 표와 같습니다. Python 표준 라이브러리로 읽으며 실제 주문·고객·매출 자료가 아닙니다. 주문ID는 각 행을 구분하고 품목 이름은 묶어서 더할 때 사용합니다. 같은 품목이라는 이유로 주문 행을 삭제하지 않습니다.

주문ID 품목 수량 상태
O-11 아메리카노 2 완료
O-12 라테 1 취소
O-13 아메리카노 3 완료
O-14 주스 1 대기
O-15 라테 2 완료

전체 수량은 2+1+3+1+2=9이지만, 완료 수량은 2+3+2=7입니다. O-11과 O-13은 같은 아메리카노의 서로 다른 주문입니다. O-15는 라테입니다. 주문 수 5와 수량 9, 완료 주문 수 3과 완료 수량 7을 각각 다른 필드로 보존합니다.

허구 주문5행 수량9에서 완료3행 수량7과 미완료2행을 분리하는 설명 도해
허구 주문5행 수량9에서 완료3행 수량7과 미완료2행을 분리하는 설명 도해. 가상 예제를 설명하는 도해이며 실제 앱 실행 결과 화면이 아닙니다.
성인 손이 한 장의 가상 원본 표와 색별 검토 폴더를 나란히 펼쳐 분업 자료를 대조하는 AI 연출 사진
AI로 만든 연출 이미지. 같은 가상 원본을 나누어 검토하고 다시 대조할 자료를 준비하는 상황입니다. 실제 주문·고객 자료, AI 병렬 실행 기록이나 완료 수량 계산 결과가 아닙니다.

세 작업의 입력과 출력 경계

작업 A는 상태가 정확히 완료인 주문만 선택합니다. 결과에는 O-11·O-13·O-15라는 ID 목록, 행 수 3, 수량 7, 품목별 아메리카노 5·라테 2를 넣습니다. 합계 7만 돌려받으면 어떤 행을 더했는지 알 수 없으므로 ID 목록을 생략하지 않습니다.

작업 B는 완료가 아닌 O-12와 O-14의 ID·품목·수량·상태를 그대로 반환합니다. 취소와 대기를 모두 미완료로 바꾸면 후속 판단에 필요한 원래 상태를 잃습니다. 따라서 두 행을 고르되 각각 취소 1, 대기 1이라는 정보를 보존합니다.

작업 C는 주문금액을 요청받은 상황입니다. 입력에는 단가나 주문금액 열이 없습니다. 가상 입력의 수량 9를 금액으로 취급하지 않습니다. 데이터 부족과 단가 또는 주문금액이 필요하다는 결과를 남깁니다. A와 B가 맞아도 C의 금액 계산까지 완료한 것으로 보고하지 않습니다.

원본 버전을 결과에 붙이기

세 결과에는 orders.csv 바이트에서 구한 source_sha256이 각각 있습니다. hashlib의 hexdigest는 해시 요약을 16진수 문자열로 반환합니다. hashlib — Secure hashes and message digests 검사는 원본을 다시 읽어 계산한 요약과 각 작업 결과를 비교합니다. 한 작업만 다른 원본을 보고 만들어진 경우 결과를 섞지 않도록 하는 예제입니다.

이 요약은 데이터가 실제 거래인지, 누가 작성했는지 증명하지 않습니다. 원본과 결과를 함께 바꾸면 둘끼리는 맞출 수 있습니다. 별도로 보존한 원본의 신뢰성과 접근 권한은 사람이 관리해야 합니다. 이 ZIP에는 서명·서버 동기화·작업자 인증 기능이 없습니다.

정상 결과와 두 오류 결과 실행하기

  1. ZIP을 빈 폴더에 풀고 orders.csv의 헤더와 다섯 행을 확인합니다. 원본을 수정하지 않고 별도 사본에서 실습합니다.

  2. python3 verify_tasks.py orders.csv synthetic-tasks.json을 실행합니다. 완료 3행·수량 7, 기타 2행, 금액 데이터 부족이 출력되는지 확인합니다.

  3. 응답 파일을 synthetic-wrong-quantity.json과 synthetic-duplicate-row.json으로 각각 바꾸어 실행합니다. 두 경우 모두 accepted false와 종료 코드 1이 나오는지 확인합니다.

synthetic-*.json은 직접 작성한 합성 결과입니다. 스크립트는 CSV와 JSON 두 파일을 읽고 정해진 출력 계약을 대조합니다. AI 호출·자동 배정·네트워크·발행 작업을 하지 않으므로 이 검사를 실제 외부 기기 병렬 실행 성능의 증거로 사용하지 않습니다.

행 수만 맞는 결과를 거부하는 반례

잘못된 수량 파일은 작업 A에 전체 수량 9를 넣습니다. 완료 상태만 골라야 할 곳에서 취소와 대기까지 더한 오류입니다. 복구할 때 전체 원본 수량을 7로 고치면 안 됩니다. 원본 9를 보존하고 A의 선택 조건을 다시 적용해야 합니다.

중복 행 파일은 작업 B의 두 번째 행에 O-14 대신 O-12를 한 번 더 넣습니다. 행 수는 여전히 2이므로 개수 검사만 하면 놓칩니다. 검증 스크립트는 원본에서 계산한 두 행 전체와 비교하므로 중복된 O-12와 사라진 O-14를 함께 거부합니다.

결과 겉으로 맞는 값 실제 결함 복구 대상
수량 오답 전체 수량 9 완료 수량은 7 작업 A 결과
행 중복 미완료 행 수 2 O-12 중복, O-14 누락 작업 B 결과
금액을 임의 기입 숫자 모양의 출력 단가·금액 입력 없음 작업 C를 데이터 부족으로 분리
완료수량9 오답과 O-12 중복·O-14 누락을 원본 전체행 대조로 찾는 설명 도해
완료수량9 오답과 O-12 중복·O-14 누락을 원본 전체행 대조로 찾는 설명 도해. 가상 예제를 설명하는 도해이며 실제 앱 실행 결과 화면이 아닙니다.

입력 자체가 잘못된 경우

csv.reader는 각 행을 문자열 목록으로 읽습니다. csv — CSV File Reading and Writing 이 실습 코드는 수량을 그대로 더하지 않고, 양의 정수 문자열인지 확인한 뒤 정수로 바꿉니다. -2, 빈칸, 2개는 허용하지 않습니다. 알 수 없는 상태나 중복 주문ID도 입력 오류로 중단합니다. 상태를 임의로 완료로 바꿔서 처리하지 않습니다.

수정이 필요한 원본이라면 담당자가 별도 새 사본을 만들고 모든 작업이 그 사본을 사용해야 합니다. 예를 들어 주스 수량을 1에서 2로 바꾸면 완료 집계는 여전히 7이지만 작업 B와 원본 요약은 달라집니다. 예전 A가 숫자상 맞는다고 다른 사본으로 계산한 B·C와 섞는 것을 이 계약은 허용하지 않습니다.

실패한 작업을 고칠 때 남길 것

같은 고정 원본에서 작업 A의 수량 오류가 발생했다면 오답 JSON을 보존하고 A를 다시 계산한 새 결과로 복구합니다. B의 취소·대기 행과 C의 데이터 부족 결과까지 지울 이유는 없습니다. 다만 마지막 결합 검사는 다시 실행해 세 부분이 같은 원본을 가리키는지 확인합니다. 개별 성공 기록을 합쳐 전체 성공으로 추정하지 않습니다.

원본과 응답 파일의 바이트가 검사 전후 같다는 것도 테스트에서 확인했습니다. 복구 코드는 자동 재전송이나 파일 덮어쓰기를 수행하지 않습니다. 실제 운영에서 재시도·동시 실행·중단 복구가 필요하다면 작업 상태와 승인 경계를 별도로 설계해야 합니다.

분업의 한계: 원인과 금액 자료는 따로 필요

이 표에는 기간·단가·결제 상태·환불 금액이 없습니다. 따라서 매출 추이, 취소 원인, 선호도, 이익을 설명하지 않습니다. C의 데이터 부족은 실패를 숨긴 요약이 아니라 필요한 입력을 명시한 결과입니다. 새 금액 자료를 받기 전까지는 금액 분석이 남아 있다고 기록하세요.

실제 AI·Excel 앱·Windows 분산 실행은 사용하지 않았습니다. 첨부는 다섯 행의 합성 입력과 정상·오류 JSON을 Python으로 검산한 자료입니다. 작은 표에서 행의 책임과 결과 결합 기준을 확인한 뒤, 실제 데이터에는 권한·입력 정의·상태 종류를 다시 맞춰 적용해야 합니다.

같은 원본 해시·행과수량·금액데이터부족·로컬검증한계를 확인하는 설명 도해
같은 원본 해시·행과수량·금액데이터부족·로컬검증한계를 확인하는 설명 도해. 가상 예제를 설명하는 도해이며 실제 앱 실행 결과 화면이 아닙니다.

공식 출처와 확인일

csv — CSV File Reading and Writing

hashlib — Secure hashes and message digests

출처 원문 수집일: S1 2026-09-24; S2 2026-09-24.

작성자 소개