저장한 결정 다시 비교하기

저장한 결정 보고서를 비교해 환불 결정의 변화를 찾고, 그대로 남은 오류와 비교 성공을 구분합니다.

네이티브 리스펙스와 npm CLI, Node.js, Bash를 준비하세요. NATIVE에는 네이티브 실행 파일의 절대 경로를 넣습니다. NPM_CLI에는 설치한 npm 패키지의 bin/lispex.js 경로를 넣습니다. 이 예제는 먼저 네이티브로 보고서를 만듭니다. 이어서 npm의 vouch replay로 저장된 보고서를 비교합니다.

두 사례 준비하기

새 작업 디렉터리에서 보고서를 저장할 디렉터리를 만드세요.

SH
mkdir -p corpus/expected candidate

명령은 화면 출력 없이 종료값 0으로 끝납니다. 다음 네 파일 전체를 UTF-8로 저장하세요. 줄바꿈은 LF를 쓰고 마지막에도 하나를 넣습니다.

refund-old.lspx

LISPEX
(if (<= input 14) '(decision allow) '(decision deny late))

refund-new.lspx

LISPEX
(if (<= input 13) '(decision allow) '(decision deny late))

fault.lspx

LISPEX
(/ input 0)

input.datum

14

이전 규칙은 14일째까지 허용합니다. 새 규칙은 13일째까지 허용합니다. fault.lspx는 두 번 모두 0으로 나누기를 시도합니다.

사례 목록을 corpus/manifest.json으로 저장하세요. 코퍼스는 결과를 비교하기 전에 고른 사례 모음입니다.

JSON
{
  "decision_gallery": "csk.profile-decision-gallery/v0",
  "cases": [
    {
      "stem": "refund",
      "expected_transcript": [
        "(decision allow)"
      ]
    },
    {
      "stem": "fault",
      "expected_transcript": []
    }
  ]
}

각 stem은 corpus/expected 아래의 JSON 파일 이름에서 확장자를 뺀 값입니다. expected_transcript는 기록에서 기대하는 값 목록입니다.

두 규칙의 결과 기록하기

각 소스를 같은 input.datum으로 실행하세요.

SH
"$NATIVE" diff-receipt --input input.datum refund-old.lspx > corpus/expected/refund.json
"$NATIVE" diff-receipt --input input.datum refund-new.lspx > candidate/refund.json
"$NATIVE" diff-receipt --input input.datum fault.lspx > corpus/expected/fault.json
"$NATIVE" diff-receipt --input input.datum fault.lspx > candidate/fault.json

앞의 두 명령은 종료값 0으로 끝납니다. 뒤의 두 명령은 0으로 나누기 때문에 비교하지 못하고 종료값 1로 끝납니다. 각 명령은 지정한 파일에 csk.differential-receipt/v0 보고서 전체를 씁니다. 표준 오류 출력은 비어 있습니다.

보고서comparison.status기록한 결과
corpus/expected/refund.jsonagree(decision allow)
candidate/refund.jsonagree(decision deny late)
두 fault.json 파일not-comparable빈 실행 결과 목록과 E313 진단

여기서 agree는 한 실행 안의 두 실행 방식을 비교한 결과입니다. 네이티브는 소스와 소스에서 만든 Meaning 표현을 각각 평가합니다. 다음 명령은 이전 실행과 새 실행을 비교합니다.

저장한 보고서 비교하기

SH
node "$NPM_CLI" vouch replay corpus --against candidate > replay-report.json

명령은 종료값 1로 끝나며 replay-report.json을 만듭니다. 표준 오류에는 다음 메시지를 씁니다.

replay found behavioral differences
- refund: reference-transcript, meaning-env-transcript

보고서 형식은 csk.replay-report/v0입니다. summary 전체는 다음과 같습니다.

JSON
{
  "status": "changed",
  "exit_code": 1,
  "total": 2,
  "byte_changed": 1,
  "decision_changed": 1,
  "not_projectable": 2,
  "faults": 1
}

환불 결정 하나가 바뀌었습니다. 실행 오류가 있는 사례는 하나입니다. not_projectable: 2는 그 오류 사례의 이전 기록과 새 기록을 각각 센 값입니다.

사례별 결과 읽기

필드환불 사례오류 사례
old.statusagreenot-comparable
new.statusagreenot-comparable
changedtruefalse
decision.decision_changedtruenull

refund의 decision.old.datum은 (decision allow)입니다. decision.new.datum은 (decision deny late)입니다. fault의 두 결정 항목은 모두 status: "not_projected"입니다. 이유는 not-attempted-runtime-or-meaning-fault입니다.

오류 사례의 changed: false는 비교한 보고서 필드가 그대로라는 뜻입니다. not-comparable은 실행에서 비교에 필요한 결과를 얻지 못했다는 뜻입니다. decision_changed: null은 결정 값을 비교할 수 없었다는 뜻입니다. 결과를 받아들이기 전에 이 필드들을 함께 읽으세요.

비교 대상 고르기

corpus/expected에는 이전 보고서를 둡니다. --against candidate는 새 보고서 디렉터리를 고릅니다. 두 보고서 모음과 소스 바이트와 입력 바이트와 실행 파일 식별자를 보존하세요.

--against 값npm 명령이 하는 일
보고서 디렉터리보고서의 일관성을 검사하고 기록된 결과와 비교 상태와 입력 해시와 사례 구성을 비교합니다
1.20.0 같은 버전저장된 엔진 버전과 입력 결속과 일치 상태와 결과를 사례 목록에 맞춰 검사합니다

버전을 지정해도 기존 기록을 읽습니다. 다른 규칙이나 실행 파일의 결과가 필요하면 네이티브로 따로 실행하세요. 보고서 상태는 unchanged, changed, failed-precondition 중 하나입니다. unchanged에도 오류 사례가 남을 수 있으므로 faults와 not_projectable과 사례별 내용을 함께 읽으세요. 종료값 0은 선택한 비교에서 차이가 없다는 뜻입니다. 종료값 1은 차이가 있거나 사전 조건 검사가 실패했다는 뜻입니다. 사용법 오류와 파일 읽기 오류는 종료값 2입니다.

npm 명령은 저장된 증거를 검사합니다. 바우치 인증과 새로운 네이티브 게이트는 별도 단계입니다. 호출 애플리케이션은 요청과 승인 결과의 유효 시점과 재사용 여부를 판단합니다. 외부 행동의 허가와 실행도 호출 애플리케이션이 맡습니다.

리스펙스 바우치 · 바우치 보고서 · 판단 뒤 앱이 할 일