통신이 불안정할 때 같은 요청을 다시 조회할 수 있으면 편하다. 하지만 같은 요청 ID에 내용까지 바뀌면 무엇을 재사용해야 할까. 북극성의 로컬 연결은 ID와 요청 내용의 짝을 보관하고, 그 짝이 바뀌면 새 실행으로 해석하지 않고 거절한다.

ID는 이름표이고 내용은 별도 계약이다

요청 ID만 보고 이전 결과를 돌려주면 새 내용이 실행되지 않았는데도 호출자가 새 요청의 성공으로 착각할 수 있다. 반대로 내용을 바꿔 같은 ID로 또 실행하면 중복 방지를 기대한 호출자에게 다른 행동이 생긴다. 두 경우 모두 ID의 의미가 흔들린다.

서버는 검증된 request를 JSON 문자열로 직렬화한 fingerprint를 함께 보관한다. 이미 있는 ID의 fingerprint와 다르면 MCP_REQUEST_ID_REUSED가 된다. 이 비교는 자연어 의미의 동일성을 판단하는 AI가 아니다. 같은 요청으로 재조회할 조건을 기계적으로 고정하는 계약이다.

완료 결과만이 아니라 진행 중 약속을 저장한다

replies에는 fingerprint와 reply Promise가 함께 들어간다. 처음 실행이 아직 끝나지 않았어도 같은 ID와 같은 내용의 다음 연결은 그 Promise를 기다린다. 결과가 없다고 두 번째 execute를 시작하지 않는 구조다.

실행 함수가 시작된 뒤 소켓이 끊겨도 Promise의 작업은 호스트에 남을 수 있다. 나중에 같은 영수증을 읽을 때는 그 작업의 결과를 이어 받는다. 이것이 원격 서비스까지 포함한 정확히 한 번 처리 보장은 아니지만, 이 프로세스의 같은 요청이 중복 실행되는 경로를 줄이는 구체적인 방법이었다.

영수증을 오래된 순서로 지우지 않았다

서버의 영수증 수에는 상한이 있다. 다 찼을 때 오래된 변경 요청의 영수증을 지우고 자리를 만드는 대신 새 ID를 거절한다. 지운 ID가 다시 들어오면 처음 보는 요청으로 처리돼 불확실한 입력을 반복할 수 있기 때문이다.

실행 메모리를 무한히 쓰지 않는 것과 중복 전달을 막는 기준 사이에서 실패를 드러내는 쪽을 택했다. 상한을 만났다면 운영자가 현재 작업과 결과를 확인해 정리해야 한다. 자동으로 프로세스를 재시작해 영수증을 없애는 것을 같은 보장의 연장으로 설명할 수는 없다.

요청 영수증과 업무 원장은 수명이 다르다

이 Map은 서버 프로세스 수명 안의 영수증이다. 브라우저를 재시작해도 영원히 같은 ID가 보호된다고 쓰지 않는다. 플러그인 실행 ID와 지속 저장된 업무 기록, 페이지의 실제 저장 결과는 각각 다른 계층에서 확인해야 한다.

요청 ID를 저장했다고 제목과 본문이 같은 두 요청을 사업적으로 같은 업무라고 판단하는 것도 아니다. 새 ID를 쓰면 같은 내용이라도 별도 요청이 될 수 있다. 업무 항목 지문과 결과 재사용은 별도 원장의 책임이다. 전송 중복 방지와 업무 중복 방지를 한 기능으로 섞지 않았다.

오류도 같은 요청의 결과로 남을 수 있다

execute에서 발생한 오류는 ok:false 결과로 정리돼 같은 Promise의 영수증에 남는다. 같은 ID를 다시 보낸다고 실패한 실행을 몰래 다시 시작하지 않는다. 입력을 고쳤다면 새 요청의 의미와 현재 상태를 확인해야 한다.

관련 통합 시험은 같은 ID와 context를 두 번 보내 execute가 한 번 호출됐는지 본다. 그 ID로 tools 요청을 보내면 거절되고 호출 수가 늘지 않는지도 확인한다. 나는 해당 코드와 시험을 읽어 범위를 대조했다. 새 운영 요청을 보내 원고나 예약을 실제로 중복시키는 시험은 하지 않았다.

수정하려는 의도와 재조회하려는 의도를 나눈다

호출자 입장에서도 두 행동을 구별해야 한다. 같은 요청의 결과를 다시 받으려면 ID와 내용을 유지한다. 새 내용을 실행하려면 이전 결과와 사용자 요청 범위를 확인한 뒤 새 작업으로 구성한다. 오류 메시지를 없애기 위해 ID만 계속 바꾸면 이 보호를 스스로 우회하는 셈이다.

회사 업무의 전송 API도 이 구분이 중요하다. 어떤 ID가 어느 입력을 뜻하고 얼마나 오래 보관되며 재시작 뒤에는 무엇을 읽어야 하는지 명시해야 한다. 나는 영수증을 편의 캐시보다 실행 책임의 기록으로 다뤘다. 같은 번호가 다른 명령이 되는 순간을 거절하는 작은 검사가 그 기준을 지킨다.