다음 검토 대상으로 적힌 자료를 살펴보니 이미 전체 프레임을 확인한 사진들이었다. 미완료라는 상태 안에 새로 볼 일과 이미 본 뒤의 후속이 섞여 있었다. 원래 기록을 보존하면서 그 두 일을 구분하는 기능을 추가했다.

다음 대상이라는 문장부터 다시 확인했다

작업 인계에는 다음에 검토할 현장이 적혀 있었다. 그대로 이어가려던 중, 그 현장의 아홉 사진이 이미 전체 프레임 검토를 마친 자료라는 기록을 확인했다. 남은 상태는 새로 사진을 보는 일이 아니라 설치 상태 확인 두 장과 검증된 시공후 짝을 기다리는 시공전 일곱 장이었다. 다음 대상이라는 한 줄이 서로 다른 종류의 남은 일을 가리고 있었다.

나는 이 상황을 원래 프로그램이 모든 자료를 잘못 처리한 사건으로 넓히지 않았다. 확인한 문제는 인계 기록의 다음 지점이 이미 검토한 보류 묶음을 가리킨다는 것이었다. 직전 개발 회차에서는 그 아홉 원본과 아홉 현재 표시 파일을 로컬에서 다시 대조했다. 새로 본 사진 수나 검수 완료 수를 늘리지 않고, 무엇이 이미 끝났고 무엇이 여전히 남았는지부터 정리했다.

미완료를 하나의 줄로 줄이면 같은 일을 반복한다

검수 목록의 상태가 완료가 아니면 다음 대상으로 고르는 규칙은 처음에는 단순해 보인다. 하지만 자료를 아직 보지 않은 경우, 자료는 봤지만 보정이 필요한 경우, 설치 상태의 확인을 기다리는 경우와 전후 비교 근거가 없는 경우는 다음 행동이 다르다. 전부 다시 보기로 묶으면 사진을 다시 읽어도 보류의 이유는 그대로 남는다.

이번에는 새 전체 프레임 검토 후보와 기존 후속 작업을 나눴다. 보류 자료를 목록에서 지우거나 완료로 바꾸는 대신, 이미 확인한 근거를 유지한 채 보정·설치·비교 등 남은 이유를 읽을 수 있게 했다. 이 구분은 홈페이지 사진 외에도 문서 검토나 자료 이관에서 적용할 수 있다. 다만 각 업무에서 무엇을 실제로 확인했다고 볼지는 먼저 정해야 한다.

현재 표시본과 맞는 근거인지 먼저 본다

원래 검토 기록에는 표시 파일의 지문과 전체 프레임 확인 표시가 있다. 새 선택 함수는 현재 manifest와 공개 대상 메타데이터의 범위·표시 경로가 같은지 먼저 대조한다. 맞지 않으면 예전 목록에서 다음 대상을 고르지 않고 갱신이나 조사를 요구한다. 중복된 사진 식별자나 검수 ID도 조용히 한 행으로 덮지 않는다.

그다음 현재 표시 지문에 맞는 기록이 없는지, 지문이 달라졌는지, 전체 확인 근거가 빠졌는지를 나눠 후보로 돌려준다. 이 함수가 매번 실제 파일 바이트를 읽는 것은 아니다. 현재 manifest에 선언된 지문을 비교하는 선택기다. 실제 다음 사진을 열 때는 파일의 현재 지문과 소속을 다시 대조해야 하며, 그 역할을 metadata-only 선택기의 성공에 빌려 붙이지 않았다.

보류의 이유는 사진을 다시 봤다고 사라지지 않았다

아홉 장을 다시 대조하면서 실제 설비의 보양과 설치 상태를 임의로 완성된 모습으로 만들지 않았다. 시공전 사진도 직접등의 모양이 바뀌었다는 이유만으로 시공후로 승격하지 않았다. 같은 방처럼 보이는 두 사진이라도 시공 단계와 방향·공간의 검증이 필요하다. 기존 설치 보류 두 장과 비교 보류 일곱 장은 유지했다.

파일과 기록을 보존하는 것도 이 수정의 일부였다. 직전 개발 회차의 검증은 원본·현재 표시 아홉 쌍의 바이트와 원본 크기·수정 시각, 보호한 메타데이터와 기존 기록 1,356개의 해시가 그대로임을 확인했다. 생성한 공개 데이터와 본문을 메모리에서 만들어 아홉 사진이 계속 제외되는지도 대조했다. 브라우저나 실제 사이트 화면을 새로 검수했다는 뜻은 아니다.

다음 검토 명령은 기록을 바꾸지 않게 했다

실제 프로그램에는 기존 검수 도구 안에 읽기 전용 선택 함수와 다음 검토 CLI를 추가했다. 별도 큐 프로그램으로 사진을 옮기지 않고 현재 검수 기록을 읽는다. 새 검토 후보가 없으면 그 사실을 돌려주지만 전체 목표를 완료로 표시하지 않는다. 이미 확인한 자료의 보정·설치·비교 후속은 다른 묶음으로 남아 있다.

직전 회차에는 이 선택기의 새 시험 20개와 기존 검수 집계 시험 4개가 통과했다. 실제 CLI 실행에서는 이전 보류 묶음이 새 전체 프레임 후보에서 빠지고 다른 미검토 묶음이 선택됐다. 이 콘텐츠 회차에 원래 제품 시험을 다시 돌리거나 사진을 다시 검수하지는 않았다. 변경한 프로그램의 코드·보존·검증·백업 기록을 근거로 제작 이야기를 쓰고 있다.

공유 예제에는 현재 보류와 과거 완료의 충돌도 넣었다

독자가 자기 프로그램에서 실험할 수 있도록 별칭과 합성 지문만 받는 작은 함수를 새로 작성했다. 현재 자료와 이전 기록의 수정 번호·지문·전체 확인 표시를 비교해 새 검토·기존 후속·완료를 나눈다. 현재 보류가 생겼는데 옛 상태가 complete인 경우도 완료 목록에서 제외한다. 원래 사진 선택기의 모든 필드를 복제한 것이 아니라 공개 예제에 필요한 계약을 더 명시한 것이다.

새 예제는 실제 파일을 읽거나 보류를 해제하지 않는다. 과거 기록만 남은 ID도 삭제 후보로 만들지 않고, 다음 새 검토가 없더라도 전체 완료는 false로 둔다. 이 독립 구현의 29개 시험과 다섯 실행 기록은 원래 프로그램의 24개 시험과 구별한다. 아래 모듈의 전체 코드와 사용법을 읽으면 어느 조건을 바꾸고 무엇을 별도로 연결해야 하는지 확인할 수 있다.

진행 보고에는 한 가지 완료 숫자보다 남은 행동을 남긴다

이번 수정 뒤에도 원래 전체 현장 목표는 진행 중이다. 새 선택 명령이 정상이라고 사진의 보정·출처·면적 근거나 사용자가 맡은 화면 확인까지 끝난 것은 아니다. 보고에는 새로 볼 자료, 이미 본 자료의 후속, 이번에 검증한 코드, 그대로 남긴 보류를 나눠 남기는 편이 맞았다. 이번 재대조에서 새로운 전체 프레임 근거나 검수 완료가 늘지 않았다는 사실도 함께 썼다.

홈페이지 관리에서 다음 작업이라는 문장은 작은 기능처럼 보인다. 하지만 그 문장이 무엇을 반복하게 하고 무엇을 기다리게 하는지에 따라 운영자가 쓰는 시간이 달라진다. 나는 미완료를 없애는 버튼보다 남은 행동을 정확히 읽을 수 있는 구조를 먼저 만들고 싶었다. 비슷한 검수·자료 관리 흐름을 회사 업무에 맞춰 설계할 필요가 있다면 사이트의 이메일 문의로 이야기할 수 있다.