Skip to content

결정론성 확인 ​

이 문서를 끝내면 같은 명세를 두 번 돌려 결과가 같은지 확인하고, 출력의 세 가지 결론이 각각 무엇을 뜻하는지 아는 상태가 된다.

실행 ​

bash
mcpeak test weather.suite.json --determinism -- node ./server.mjs

스위트를 2회 실행해 케이스별 결과를 비교한다. 툴을 2회 호출하므로 부작용이 있는 서버에서는 샌드박스에서 쓴다.

결정론성 확인
→ 2회 실행 결과가 같았습니다. (8/8)
→ 단, 실행 사이에 상태를 복원하지 않았으므로 결정론성 확인은 아닙니다.
  --reset-cmd 로 초기 상태 복원 명령을 지정하면 확인이 됩니다.

세 가지 결론 ​

--json 의 determinism.conclusion뜻
consistentWithoutReset2회 결과가 같았다. 다만 실행 사이에 상태를 복원하지 않아 확인이라 부르지 않는다
deterministic--reset-cmd 로 같은 초기 상태에서 2회 돌렸고 결과가 같았다
nondeterministic차이가 있었다. 차이 지점과 양쪽 값이 출력에 실린다

"두 번 같았다" 와 "결정론적이다" 를 구분하는 이유는 두 번째 실행이 첫 번째가 남긴 상태 위에서 도는 경우가 있어서다. 메모를 저장하는 서버라면 첫 실행이 id: 1 을 만들고 두 번째가 id: 2 를 만든다. 그 차이는 서버의 비결정성이 아니라 상태가 이어진 결과다. 반대로 상태가 이어진 덕에 우연히 같아 보이는 경우도 있다.

초기 상태 복원 ​

bash
mcpeak test notes.suite.json --determinism --reset-cmd "rm -f $HOME/.notes.json" -- node ./server.mjs

--reset-cmd 는 각 실행 전에 한 번 돈다. 셸을 거치지 않으므로 파이프나 && 는 쓸 수 없다. 서버가 HOME 아래 파일을 상태로 쓰면 이렇게 지우면 되고, 데이터베이스면 초기화 스크립트를 가리킨다.

판정을 막지 않는다 ​

이 확인은 비차단 진단이다. 차이를 찾아도 종료 코드는 케이스 판정 그대로이며, 이것만으로 1 이 되지 않는다. CI 에서 막으려면 --json 의 determinism 키를 읽는다.

json
{
  "compared": 8,
  "skipped": 0,
  "differences": [],
  "conclusion": "consistentWithoutReset"
}

차이 지점의 비밀값 ​

차이가 있으면 양쪽 값을 화면에 싣는다. token · apiKey 같은 이름의 자리는 가려지지만, 서버가 결과를 JSON 문자열로 만들어 text 블록 하나에 실으면 그 안의 값은 이름이 없어 가려지지 않는다. 실행마다 비밀값을 새로 발급하는 서버라면 출력을 CI 로그에 남기기 전에 확인한다.

세션과 함께 쓸 수 없다 ​

--determinism 은 서버에 2회 연결하는데 External 세션은 연결 하나에 묶여 있다. 2회차가 같은 세션을 쓰면 반복 호출 순번이 어긋나고, 새 세션을 쓰면 비교 기준이 갈라진다. 그래서 두 옵션은 함께 받지 않는다.