최종 파일 인계를 검사하고 현재의 approve 결정을 읽습니다. 그다음 인쇄 작업을 보낼지는 앱이 정합니다.
네이티브와 Bash를 사용하세요. 먼저 바우치 사용 가이드를 완료하세요. 그때 만든 print-handoff.lspx, policy.json, 발급자 키를 사용합니다. 인쇄소는 허용할 소스와 공개키, 실행 파일, 입력을 독립적으로 고릅니다.
인쇄 요청 묶기
다음 파일 전체를 UTF-8과 LF 줄바꿈으로 current-request.checked.json에 저장하고 마지막 줄도 줄바꿈으로 끝내세요.
{
"input": "csk.checked-input/v1",
"value": [
true,
true,
true,
true,
"edition-final",
"print-request-123",
"operator-7",
"print",
1785600000
]
}앞의 네 값은 판형과 여백, 글꼴 포함, 쪽수의 통과 여부입니다. 다섯 번째 값은 최종 파일 판을 식별합니다. 뒤의 값들은 요청 ID와 행위자, 행동, 만료 시각을 서명된 입력에 묶습니다.
만료 시각은 고정된 실습 데이터입니다. 실제 작업에서는 앱이 신뢰할 수 있는 사실을 전달하고 행위자를 인증하며 서버 시각으로 만료를 검사합니다. 규칙은 앞의 네 값만 읽지만 서명된 입력은 아홉 값 전체를 묶습니다.
요청 발급하고 다시 확인하기
ISSUER_KEY_URI는 바우치 가이드에서 사용한 개인 키의 절대 경로로 설정하세요. 요청마다 새 출력 경로를 사용하세요.
lispex vouch issue --source print-handoff.lspx \
--input current-request.checked.json --profile csk.checked-profile/v1 \
--key-handle "$ISSUER_KEY_URI" --out-dir current-request-issued --emit-bundle
lispex vouch gate --bundle current-request-issued/vouch-input-bundle.json \
--trust-policy policy.json --source print-handoff.lspx \
--input current-request.checked.json --profile csk.checked-profile/v1 \
--require-decision approve --report-out current-request-gate.json두 명령은 화면 출력 없이 종료 코드 0으로 끝납니다. 발급은 current-request-issued 아래에 issue-report.json, payload.json, envelope.dsse.json, vouch-input-bundle.json을 만듭니다. 발급 보고서의 상태는 issued-native입니다. 게이트는 다음 결과가 든 current-request-gate.json을 만듭니다.
{
"basis": "csk.current-native-agreement/v0",
"observed_decision": "approve",
"reason": null,
"required_decision": "approve",
"status": "granted"
}게이트는 기록을 인증하고 별도로 전달한 소스와 입력을 묶은 뒤 이번 네이티브 호출에서 규칙을 다시 실행합니다. 바우치는 기록과 재실행 결과의 일치를 확인하고 실제 행동은 앱이 정합니다.
게이트를 요청 기록으로 읽기
current-request-gate.json을 정확한 검사 입력과 서명 묶음과 함께 보관하세요. 다음 필드는 이번 호출에서 확인한 대상을 나타냅니다.
| 필드 | 뜻 |
|---|---|
context.input_sha256 | 정확한 검사 입력 바이트의 바우치 식별자 |
context.source_sha256 | 허용된 규칙 소스 식별자 |
context.envelope_sha256 | 이번 호출이 사용한 서명 봉투 |
authentication.status | 해당 요청의 인증 결과 authenticated |
comparison.current_vs_signed | 전체 실행 기록의 비교 결과 agree |
reexecution.status | 새 실행의 결과 execution-agreed |
gate.status | 현재 결정이 요구와 맞으면 granted |
앱은 감사 기록에 요청 ID와 인증한 행위자, 행동, 만료 시각, 파일 판, 인쇄소 트랜잭션 ID, 최종 처리 상태를 더합니다. 정확한 입력과 게이트 보고서 바이트도 함께 보관하세요. 바우치 입력 식별자는 자체 해시 영역을 쓰므로 일반 파일 SHA-256과는 다른 식별자입니다.
수신한 결정 묶음과 앱의 트랜잭션은 각각의 기록을 사용합니다. 작업을 보내기 전에 요청 ID를 원자적으로 예약하세요. 인쇄 서비스의 멱등성 규칙에 따라 응답을 보관합니다. 시간이 초과되면 트랜잭션 상태를 대조한 뒤 재시도하세요.
거절된 요청 처리하기
다음 결과는 이 실습과 앞선 바우치 가이드의 파일로 확인할 수 있습니다.
| 변경 | 실제 결과 | 앱이 할 일 |
|---|---|---|
다섯 값의 issued 묶음에 아홉 값 요청 전달 | 종료 코드 1, native-request-input-mismatch, 게이트 not-evaluated | 요청 전용 묶음 발급 |
소스를 주면서 --input 생략 | 실행 전 사용법 오류와 종료 코드 2 | 소스와 입력을 함께 제공 |
승인 입력에 deny 요구 | 종료 코드 10, 게이트 denied, 이유 required-decision-mismatch | 중단하고 결정 확인 |
| 행위자와 행동, 만료, 요청 재사용에 관한 앱 검사 실패 | 앱의 거절 | 인쇄 전송 전에 중단 |
입력이 다르면 게이트가 지정한 경로에 진단 보고서를 씁니다. 사용법 오류는 보고서를 만들지 않습니다. 요구 결정이 다르면 거절 보고서를 만들고 표준 출력은 비워 둡니다. 거절된 요청은 인쇄 완료 기록과 따로 보관하세요.
앱에서 인쇄 작업 보내기
- 작업자를 인증하고 최종 파일과 신뢰할 수 있는 검사 사실을 읽습니다.
- 요청 행동과 만료 시각, 파일 판과 정확한 파일 바이트의 연결을 확인합니다.
- 정확한 소스와 입력으로
approve를 요구하는 새 바우치 게이트를 실행합니다. - 앱 저장소에서 요청 ID를 원자적으로 예약합니다.
- 앱의 인쇄소 연결을 통해 파일을 보냅니다.
- 인쇄소의 응답을 저장하고 요청을 완료로 표시합니다.
- 결과가 불명확하면 재시도 전에 실제 상태를 확인합니다.
위 명령은 게이트 보고서를 만드는 데서 끝납니다. 예약과 인쇄, 복구는 앱이 구현합니다. 최종 파일과 서명된 입력, 묶음, 정책, 게이트 보고서, 인쇄소 응답을 보관하면 인쇄 사고 때 양쪽이 확인할 수 있습니다.
인증과 입력 결속, 실행, 요구 결정 중 하나라도 실패하면 요청을 중단하고 진단을 읽으세요. 저장된 게이트 보고서는 과거 호출의 기록입니다. 현재 요청에는 새 게이트를 실행하세요.