VibePackr Enterprise · Part.5
Part.5 · SDK Engine 실습·연동 후보
첫 사용 점검·복귀 지점
- 시작 지점
- W1에서 새 연습 폴더·동일 버전 예제를 준비하고 전체 Custom 요청을 분석합니다. 각 결과마다 A(run) 또는 B(run-offline) 하나만 선택합니다.
- 필요한 준비물
- 실제 SDK 경로·지원 Rust·네이티브 도구가 필요하며 B에서만 선택 세트를 검증합니다. Bash의 네이티브 옵션 배열은 W1~W4에서 유지하며 Windows는 별도 명령을 사용합니다.
- 확인할 실습 결과
- 각 결과의 README·소스·manifest를 읽고 소스·라이브러리 해시를 따로 확인합니다. 네 파일·다섯 단계·후보 상태는 실행·등록된 연동을 뜻하지 않습니다.
실습·다음 단계
실패 시 바로 열기
번호·파일 이름 읽는 법
Part.1~8은 현재 도구별 매뉴얼, W1~W4와 GUI-01 같은 코드는 그 안의 실습입니다. Use Case 1~5는 보존한 작업 안내 번호이며 Part 번호와 다릅니다. Case A~J와 SDK-1·IH-1 같은 코드는 문제 해결 사례입니다. 이전 파일 이름과 pN 절 주소는 기존 북마크용으로 유지하므로 현재 Part는 본문 제목으로 확인합니다.
실습 파일: 내려받기 전에 용도 확인
JSON은 소스·전체 요청·의도적 오류 예제를 구분합니다. TXT는 사람이 채우는 양식이며 프로필·API 입력·GAPE manifest가 아닙니다. 파일이 브라우저에 열리면 다른 이름으로 저장하고 UTF-8/확장자를 확인하십시오.
시작 전에: 파일 종류·경로·셸 확인
이 문서 첫머리의 실습 파일을 새 작업 폴더에 저장하고 역할을 확인합니다. TXT 양식은 사람이 작성하는 메모이며 앱 프로필·API 요청·GAPE manifest가 아닙니다. JSON도 소스 Document, 전체 요청, 의도적 오류 예제를 구분합니다.
macOS/Linux는 bash, Windows는 PowerShell 블록을 사용합니다. 프롬프트는 복사하지 않습니다. /absolute/path·C:\absolute\path·대괄호는 실제 제공 값으로 먼저 바꾸고 따옴표를 유지합니다. 변수가 있는 명령은 준비 절과 같은 셸에서 실행합니다. 새 셸이면 경로만 다시 지정하며 기존 결과·로그를 덮지 않습니다. 긴 코드/표는 가로 스크롤할 수 있습니다.
회사별 연결/등록·승인·지원 Pack·게시 대상·승인 manifest가 필요한 단계에서는 실제 제공 자료가 있어야 합니다. 없는 자료의 ID·화면 이름·주소를 만들어 진행하지 않습니다. 각 W 절의 정상 결과와 실패 후 복귀 기준을 모두 읽고 한 단계씩 수행합니다.
W1 · SDK-01: 설치 경로 복원부터 Custom 결과까지
Part.1에서 준비한 SDK 설치가 필요합니다. 다른 루트에 설치했다면 첫 줄의 sdk_install/$sdkInstall만 실제 경로로 바꿉니다. 새 연습 폴더 VibePackr-SDK-practice-01을 사용하며 결과 최종 폴더는 미리 만들지 않습니다. 같은 이름이 있으면 새 번호를 고릅니다. 이 Part 앞의 다운로드 파일은 전체 입력을 살펴보는 용도이며 기본 실습은 설치된 SDK의 같은 버전 예제를 복사합니다.
sdk_install="$HOME/VibePackr-SDK-install-01"
sdk_exe="$sdk_install/sdk/bin/packr-sdk-engine"
sdk_deps="$sdk_install/dependencies"
sdk_native_args=()
sdk_practice="$HOME/VibePackr-SDK-practice-01"
test -x "$sdk_exe" || exit 1
test -f "$sdk_install/sdk/examples/read-only-custom-api.json" || exit 1
test -f "$sdk_install/sdk/examples/read-only-mcp-transcript.json" || exit 1
test ! -e "$sdk_practice" || exit 1
umask 077
mkdir -m 700 "$sdk_practice" || exit 1
mkdir "$sdk_practice/inputs" "$sdk_practice/runs" || exit 1
cp "$sdk_install/sdk/examples/read-only-custom-api.json" "$sdk_practice/inputs/custom.json" || exit 1
cp "$sdk_install/sdk/examples/read-only-mcp-transcript.json" "$sdk_practice/inputs/mcp.json" || exit 1
"$sdk_exe" analyze "$sdk_practice/inputs/custom.json" unused || exit 1$sdkInstall = Join-Path $env:USERPROFILE 'VibePackr-SDK-install-01'
$sdkExe = Join-Path $sdkInstall 'sdk\bin\packr-sdk-engine.exe'
$sdkDeps = Join-Path $sdkInstall 'dependencies'
$sdkPractice = Join-Path $env:USERPROFILE 'VibePackr-SDK-practice-01'
if (!(Test-Path -LiteralPath $sdkExe -PathType Leaf)) { throw 'Set the actual installed SDK path' }
if (Test-Path -LiteralPath $sdkPractice) { throw 'Choose a fresh practice path' }
New-Item -ItemType Directory -Path $sdkPractice -ErrorAction Stop | Out-Null
$sdkInputs = Join-Path $sdkPractice 'inputs'
$sdkRuns = Join-Path $sdkPractice 'runs'
New-Item -ItemType Directory -Path $sdkInputs,$sdkRuns -ErrorAction Stop | Out-Null
Copy-Item -LiteralPath (Join-Path $sdkInstall 'sdk\examples\read-only-custom-api.json') -Destination (Join-Path $sdkInputs 'custom.json') -ErrorAction Stop
Copy-Item -LiteralPath (Join-Path $sdkInstall 'sdk\examples\read-only-mcp-transcript.json') -Destination (Join-Path $sdkInputs 'mcp.json') -ErrorAction Stop
& $sdkExe analyze (Join-Path $sdkInputs 'custom.json') unused
if ($LASTEXITCODE -ne 0) { throw 'Analyze failed' }아래 두 실행 경로 중 하나만 선택합니다. 온라인 기존 툴체인은 지원 Rust/네이티브 도구가 준비돼야 합니다. 선택 세트는 네트워크가 있는 환경에서도 쓸 수 있고 제품 기본값이 아닙니다. 검사 실패를 우회하려고 경로를 바꾸지 않습니다.
A. 기존 설치 툴체인의 run:
"$sdk_exe" run "$sdk_practice/inputs/custom.json" "$sdk_practice/runs/custom-01" || exit 1& $sdkExe run (Join-Path $sdkInputs 'custom.json') (Join-Path $sdkRuns 'custom-01')
if ($LASTEXITCODE -ne 0) { throw 'Candidate failed; preserve this attempt' }B. 선택 의존성 세트의 run-offline: 먼저 자기 OS의 검증 한 블록만 수행합니다.
# macOS ARM64 only
"$sdk_exe" verify-offline-dependencies MACOS_ARM64 "$sdk_deps" || exit 1# Debian 13 AMD64 only
"$sdk_exe" verify-offline-dependencies DEBIAN_13_AMD64 "$sdk_deps" || exit 1& $sdkExe verify-offline-dependencies WINDOWS_AMD64 $sdkDeps
if ($LASTEXITCODE -ne 0) { throw 'Dependency verification failed' }Bash 준비의 sdk_native_args=()는 추가 네이티브 옵션이 없는 배열입니다. 기본 SYSTEM_ACTIVE와 Debian은 비워 둡니다. macOS에서 이미 설치된 Command Line Tools 경로를 명시적으로 선택한 경우에만 첫 run-offline 전에 같은 Bash에서 한 번 지정합니다.
# macOS CLT 경로 전용; SYSTEM_ACTIVE 또는 Debian은 생략
sdk_native_args=(--macos-developer-selection COMMAND_LINE_TOOLS)아래 Bash run-offline은 같은 배열을 펼치므로 W2~W4에서도 선택을 유지합니다. 새 Bash에서는 경로 변수와 선택 배열만 복원하고 연습 폴더를 다시 만들지 않습니다. Bash 배열이며 PowerShell 명령이 아닙니다.
검증이 실제 통과한 후:
"$sdk_exe" run-offline "$sdk_practice/inputs/custom.json" "$sdk_practice/runs/custom-01" "$sdk_deps" "${sdk_native_args[@]}" || exit 1& $sdkExe run-offline (Join-Path $sdkInputs 'custom.json') (Join-Path $sdkRuns 'custom-01') $sdkDeps
if ($LASTEXITCODE -ne 0) { throw 'Candidate failed; preserve this attempt' }선택 배열이 각 B 실행에 macOS 옵션을 전달합니다. 기본은 SYSTEM_ACTIVE이며 시스템 개발 도구 선택을 바꾸지 않습니다. Windows는 Bash 배열 없이 별도 PowerShell 명령을 사용합니다.
| 성공 결과에서 직접 볼 것 | 위치·기대 내용 |
|---|---|
| 최종 폴더 | runs/custom-01; 비공개 실패 stage와 다름 |
| 생성 파일 | adapter.rs, libadapter.rlib, README.md, manifest.json |
| manifest.status·authority_granted | CUSTOMER_REVIEW_CANDIDATE·false |
| stages·stage_digests | ANALYZE_GAP, GENERATE, BUILD, VALIDATE, PACKAGE |
| files | README.md·adapter.rs·libadapter.rlib의 지문 |
텍스트 편집기에서 README·adapter.rs·manifest를 엽니다. .rlib는 실행 파일이 아니므로 더블클릭하지 않습니다. analyze 거부는 전체 입력/인코딩, TOOLCHAIN_UNAVAILABLE는 선택 경로/네이티브 전제 조건, OUTPUT_EXISTS_OR_UNAVAILABLE는 기존 결과/쓰기 가능한 새 경로로 분류합니다. 어느 단계든 거부되면 원래 결과를 보존하고 다음 예제로 넘어가지 않습니다.
W2 · SDK-02: MCP를 다른 결과 폴더에 실행하기
W1의 설치·연습 경로 변수를 그대로 사용합니다. inputs/mcp.json은 준비 단계에서 복사됐습니다. tools/list, read_repository, 합성 응답과 name→repository_id/sha→revision 매핑을 읽고 전체 입력을 분석합니다.
"$sdk_exe" analyze "$sdk_practice/inputs/mcp.json" unused || exit 1& $sdkExe analyze (Join-Path $sdkInputs 'mcp.json') unused
if ($LASTEXITCODE -ne 0) { throw 'Analyze failed; preserve the original error' }W1에서 선택한 경로 한 가지만 실행합니다.
A. run:
"$sdk_exe" run "$sdk_practice/inputs/mcp.json" "$sdk_practice/runs/mcp-01" || exit 1& $sdkExe run (Join-Path $sdkInputs 'mcp.json') (Join-Path $sdkRuns 'mcp-01')
if ($LASTEXITCODE -ne 0) { throw 'Candidate failed; preserve this attempt' }B. run-offline:
"$sdk_exe" run-offline "$sdk_practice/inputs/mcp.json" "$sdk_practice/runs/mcp-01" "$sdk_deps" "${sdk_native_args[@]}" || exit 1& $sdkExe run-offline (Join-Path $sdkInputs 'mcp.json') (Join-Path $sdkRuns 'mcp-01') $sdkDeps
if ($LASTEXITCODE -ne 0) { throw 'Candidate failed; preserve this attempt' }Mac CLT 선택을 썼다면 B에 같은 옵션을 적용합니다. mcp-01의 네 파일·다섯 단계·입력 지문을 따로 읽습니다. 이는 제공된 MCP 기록의 로컬 분석·매핑 검증이며 MCP 서버에 연결하거나 자격 증명을 검사하지 않습니다. 실제 대상/프로토콜 거부가 나오면 그 사유를 인계하고 실제 서버 호출로 바꾸지 않습니다.
W3 · SDK-03: 문자열 점수를 수정하고 새 후보 만들기
먼저 사본만 만듭니다.
test ! -e "$sdk_practice/inputs/custom-02.json" || exit 1
cp "$sdk_practice/inputs/custom.json" "$sdk_practice/inputs/custom-02.json" || exit 1$sdkModified = Join-Path $sdkInputs 'custom-02.json'
if (Test-Path -LiteralPath $sdkModified) { throw 'Choose a fresh input name' }
Copy-Item -LiteralPath (Join-Path $sdkInputs 'custom.json') -Destination $sdkModified -ErrorAction Stop텍스트 편집기에서 custom-02.json의 다음 두 값만 바꾸고 UTF-8로 저장합니다. 전체 JSON을 아래 발췌로 덮어쓰지 않습니다.
draft.fixture.response.score = "88"
draft.fixture.response.component = "my-test-component"논리적 변환 기대 예: component="my-test-component", 정수 quality_score=88. 이 객체를 stdout에 따로 출력하는 명령은 아니며 실제 API 응답도 아닙니다. 제공한 custom-api-score-number.json은 반대로 score를 숫자로 만든 의도적 형식 오류 예제입니다. 정상 입력과 구분하고 이를 통과시킬 목적으로 선언을 바꾸지 않습니다.
"$sdk_exe" analyze "$sdk_practice/inputs/custom-02.json" unused || exit 1& $sdkExe analyze (Join-Path $sdkInputs 'custom-02.json') unused
if ($LASTEXITCODE -ne 0) { throw 'Analyze failed; preserve the original error' }분석이 실제 통과하면 선택 경로로 실행합니다.
A. run:
"$sdk_exe" run "$sdk_practice/inputs/custom-02.json" "$sdk_practice/runs/custom-02" || exit 1& $sdkExe run (Join-Path $sdkInputs 'custom-02.json') (Join-Path $sdkRuns 'custom-02')
if ($LASTEXITCODE -ne 0) { throw 'Candidate failed; preserve this attempt' }B. run-offline:
"$sdk_exe" run-offline "$sdk_practice/inputs/custom-02.json" "$sdk_practice/runs/custom-02" "$sdk_deps" "${sdk_native_args[@]}" || exit 1& $sdkExe run-offline (Join-Path $sdkInputs 'custom-02.json') (Join-Path $sdkRuns 'custom-02') $sdkDeps
if ($LASTEXITCODE -ne 0) { throw 'Candidate failed; preserve this attempt' }Mac CLT를 사용했다면 같은 옵션을 유지합니다. 원본/수정 입력 지문과 두 결과의 manifest를 비교합니다. 매핑이 같으므로 adapter.rs는 같을 수 있고 입력/실행 기록은 달라질 수 있습니다. 오류가 나면 전체 입력·문자열 타입·UTF-8부터 확인합니다.
W4 · SDK-04: 같은 입력을 반복하고 파일별로 비교하기
W1의 원래 inputs/custom.json과 같은 OS·SDK·컴파일러·의존성·실행 경로를 유지합니다. 이번에는 custom-repeat-01이라는 새 최종 경로를 사용합니다.
A. run:
"$sdk_exe" run "$sdk_practice/inputs/custom.json" "$sdk_practice/runs/custom-repeat-01" || exit 1& $sdkExe run (Join-Path $sdkInputs 'custom.json') (Join-Path $sdkRuns 'custom-repeat-01')
if ($LASTEXITCODE -ne 0) { throw 'Candidate failed; preserve this attempt' }B. run-offline:
"$sdk_exe" run-offline "$sdk_practice/inputs/custom.json" "$sdk_practice/runs/custom-repeat-01" "$sdk_deps" "${sdk_native_args[@]}" || exit 1& $sdkExe run-offline (Join-Path $sdkInputs 'custom.json') (Join-Path $sdkRuns 'custom-repeat-01') $sdkDeps
if ($LASTEXITCODE -ne 0) { throw 'Candidate failed; preserve this attempt' }Mac CLT를 썼다면 같은 옵션을 적용한 뒤 파일별 지문을 조회합니다.
# macOS
shasum -a 256 "$sdk_practice/runs/custom-01/adapter.rs" "$sdk_practice/runs/custom-repeat-01/adapter.rs"
shasum -a 256 "$sdk_practice/runs/custom-01/libadapter.rlib" "$sdk_practice/runs/custom-repeat-01/libadapter.rlib"# Linux
sha256sum "$sdk_practice/runs/custom-01/adapter.rs" "$sdk_practice/runs/custom-repeat-01/adapter.rs"
sha256sum "$sdk_practice/runs/custom-01/libadapter.rlib" "$sdk_practice/runs/custom-repeat-01/libadapter.rlib"Get-FileHash -LiteralPath (Join-Path $sdkRuns 'custom-01\adapter.rs'),(Join-Path $sdkRuns 'custom-repeat-01\adapter.rs') -Algorithm SHA256
Get-FileHash -LiteralPath (Join-Path $sdkRuns 'custom-01\libadapter.rlib'),(Join-Path $sdkRuns 'custom-repeat-01\libadapter.rlib') -Algorithm SHA256adapter.rs끼리, libadapter.rlib끼리 비교합니다. manifest 전체 해시가 같아야 하는 것은 아닙니다. 입력 지문·컴파일러·다섯 단계·의존성 전후 기록도 확인합니다. 같은 조건에서 파일 지문이 다르면 두 입력/결과와 버전을 보존해 SDK-4 사례로 인계합니다. 새 터미널에서는 설치·연습 경로 변수만 다시 지정하며 준비 폴더 생성 명령을 반복하지 않습니다.
추가 용례·체크리스트
이 Part를 읽는 순서
준비물 확인 → 목적에 맞는 용례 선택 → 뒤의 첫 실습·실제 명령 수행 → 결과 읽기 → 수정·반복 → 실패 시 해당 사례로 이동합니다. 숫자 순서가 모든 도구의 필수 설치 순서는 아닙니다. 필요한 도구만 선택하십시오.
시작 조건과 입력
지원 OS SDK, 전체 포함 예제, 기존 툴체인 또는 선택 Rust 세트, OS 네이티브 전제 조건.
온라인과 오프라인을 모두 사용할 수 있습니다. SDK의 선택 Rust 의존성 세트는 폐쇄형 온프렘의 SDK 빌드용이며 전체 제품의 기본값이 아닙니다. 회사별 endpoint·승인·등록 자료가 필요한 용례는 실제 제공 자료를 사용합니다.
실습과 사례 찾아보기
| 용례 | 해볼 일 |
|---|---|
| SDK-01 | Custom 예제의 다섯 단계 완료 |
| SDK-02 | MCP 합성 기록으로 별도 후보 생성 |
| SDK-03 | 값을 바꾸고 두 후보 비교 |
| SDK-04 | 동일 입력의 재현성과 보관 |
용례 SDK-01 · Custom 예제의 다섯 단계 완료
처음 SDK를 사용하는 개발자가 제공된 read-only-custom-api.json을 실행합니다. 온라인 기존 툴체인과 선택 세트 경로 중 하나를 먼저 고릅니다.
진행 순서:
- 현재 OS용 본체·선택한 툴체인·네이티브 전제 조건을 준비하고 지문을 대조합니다.
- 새 개인 폴더에 해제하고 전체 예제를 analyze합니다. 선택 세트는 전체 의존성 검증도 수행합니다.
- OS별 명령으로 기존에 없는 custom-01 결과 경로에 실행합니다. 최종 폴더를 미리 만들지 않습니다.
- 네 파일과 manifest의 stages/stage_digests/files를 읽고 원본 입력·실행 경로를 기록합니다.
결과를 이렇게 읽습니다: CUSTOMER_REVIEW_CANDIDATE의 로컬 합성 후보입니다. 실제 API 연결은 하지 않습니다.
실패·다음 분기: analyze 입력 거부, native/toolchain 거부, 기존 출력 거부를 분리하고 아래 SDK-1~4에서 조치합니다.
남길 기록: OS·SDK/입력 지문·선택 경로·컴파일러·다섯 단계·manifest.
내 연습 기록: 수행 시각·버전·입력 참조·실제로 한 단계·관찰 결과·다음 담당자를 채우십시오. 예시에 적힌 기대 결과를 그대로 성공 기록에 복사하지 않습니다.
용례 SDK-02 · MCP 합성 기록으로 별도 후보 생성
레거시 저장소의 인터페이스를 검토하기 위해 제공 MCP 기록을 사용합니다. 기록 분석은 MCP 서버 접속과 다릅니다.
진행 순서:
- read-only-mcp-transcript.json 전체에서 tools/list·read_repository와 합성 응답을 읽습니다.
- name→repository_id, sha→revision의 선언된 매핑과 읽기 전용 범위를 확인합니다.
- 같은 설치의 선택 경로로 analyze 후 별도 mcp-01에 실행합니다. Custom 결과를 덮어쓰지 않습니다.
- 해당 MCP 후보의 소스·라이브러리·manifest와 단계·입력 지문을 확인합니다.
결과를 이렇게 읽습니다: MCP 기록 기반 로컬 매핑 후보이며 실제 MCP 호출·자격 증명 검증은 아닙니다.
실패·다음 분기: 미지원 프로토콜·작업·권한이면 실제 사유를 기록하고 제공 예제/대상 범위를 확인합니다.
남길 기록: MCP 전체 입력 지문, 매핑·작업·후보 경로와 manifest.
내 연습 기록: 수행 시각·버전·입력 참조·실제로 한 단계·관찰 결과·다음 담당자를 채우십시오. 예시에 적힌 기대 결과를 그대로 성공 기록에 복사하지 않습니다.
용례 SDK-03 · 값을 바꾸고 두 후보 비교
score를 문자열 "88", component를 "my-test-component"로 바꾸고 첫 결과와 비교합니다. 매핑은 그대로 유지합니다.
진행 순서:
- 제공 예제 전체를 새 inputs-02/input.json으로 복사하고 원본을 보존합니다.
- draft.fixture.response의 두 값만 UTF-8로 수정합니다. score의 문자열 따옴표를 유지합니다.
- analyze 후 새 custom-api-candidate-02에 실행하고 원래 결과를 유지합니다.
- adapter.rs·libadapter.rlib 지문과 manifest의 입력/단계 지문을 각각 비교합니다.
결과를 이렇게 읽습니다: 합성 값 변경은 매핑 소스를 바꾸지 않을 수 있고 입력/실행 기록은 달라질 수 있음을 확인합니다.
실패·다음 분기: 생성 소스·manifest를 고쳐 기존 검증과 맞추지 않습니다. 발췌만 저장했다면 전체 입력부터 복원합니다.
남길 기록: 원본/수정 입력 지문, 두 후보와 차이 항목·예상/실제 관찰.
내 연습 기록: 수행 시각·버전·입력 참조·실제로 한 단계·관찰 결과·다음 담당자를 채우십시오. 예시에 적힌 기대 결과를 그대로 성공 기록에 복사하지 않습니다.
용례 SDK-04 · 동일 입력의 재현성과 보관
다른 결과 폴더에서도 같은 라이브러리가 나오는지 확인합니다. 다른 OS끼리 비교하는 실험이 아닙니다.
진행 순서:
- 같은 OS·SDK·컴파일러·의존성·전체 입력 지문·실행 경로를 고정합니다.
- 동일 입력을 새 repeat 결과 경로에 실행하고 두 결과를 보존합니다.
- adapter.rs와 libadapter.rlib의 지문을 각각 대조하고 단계·의존성 전후 기록을 함께 확인합니다.
- manifest 전체 바이트는 실행 기록 차이로 달라질 수 있으므로 내용별 차이를 적습니다.
결과를 이렇게 읽습니다: 일치하면 해당 OS·버전·입력 조건의 재현성으로 기록합니다. 전체 플랫폼 결정성 인증은 아닙니다.
실패·다음 분기: 조건이 같은데 지문이 다르면 기존 결과를 보존하고 SDK-4의 최소 기록으로 인계합니다.
남길 기록: 두 입력·SDK/컴파일러/세트 식별자, 두 소스/라이브러리 지문과 manifest.
내 연습 기록: 수행 시각·버전·입력 참조·실제로 한 단계·관찰 결과·다음 담당자를 채우십시오. 예시에 적힌 기대 결과를 그대로 성공 기록에 복사하지 않습니다.
반복 사용·수정·실패 후 재개
이전 입력·버전·검증·결과를 보존하고 새 입력 또는 새 리비전을 구분합니다. SDK/GAPE 파일 출력은 새 경로를 쓰고, Builder는 제품이 반환한 새 후보 리비전을 기록합니다. Helper는 단계 결과를 다음 명령의 입력으로 바꾸지 않고 같은 전체 요청을 사용합니다. 진행 중이거나 결과가 불명확한 Work는 먼저 기존 ID로 조회합니다.
터미널을 닫았다면 절대 경로와 선택 환경을 다시 지정합니다. 실제 변경의 영향을 받는 단계부터 재확인하고, 회사별 권한·등록·승인이 미완료이면 그 상태로 인계합니다. 지원에는 최소 메시지와 공개 가능한 참조를 사용하며 비밀키·원문 프롬프트·고객 응답·전체 로그를 일괄 전달하지 않습니다.
상세 명령·입력 예제·문제 해결 원본
아래에는 이 Part에 해당하는 기존 상세 안내를 같은 작성 원본에서 이어 싣습니다. 첫 실습, 전체 JSON, OS별 명령, 실제 결과 파일 확인과 증상별 상세 사례를 필요할 때 펼쳐 읽으십시오. 다른 Part의 사례를 참조하는 링크도 해당 매뉴얼로 연결됩니다.
전체 흐름·생략 조건
SDK Engine: 온라인·오프라인 설치와 연동 후보 사용 안내
SDK Engine: 온라인·오프라인 설치와 연동 후보 사용 안내
상세 절 목차
이 도구의 범위
SDK Engine은 실제 연결이나 Pack 등록 전에 고객이 검토할 연동 후보를 준비합니다. 선언된 읽기 전용 Custom API 작업 또는 MCP 기록과 합성 응답을 검사하고, 값 매핑 소스를 생성하여 로컬 Rust 컴파일러로 빌드합니다. 이 도구는 원천 API·MCP 서버를 호출하거나, 자격 증명을 읽거나, Appliance를 변경하거나, Pack을 등록하거나, Work를 실행하지 않습니다.
패키지에는 합성 예제가 포함됩니다. 선택 세트 경로를 쓰려면 동일 세대의 운영체제별 공용 오프라인 Rust 의존성 패키지를 함께 준비하십시오. 기존 설치 툴체인을 선택한 온라인 경로에서는 이 세트가 필수가 아닙니다. 여기에 네이티브 컴파일러·표준 라이브러리·Cargo와 선언된 정확한 crate 버전이 들어 있으며, 이 범위에서는 Rust나 crate를 따로 다운로드하지 않습니다. 다른 OS·새 crate·다른 타깃은 별도 검증 대상입니다. macOS arm64와 Debian 13 amd64 패키지는 Rust 1.96.0, Windows amd64 패키지는 Rust 1.97.1을 사용합니다.
네이티브 전제 조건은 별도입니다. Debian은 기존 시스템 C 링커·libc 개발 파일, macOS는 신뢰 검증을 통과하는 Apple 개발 도구·SDK, Windows는 Visual Studio 2022 BuildTools의 MSVC 14.44.35207 및 Windows SDK 10.0.26100.0이 필요합니다. 이 자산은 Rust 의존성 패키지에 재배포하지 않습니다. 새 OS에 이 전제 조건까지 설치한다는 범위는 검증하지 않았습니다.
macOS의 run-offline은 기본적으로 현재 Apple 개발 도구 선택(SYSTEM_ACTIVE)을 사용합니다. 이미 설치된 Command Line Tools를 실행 한 번에 명시적으로 선택하려면 의존성 경로 뒤에 --macos-developer-selection COMMAND_LINE_TOOLS를 붙이십시오. 등록된 /Library/Developer/CommandLineTools 설치를 선택하며 기존 신뢰 검사를 모두 적용합니다. 시스템 개발 도구 설정을 바꾸거나 다른 설치로 자동 전환하지 않습니다. 다른 운영체제에서는 이 옵션을 거부합니다.
./bin/packr-sdk-engine run-offline examples/read-only-custom-api.json ./quality-candidate /absolute/path/dependencies --macos-developer-selection COMMAND_LINE_TOOLS공식 서명·공증, 고객 활성화·전달의 상태는 해당 패키지와 별도로 신뢰하는 릴리스 목록에서 확인하십시오. 로컬 예제 성공만으로 그 상태를 승인하지 않습니다.
먼저 운영 환경을 선택하십시오: 온라인과 오프라인
SDK Engine은 온라인 개발 환경과 오프라인 환경 모두에서 사용할 수 있습니다. 오프라인 의존성 세트는 인터넷이 차단된 온프렘에서 SDK가 어댑터를 컴파일할 때 필요한 Rust 자산을 미리 준비하기 위한 선택 구성입니다. 제품의 기본 운영 모드를 오프라인으로 고정하는 설정이 아닙니다. SDK에서 새 연동 후보를 빌드할 때 생길 수 있는 의존성 문제를 해결하는 데 목적이 있습니다.
| 사용 환경 | 준비 방법 | 실행 경로와 확인 범위 |
|---|---|---|
| 온라인 개발 환경 | 조직이 승인한 전달 경로로 SDK를 준비하고 지원되는 Rust 컴파일러·네이티브 도구를 설치 또는 재사용합니다. 공용 의존성 세트를 함께 사용해도 됩니다. | 기존 툴체인은 run, 검증된 별도 의존성 세트는 run-offline을 사용합니다. 두 명령의 검증·영수증 범위는 다릅니다. |
| 인터넷이 차단된 온프렘 | 반입 전에 SDK와 같은 OS용 의존성 세트, 네이티브 전제 조건과 지문 목록을 준비합니다. | 전체 의존성 검증 후 run-offline으로 로컬 빌드합니다. 허용된 세트 범위에서는 Rust·crate 추가 다운로드가 필요 없습니다. |
| 네트워크가 있지만 빌드를 고정하려는 환경 | 온라인 환경에서 동일한 의존성 세트를 선택해 사용할 수 있습니다. | run-offline이라는 명령 이름이 컴퓨터의 네트워크를 차단하거나 전체 제품을 오프라인 전용으로 만들지는 않습니다. |
온라인 환경에서 기존 설치 툴체인을 사용하는 호환 경로는 다음과 같습니다. 압축을 푼 SDK 디렉터리에서 rustc --version으로 실제 선택되는 컴파일러를 확인하고, 지원 버전·타깃·OS 도구를 준비한 다음 새 출력 폴더를 지정하십시오. 이 경로는 PATH의 컴파일러를 사용하며 별도 의존성 세트의 전체 파일·네이티브 신뢰 영수증을 제공하지 않습니다. 해당 환경에서 별도로 검증해야 합니다.
rustc --version
./bin/packr-sdk-engine analyze examples/read-only-custom-api.json unused
./bin/packr-sdk-engine run examples/read-only-custom-api.json ./online-custom-candidate-01
./bin/packr-sdk-engine run examples/read-only-mcp-transcript.json ./online-mcp-candidate-01rustc --version
if ($LASTEXITCODE -ne 0) { throw 'Rust compiler unavailable' }
.\bin\packr-sdk-engine.exe analyze .\examples\read-only-custom-api.json unused
if ($LASTEXITCODE -ne 0) { throw 'Analyze failed' }
.\bin\packr-sdk-engine.exe run .\examples\read-only-custom-api.json .\online-custom-candidate-01
if ($LASTEXITCODE -ne 0) { throw 'Custom candidate failed' }
.\bin\packr-sdk-engine.exe run .\examples\read-only-mcp-transcript.json .\online-mcp-candidate-01
if ($LASTEXITCODE -ne 0) { throw 'MCP candidate failed' }run은 설치된 컴파일러를 쓰는 호환 명령으로 유지되어 있습니다. 현재 패키지의 별도 의존성 검증 경로와 같다고 해석하지 마십시오. run-offline의 신뢰·권한 검사에 실패한 뒤 그 검사를 피하기 위한 대체 실행으로 사용하지 않습니다. 아래의 검증된 의존성 세트 절차는 온라인 환경에서도 선택할 수 있습니다. 어느 경로의 합성 예제도 실제 API나 MCP 서버에 접속하지 않습니다.
두 압축 파일을 구분하고 새 위치에 준비하기
SDK 본체에는 bin, docs, examples, 라이선스·고지가 있습니다. Rust 의존성 세트에는 DEPENDENCIES.json, FILES.json, toolchain, cargo-home과 고지가 있습니다. 본체만 해제했다고 선택 구성인 의존성 세트까지 설치된 것은 아닙니다. 기존 설치와 결과를 보존하려면 세대별 새 위치를 선택하십시오.
| 플랫폼 | SDK 본체 | 선택 의존성 세트 | 지원 범위 확인 |
|---|---|---|---|
| macOS ARM64 | 해당 OS의 .tar.gz | RUST_DEPENDENCIES_MACOS_ARM64.tar.gz | Apple Silicon, 등록된 Apple 도구와 SDK |
| Debian 13 AMD64 | 해당 OS의 .tar.gz | RUST_DEPENDENCIES_DEBIAN_13_AMD64.tar.gz | x86-64, 시스템 C 링커·libc 개발 파일 |
| Windows AMD64 | 해당 OS의 .zip | RUST_DEPENDENCIES_WINDOWS_AMD64.zip | x64, 등록된 MSVC·Windows SDK |
macOS에서는 shasum -a 256, Debian에서는 sha256sum, Windows에서는 Get-FileHash -Algorithm SHA256으로 두 압축 파일을 각각 확인합니다. 동일 위치에서 받은 해시만으로 공급자 신원이 증명되지는 않습니다. 별도로 신뢰하는 구성요소 목록과 비교하십시오. 파일 이름이 같아도 해시가 다르면 진행하지 않습니다.
Linux·macOS에서 아래 경로를 실제 파일로 바꾸고 실행합니다. 예제의 루트는 기존에 존재하면 중단합니다. 개인 홈의 비공유 경로를 사용하고, 상위 경로도 다른 사용자가 수정할 수 없어야 합니다.
sdk_archive="/absolute/path/sdk-package.tar.gz"
deps_archive="/absolute/path/RUST_DEPENDENCIES_OS.tar.gz"
install_root="$HOME/VibePackr-SDK-install-01"
test ! -e "$install_root" || exit 1
umask 077
mkdir -m 700 "$install_root" || exit 1
mkdir "$install_root/sdk" "$install_root/dependencies" "$install_root/runs" || exit 1
tar -xzf "$sdk_archive" -C "$install_root/sdk" || exit 1
tar -xzf "$deps_archive" -C "$install_root/dependencies" || exit 1
cd "$install_root/sdk" || exit 1Windows PowerShell 5.1에서는 접근이 제한된 사용자 홈 아래의 새 디렉터리를 준비합니다. 공유·동기화·네트워크 경로를 사용하지 말고 조직이 승인한 현재 사용자 전용 경로와 ACL을 확인하십시오. 아래는 이미 해당 권한이 확인된 부모 경로를 가정합니다. 기존 디렉터리를 덮어쓰거나 시스템 전체 ACL을 바꾸지 않습니다.
$sdkArchive = 'C:\absolute\path\sdk-package.zip'
$depsArchive = 'C:\absolute\path\RUST_DEPENDENCIES_WINDOWS_AMD64.zip'
$installRoot = Join-Path $env:USERPROFILE 'VibePackr-SDK-install-01'
if (Test-Path -LiteralPath $installRoot) { throw 'Choose a fresh install root' }
New-Item -ItemType Directory -Path $installRoot -ErrorAction Stop | Out-Null
$sdkRoot = Join-Path $installRoot 'sdk'
$depsRoot = Join-Path $installRoot 'dependencies'
$runsRoot = Join-Path $installRoot 'runs'
New-Item -ItemType Directory -Path $sdkRoot,$depsRoot,$runsRoot -ErrorAction Stop | Out-Null
Expand-Archive -LiteralPath $sdkArchive -DestinationPath $sdkRoot -ErrorAction Stop
Expand-Archive -LiteralPath $depsArchive -DestinationPath $depsRoot -ErrorAction Stop
Set-Location -LiteralPath $sdkRoot다음 단계에서 전체 의존성 검증이 권한 문제로 거부되면 해당 설치를 사용하지 말고 승인된 설치 절차로 해결하십시오. 검사 완화, 관리자 권한 실행, 실행 정책 우회, 시스템 신뢰 저장소 변경을 해결 방법으로 사용하지 않습니다. 온라인에서 기존 툴체인만 쓰는 경우 의존성 압축 해제 단계는 선택 사항입니다.
제공 파일 확인과 설치
- 받은 릴리스 목록에 현재 운영체제용 SDK Engine이 있는지 확인하십시오. SDK와 의존성 압축 파일의 SHA-256을 별도로 신뢰하는 릴리스 목록과 대조하십시오. 서명이 있는 릴리스만 해당 서명을 검증하십시오. 공식 배포 서명이 없는 후보는 그 사실을 기록하고 서명된 릴리스와 구분하십시오. 다른 운영체제용 파일을 대신 사용하지 마십시오.
- 접근이 제한된 새 디렉터리에 압축을 풀고
bin,docs,examples를 함께 보관하십시오. 시스템 전체에 설치할 때는 해당 릴리스의 운영체제별 안내를 따르십시오. - 의존성 패키지도 신뢰하는 현재 사용자만 쓸 수 있는 별도의 새 디렉터리에 해제하십시오. 모든 중간 디렉터리에 다른 사용자의 쓰기 권한이 없어야 합니다. 포함된
cargo-home은 검증 입력으로 보존하며 작업 캐시로 직접 쓰거나 전역 캐시에 병합하지 마십시오. 활성화 스크립트나 셸 세션 변경은 필요하지 않습니다. 아래 의존성 절대 경로를 실제 경로로 바꾼 뒤 전체 파일 검증과 예제 확인을 수행하십시오.
Linux 또는 macOS 터미널:
./bin/packr-sdk-engine verify-offline-dependencies DEBIAN_13_AMD64 /absolute/path/dependencies
# macOS arm64: DEBIAN_13_AMD64 대신 MACOS_ARM64
test -f examples/read-only-custom-api.json
test -f examples/read-only-mcp-transcript.json
./bin/packr-sdk-engine analyze examples/read-only-custom-api.json unusedWindows PowerShell:
.\bin\packr-sdk-engine.exe verify-offline-dependencies WINDOWS_AMD64 C:\absolute\path\dependencies
Test-Path .\examples\read-only-custom-api.json
Test-Path .\examples\read-only-mcp-transcript.json
.\bin\packr-sdk-engine.exe analyze .\examples\read-only-custom-api.json unusedanalyze는 입력만 읽고 출력 디렉터리를 만들지 않습니다. 성공 결과에도 authority_granted: false가 표시됩니다. 릴리스 목록에 SDK Engine이 없으면 진행을 멈추고 해당 릴리스의 지원 경로에서 올바른 패키지를 받으십시오.
선택한 의존성 세트로 OS별 예제 실행
아래는 앞 단계의 경로 변수가 같은 셸에 남아 있다는 가정입니다. 새 셸에서는 실제 절대 경로를 다시 지정하십시오. analyze의 마지막 unused는 CLI 형식에 필요한 자리이며 결과 폴더가 아닙니다.
macOS ARM64에서 이미 설치된 Command Line Tools를 명시적으로 선택하는 예입니다. 기본 선택은 SYSTEM_ACTIVE이며 아래 옵션은 이 한 실행에만 적용됩니다.
./bin/packr-sdk-engine verify-offline-dependencies MACOS_ARM64 "$install_root/dependencies" || exit 1
./bin/packr-sdk-engine analyze examples/read-only-custom-api.json unused || exit 1
./bin/packr-sdk-engine run-offline examples/read-only-custom-api.json "$install_root/runs/custom-01" "$install_root/dependencies" --macos-developer-selection COMMAND_LINE_TOOLS || exit 1
./bin/packr-sdk-engine run-offline examples/read-only-mcp-transcript.json "$install_root/runs/mcp-01" "$install_root/dependencies" --macos-developer-selection COMMAND_LINE_TOOLS || exit 1Debian 13 AMD64:
./bin/packr-sdk-engine verify-offline-dependencies DEBIAN_13_AMD64 "$install_root/dependencies" || exit 1
./bin/packr-sdk-engine analyze examples/read-only-custom-api.json unused || exit 1
./bin/packr-sdk-engine run-offline examples/read-only-custom-api.json "$install_root/runs/custom-01" "$install_root/dependencies" || exit 1
./bin/packr-sdk-engine run-offline examples/read-only-mcp-transcript.json "$install_root/runs/mcp-01" "$install_root/dependencies" || exit 1Windows AMD64:
.\bin\packr-sdk-engine.exe verify-offline-dependencies WINDOWS_AMD64 $depsRoot
if ($LASTEXITCODE -ne 0) { throw 'Dependency verification failed' }
.\bin\packr-sdk-engine.exe analyze .\examples\read-only-custom-api.json unused
if ($LASTEXITCODE -ne 0) { throw 'Analyze failed' }
.\bin\packr-sdk-engine.exe run-offline .\examples\read-only-custom-api.json (Join-Path $runsRoot 'custom-01') $depsRoot
if ($LASTEXITCODE -ne 0) { throw 'Custom candidate failed' }
.\bin\packr-sdk-engine.exe run-offline .\examples\read-only-mcp-transcript.json (Join-Path $runsRoot 'mcp-01') $depsRoot
if ($LASTEXITCODE -ne 0) { throw 'MCP candidate failed' }첫 예제의 결과 확인과 새 터미널에서 재개
앞의 OS별 설치·실행 블록으로 Custom과 MCP를 각각 새 폴더에 실행한 뒤 아래를 확인합니다. SDK는 바탕화면 앱 아이콘을 만드는 설치 프로그램이 아니므로 앱 목록 대신 해제한 bin의 실행 파일과 결과 경로를 찾습니다. 명령은 그 SDK 디렉터리에서 실행합니다. 본체만 쓰는 온라인 경로에서는 선택 의존성 변수를 만들 필요가 없습니다.
기존 툴체인의 온라인 run 예제를 그대로 사용했다면 결과는 SDK 폴더 아래 online-custom-candidate-01과 online-mcp-candidate-01입니다. 아래 조회 명령의 경로를 그 실제 결과로 바꾸십시오. runs/custom-01과 runs/mcp-01은 앞의 선택 세트 실행 블록이 만든 경로입니다.
Custom 결과를 실제로 열어 보기
ls -la "$install_root/runs/custom-01"
cat "$install_root/runs/custom-01/README.md"
cat "$install_root/runs/custom-01/adapter.rs"
cat "$install_root/runs/custom-01/manifest.json"$candidate01 = Join-Path $runsRoot 'custom-01'
Get-ChildItem -LiteralPath $candidate01
Get-Content -LiteralPath (Join-Path $candidate01 'README.md') -Raw -Encoding UTF8
Get-Content -LiteralPath (Join-Path $candidate01 'adapter.rs') -Raw -Encoding UTF8
Get-Content -LiteralPath (Join-Path $candidate01 'manifest.json') -Raw -Encoding UTF8| 읽을 대상 | 처음 확인할 내용 | 해석 |
|---|---|---|
| 출력 폴더 | adapter.rs, libadapter.rlib, README.md, manifest.json | 실패 stage의 임시 폴더와 구분 |
| adapter.rs | component 매핑과 score → quality_score 변환 | 합성 응답의 매핑 코드; API 클라이언트 아님 |
| manifest.json | compiler_version, files의 3개 지문, 다섯 단계, authority_granted=false | 이 실행의 후보와 검증 기록 |
| offline_execution | 선택 세트 경로로 실행했을 때만 해당 의존성·네이티브 관측 | 온라인 run에 같은 영수증이 있다고 가정하지 않음 |
| MCP 결과 | 별도 mcp-01 폴더와 repository 매핑 | Custom 성공을 MCP 성공으로 재사용하지 않음 |
libadapter.rlib는 Rust 라이브러리이며 더블클릭하거나 운영체제 실행 파일처럼 실행하지 않습니다. 결과에서 97이 quality_score 정수로 매핑되는 것은 합성 검증의 내용입니다. 실제 서버의 응답을 받았다는 뜻이 아닙니다. 원본 입력 값을 읽고 매핑·단계 기록과 대조하십시오.
input.json 사본을 만드는 빠진 준비 단계
아래 명령은 새 inputs-02 폴더에 전체 예제를 복사합니다. 이 절에서는 편집·분석까지 진행하고, 뒤의 input.json을 바꾸고 두 번째 후보 만들기에서 재실행합니다. 같은 이름이 있으면 새 번호를 고르십시오.
test ! -e "$install_root/inputs-02" || exit 1
mkdir "$install_root/inputs-02" || exit 1
cp ./examples/read-only-custom-api.json "$install_root/inputs-02/input.json" || exit 1$inputs02 = Join-Path $installRoot 'inputs-02'
if (Test-Path -LiteralPath $inputs02) { throw 'Choose a fresh input folder' }
New-Item -ItemType Directory -Path $inputs02 -ErrorAction Stop | Out-Null
Copy-Item -LiteralPath .\examples\read-only-custom-api.json -Destination (Join-Path $inputs02 'input.json') -ErrorAction Stop편집기에서 이 사본을 열어 score는 문자열 "88", component는 "my-test-component"로 바꿉니다. 매핑을 유지한 값 변경은 adapter.rs를 바꾸지 않을 수 있습니다. 첫 결과와 수정 결과를 모두 보존합니다.
새 터미널을 열었을 때
아래는 기존 설치 경로를 다시 지정하는 명령입니다. 압축을 다시 풀거나 기존 결과를 지우지 않습니다. 앞서 다른 루트명을 사용했다면 그 경로로 바꾸십시오. 다음 실행의 결과 폴더는 다시 새 이름을 선택합니다.
install_root="$HOME/VibePackr-SDK-install-01"
test -f "$install_root/sdk/bin/packr-sdk-engine" || exit 1
cd "$install_root/sdk" || exit 1$installRoot = Join-Path $env:USERPROFILE 'VibePackr-SDK-install-01'
$sdkRoot = Join-Path $installRoot 'sdk'
$depsRoot = Join-Path $installRoot 'dependencies'
$runsRoot = Join-Path $installRoot 'runs'
Set-Location -LiteralPath $sdkRoot -ErrorAction Stop
if (!(Test-Path -LiteralPath '.\bin\packr-sdk-engine.exe' -PathType Leaf)) { throw 'SDK path does not match the prior installation' }복귀 경로: 프로그램 경로를 찾지 못함 → 설치 루트·중첩 해제 폴더 확인, analyze 거부 → 전체 입력/인코딩 확인, build 거부 → 선택 의존성·네이티브 전제 조건 확인, 출력 경로 거부 → 새 이름 선택. 실패한 임시 stage를 성공 결과로 열지 않습니다.
포함된 실제 예제
예제의 read_quality 작업은 합성 응답의 component와 문자열 score를 읽습니다. 목표 Contract는 component와 정수 quality_score를 요구합니다. 아래 매핑은 로컬 준비용입니다.
{
"definition": {
"integration_id": "acme-quality-hub",
"operation_id": "read_quality",
"credential_requirements": [],
"execution_boundary": "READ_ONLY_SYNTHETIC_SANDBOX"
},
"mapping": {
"field_mappings": [
{"source": "component", "target": "component", "transform": "IDENTITY"},
{"source": "score", "target": "quality_score", "transform": "STRING_TO_INTEGER"}
]
},
"fixture": {
"scope": "LOCAL_SYNTHETIC_SANDBOX",
"response": {"component": "fixture-component", "score": "97"}
}
}이 발췌는 필드를 설명하기 위한 것입니다. 실행에는 정확한 Contract·어댑터·스키마 지문·권한·증거 범위를 포함한 패키지의 전체 JSON 파일을 사용하십시오. 예제에 암호, 토큰, 개인키 또는 실제 고객 응답을 넣지 마십시오.
예제: MCP로 제공되는 레거시 저장소
조직의 레거시 저장소가 지원되는 MCP 인터페이스를 제공한다면 examples/read-only-mcp-transcript.json부터 확인하십시오. 합성 기록에는 tools/list와 읽기 전용 read_repository 도구가 선언되어 있습니다. 매핑은 name을 repository_id로, sha를 revision으로 복사합니다. Engine은 제공된 기록을 분석하며 MCP 서버에 접속하지 않습니다.
./bin/packr-sdk-engine analyze examples/read-only-mcp-transcript.json unused
./bin/packr-sdk-engine run-offline examples/read-only-mcp-transcript.json ./repository-candidate /absolute/path/dependenciesWindows PowerShell:
.\bin\packr-sdk-engine.exe analyze .\examples\read-only-mcp-transcript.json unused
.\bin\packr-sdk-engine.exe run-offline .\examples\read-only-mcp-transcript.json .\repository-candidate C:\absolute\path\dependencies고객 선언으로 바꾸기 전에 연동 담당자와 작업 ID, 필드 형식, 읽기 전용 권한, Contract 버전, 합성 응답을 정확히 대조하십시오. 실제 MCP 호출과 자격 증명 사용에는 별도의 승인된 연결 절차가 필요합니다.
다섯 단계 실행
압축을 푼 디렉터리에서 아직 존재하지 않는 출력 경로를 지정하십시오.
./bin/packr-sdk-engine run-offline examples/read-only-custom-api.json ./quality-candidate /absolute/path/dependenciesWindows:
.\bin\packr-sdk-engine.exe run-offline .\examples\read-only-custom-api.json .\quality-candidate C:\absolute\path\dependencies한 명령이 다음 단계를 순서대로 수행합니다.
- ANALYZE_GAP: 등록된 Contract·어댑터·프로토콜 버전, 읽기 전용 작업, 입력 크기와 합성 응답을 검사합니다.
- GENERATE: 로컬 값 매핑 함수인
adapter.rs를 만듭니다. API 전송·자격 증명·Work 실행 코드는 없습니다. - BUILD: 전체 파일 검증을 통과한 패키지 내
rustc절대 경로로 생성 소스를libadapter.rlib로 컴파일합니다. - VALIDATE: 임시 합성 응답 검사를 컴파일·실행하여 예상 매핑과 미선언 필드 거부를 확인합니다. 성공 후 임시 검사 소스와 실행 파일을 제거합니다.
- PACKAGE:
README.md와manifest.json을 씁니다. 매니페스트에는 입력 지문, 컴파일러 버전, 후보 파일 세 개의 SHA-256과 단계별 입력·출력 지문이 기록됩니다.
성공한 출력 디렉터리에는 adapter.rs, libadapter.rlib, README.md, manifest.json만 있어야 합니다. v2 매니페스트의 offline_execution에는 전체 트리의 전후 지문, 컴파일러·네이티브 도구·환경·명령 인자의 최소 공개 지문이 포함됩니다. 이는 미서명 관측 기록이며 독립적인 실행 증명이나 릴리스 서명이 아닙니다. 매니페스트를 확인하십시오. 결과 CUSTOMER_REVIEW_CANDIDATE는 실제 연결이나 실행 승인을 뜻하지 않습니다.
input.json을 바꾸고 두 번째 후보 만들기
먼저 패키지의 전체 examples/read-only-custom-api.json을 새 입력 작업 폴더의 input.json으로 복사합니다. 제공 예제와 첫 결과는 보존합니다. 편집기에서 다음 두 값만 수정해 UTF-8로 저장하십시오. 파일 전체를 아래 발췌로 교체하지 마십시오.
draft.fixture.response.component = "my-test-component"
draft.fixture.response.score = "88"score는 문자열이므로 따옴표를 유지합니다. 이 예제의 STRING_TO_INTEGER가 결과의 정수 quality_score로 변환합니다. Contract ID, 어댑터 리비전, 스키마 지문, 권한, 증거 항목은 다른 값을 추측해 바꾸지 않습니다. Windows PowerShell 5.1의 기본 Out-File은 UTF-16을 쓸 수 있으므로 JSON 편집기는 UTF-8을 선택하십시오.
예를 들어 앞서 준비한 설치 루트에 inputs-02를 새로 만들고 그 안에 input.json을 저장한 뒤 실행합니다. macOS는 앞서 선택한 Apple 도구 옵션을 그대로 적용하십시오. 첫 결과와 두 번째 결과를 합치지 않습니다.
./bin/packr-sdk-engine analyze "$install_root/inputs-02/input.json" unused
./bin/packr-sdk-engine run-offline "$install_root/inputs-02/input.json" "$install_root/runs/custom-api-candidate-02" "$install_root/dependencies"
# macOS CLT 선택 시 마지막에 다음 인자를 추가: --macos-developer-selection COMMAND_LINE_TOOLS$input02 = Join-Path $installRoot 'inputs-02\input.json'
.\bin\packr-sdk-engine.exe analyze $input02 unused
if ($LASTEXITCODE -ne 0) { throw 'Analyze failed' }
.\bin\packr-sdk-engine.exe run-offline $input02 (Join-Path $runsRoot 'custom-api-candidate-02') $depsRoot
if ($LASTEXITCODE -ne 0) { throw 'Candidate failed' }온라인의 기존 툴체인 경로를 선택했다면 같은 입력과 새 결과 경로로 run을 사용하며 의존성 경로와 macOS 선택 옵션은 넣지 않습니다. 한 후보의 기록에 두 실행 경로의 결과를 섞지 않습니다.
adapter.rs·manifest.json을 읽고 결과 비교하기
adapter.rs는 필드 매핑 코드입니다. 합성 응답의 값만 바꾸고 매핑 규칙을 유지하면 코드가 같을 수 있습니다. manifest.json은 해당 실행의 입력·산출물·단계 기록이므로 입력 지문, 경로, 관측값 등은 달라질 수 있습니다. 다른 OS·컴파일러 버전의 .rlib 해시를 같아야 한다고 가정하지 않습니다.
cat "$install_root/runs/custom-api-candidate-02/adapter.rs"
cat "$install_root/runs/custom-api-candidate-02/manifest.json"Get-Content -LiteralPath (Join-Path $runsRoot 'custom-api-candidate-02\adapter.rs')
Get-Content -LiteralPath (Join-Path $runsRoot 'custom-api-candidate-02\manifest.json') -Raw
Get-FileHash -LiteralPath (Join-Path $runsRoot 'custom-api-candidate-02\libadapter.rlib') -Algorithm SHA256생성 코드를 직접 편집하면 기존 매니페스트의 지문과 맞지 않습니다. Engine의 재현 가능한 후보를 만들려면 입력 JSON의 지원되는 선언·매핑을 수정하고 새 결과 경로에서 다시 실행합니다. 매니페스트를 고쳐 기존 실행이 검증된 것처럼 만들지 않습니다. 임의 Rust 코드·추가 crate·실제 네트워크 연동은 이 합성 예제의 검증 범위에 포함되지 않습니다.
재현성은 같은 OS·동일 SDK·컴파일러·의존성·전체 입력으로 새 폴더에 실행한 뒤 adapter.rs와 libadapter.rlib의 SHA-256을 비교합니다. 입력을 바꾼 두 실행 비교와 같은 입력의 재현성 비교는 구분하십시오. 매니페스트 전체 해시까지 같아야 하는 것은 아닙니다. 두 출력의 다섯 단계, 파일 지문, 입력 지문과 의존성 전후 지문도 함께 확인합니다.
문제 상황과 조치
| 표시 또는 현상 | 가능한 원인 | 조치 |
|---|---|---|
TARGET_MISMATCH, FIXTURE_REJECTED, CREDENTIAL_REQUIREMENT, INVALID_INPUT | 작업·Contract/어댑터 버전·입력 형식·합성 응답이 지원 범위 밖이거나 자격 증명 요구가 있습니다. | 전체 선언을 릴리스의 지원 대상 목록과 대조하십시오. 예제에서 비밀값을 제거하고, 목표 ID를 추측해 바꾸지 마십시오. |
TOOLCHAIN_UNAVAILABLE | 의존성 파일·운영체제·권한·컴파일러 또는 네이티브 도구의 신뢰 검증이 실패했습니다. | 의존성 전체 검증과 OS 전제 조건을 확인하십시오. 신뢰 검사나 권한 검사를 우회하지 말고, 오류와 실패 stage를 보존하십시오. PATH·Rustup 다운로드로 대체하지 않습니다. |
OUTPUT_EXISTS_OR_UNAVAILABLE | 이전 시도의 파일이 남았거나 디렉터리를 만들 수 없습니다. | 내용을 확인하고 쓸 수 있는 새 디렉터리를 지정하십시오. 두 시도의 파일을 합치지 마십시오. |
| 합성 응답 검사 실패 | 선언된 매핑과 응답 형식이 다르거나 값 변환이 불가능합니다. | 선언 또는 합성 응답을 바로잡아 새 출력 경로에서 실행하십시오. 합성 검사 통과를 실제 API 검증으로 해석하지 마십시오. |
| 압축 파일 지문·서명 불일치 | 파일이 다르거나 변경됐습니다. | 설치를 중지하고 릴리스 목록의 파일을 다시 받으십시오. |
| 후보는 컴파일되나 Appliance에 보이지 않음 | 이 도구는 로컬 후보만 준비합니다. | 릴리스의 별도 등록·바인딩·Work 절차를 따르고 인증된 결정과 해당 영수증을 확인하십시오. |
run-offline은 비공개 sibling stage에서 생성·검사하고, 후검사가 끝나면 기존 경로를 덮어쓰지 않는 원자적 이동으로 새 결과를 게시합니다. 실패하면 최종 결과 경로는 없고 비공개 stage·실패 기록이 남을 수 있습니다. 이 stage를 후보 패키지로 사용하지 마십시오. 이전 실패 stage나 결과는 자동으로 재사용하지 않습니다. 지원에 오류 출력을 전달할 때 고객 데이터나 비밀값을 먼저 제거하십시오.
업데이트·보관·제거와 보안 검토 자료
새 SDK는 별도 세대 디렉터리에 해제하고 그 세대의 의존성·지문 목록과 대조합니다. 이전 결과·입력·패키지를 보존한 채 새 위치에서 검증한 다음 작업 경로를 바꿉니다. 되돌릴 때는 기록된 이전 SDK와 그에 맞는 의존성·입력 조합을 선택합니다. 자동 덮어쓰기나 기존 후보의 재사용은 하지 않습니다.
제거 전에 입력 JSON, 수정 내역, 후보 파일·매니페스트와 지원 기록을 보관합니다. 휴대형 설치 디렉터리와 작업 결과 디렉터리를 구분해 관리하십시오. 이 절차는 시스템 서비스나 전역 Rustup·Cargo 설정을 설치하지 않으므로 이를 삭제하거나 시스템 설정을 되돌리는 명령도 필요하지 않습니다. 기존 조직 툴체인을 별도로 제거하지 않습니다.
보안 검토에는 패키지·의존성 지문, 정확한 버전·OS, 파일 목록, LICENSE·NOTICE, 제공된 SBOM·취약점 조회 시점, 실제 검사 결과와 범위를 함께 전달합니다. 서명·공증이 없는 후보와 서명된 릴리스는 구분합니다. 지문 일치는 파일 동일성에 대한 확인이며, 매니페스트는 독립적인 실행 증명이 아닙니다. 알려진 마커 검사는 모든 비밀정보 부재를 보장하지 않으며 공급망·권한·네트워크 격리·최신 취약점 전부를 인증하지 않습니다.
Appliance 등록, 실제 연결, 고객 활성화·전달, Work 실행은 각 릴리스가 별도로 제공한 절차와 승인 범위를 따릅니다. 설치 후 도구 목록으로 돌아가거나, 소스 Document 안내에서 다음 연동 선언을 준비하십시오.
지원 기록
SDK·의존성 패키지 지문과 제공된 서명 유무, 컴퓨터 운영체제, 검증된 컴파일러 버전, 입력 JSON 지문, 대상 Contract·어댑터 버전, 단계 결과, 후보 매니페스트, 연동 담당자를 기록하십시오. 이후 실제 Work가 실행되면 별도의 Appliance 등록 결정과 Work 영수증을 보관하십시오. 지원 기록에는 비밀값과 실제 고객 응답을 넣지 마십시오.
도구별 문제 해결 사례 읽기
다음은 지원되는 입력·명령·권한 경계를 바탕으로 구성한 교육용 사례입니다. 제품의 실제 상태·사유와 함께 읽고, 자신의 실행 기록 없이 예시의 결과를 성공 이력으로 사용하지 않습니다. 온라인과 오프라인 환경 모두에 적용되는 확인 항목과 선택 의존성 경로에만 해당하는 항목을 구별합니다.
상세 예시 SDK-1: SDK 본체만 해제한 뒤 의존성·네이티브 전제 조건 구별
상황: SDK 실행 파일은 열리지만 선택 의존성 경로의 예제 빌드가 시작되지 않습니다. 본체 설치, Rust 세트 검증, OS 네이티브 도구 준비를 한 단계로 합치지 않고 각각 확인합니다.
관찰을 이렇게 나눠 읽습니다.
- 본체: bin·docs·examples 존재는 SDK 파일 준비만 확인합니다.
- 의존성: 같은 OS용 DEPENDENCIES.json·FILES.json·toolchain이 별도 경로에 있어야 합니다.
- 네이티브 도구: Rust 세트와 별도로 릴리스 전제 조건이 충족돼야 합니다.
확인·조치 순서:
- 온라인 기존 툴체인 경로인지 선택 세트 경로인지 먼저 기록합니다. 이 예시는 후자입니다.
- SDK·세트의 압축 파일 지문과 플랫폼을 대조하고 정확한 절대 경로로 verify-offline-dependencies를 수행합니다.
- 트리 검증 뒤에도 거부되면 네이티브 전제 조건·경로 권한·제품 사유를 확인합니다. 실패를 피하려고 다른 실행 경로로 바꾸지 않습니다.
다음 단계로 돌아갈 조건: 선택한 경로의 전제 조건이 충족되고 새 출력에서 다섯 단계가 검증돼야 후보 준비 완료로 기록합니다.
해결되지 않았을 때: 필요 자산 또는 지원 조합이 없으면 정확한 누락 항목을 인계합니다. 임의 다운로드·전역 캐시 혼합으로 빈칸을 메우지 않습니다.
상세 예시 SDK-2: macOS에서 설치된 CLT를 한 실행에 선택
상황: macOS에 Apple 개발 도구가 둘 이상 있습니다. 현재 시스템 선택을 사용하는 실행이 거부됐고, 등록된 Command Line Tools 설치가 별도로 준비돼 있습니다. 설치돼 있다는 사실만으로 신뢰 검증 성공을 가정하지 않습니다.
관찰을 이렇게 나눠 읽습니다.
- 기본 선택: SYSTEM_ACTIVE입니다. 전체 제품의 온라인·오프라인 기본값과 다른 설정입니다.
- 선택 옵션: COMMAND_LINE_TOOLS는 이미 설치된 등록 경로를 지정합니다.
- 신뢰 검사: 선택 후에도 그대로 적용됩니다.
확인·조치 순서:
- 현재 SDK·의존성 세대와 Apple 도구·SDK 전제 조건을 확인합니다.
- run-offline의 의존성 경로 뒤에 문서화된 --macos-developer-selection COMMAND_LINE_TOOLS를 명시하고 새 결과 폴더를 지정합니다.
- 거부가 계속되면 정확한 사유를 보존합니다. 시스템 개발 도구 선택·신뢰 저장소·공식 서명 상태를 바꿔 해결하지 않습니다.
다음 단계로 돌아갈 조건: 해당 실행의 선택된 도구와 후보 검증 결과가 확인돼야 이 경로의 성공으로 기록합니다.
해결되지 않았을 때: CLT가 없거나 신뢰 검증이 거부되면 그 전제 조건을 인계합니다. 이 옵션을 다른 OS에 사용하지 않습니다.
상세 예시 SDK-3: score를 숫자로 바꾸거나 전체 JSON을 발췌로 교체함
상황: 사용자가 예제의 점수를 88로 바꾸면서 문자열 따옴표를 지웠거나 설명용 JSON 발췌만 input.json에 저장했습니다. JSON 문법이 맞아도 선언된 입력 형식과 전체 요청 구조는 별도로 검사됩니다.
관찰을 이렇게 나눠 읽습니다.
- 원본 예제: 전체 request_id·correlation_id·draft를 포함합니다.
- score: 원본 선언은 문자열을 요구합니다. 변환 대상은 정수 quality_score입니다.
- 저장 인코딩: Windows PowerShell 5.1의 기본 파일 출력은 UTF-8과 다를 수 있습니다.
확인·조치 순서:
- 원본 전체 예제를 새 입력 경로에 복사하고 draft.fixture.response.score를 "88", component를 "my-test-component"로 바꿉니다.
- UTF-8 저장과 전체 선언을 확인한 뒤 analyze 결과를 읽습니다. 목표 ID·스키마 지문을 추측해 고치지 않습니다.
- 선택한 실행 경로로 새 결과를 만들고 매니페스트·생성 소스·라이브러리를 함께 확인합니다.
다음 단계로 돌아갈 조건: 수정 입력이 지원 형식으로 받아들여지고 같은 실행의 다섯 단계·산출물 지문이 확인되면 해당 후보만 완료로 기록합니다.
해결되지 않았을 때: 대상·권한·데이터 경계 거부가 남으면 예제 값을 바꾸는 것으로 해결됐다고 표시하지 않습니다.
상세 예시 SDK-4: adapter.rs는 같은데 라이브러리 지문이 다름
상황: 두 출력의 adapter.rs는 같지만 libadapter.rlib의 지문이 다릅니다. 출력 경로만 비교하기 전에 실제 입력·OS·컴파일러·SDK·의존성과 선택한 명령이 같은지 확인해야 합니다.
관찰을 이렇게 나눠 읽습니다.
- 소스 지문 일치: 컴파일 입력 전체의 일치는 아닙니다.
- 서로 다른 OS·컴파일러·SDK 세대: 라이브러리 동일성을 가정하지 않습니다.
- 매니페스트: 개별 실행 기록이므로 전체 파일 해시는 달라질 수 있습니다.
확인·조치 순서:
- 전체 입력 지문과 컴파일러·SDK·의존성·플랫폼·실행 경로를 두 매니페스트에서 나란히 대조합니다.
- 같은 입력 재현성 확인이 필요하면 동일한 검증된 조합으로 새 결과 폴더에 실행합니다. 기존 결과와 실패 기록은 보존합니다.
- adapter.rs와 libadapter.rlib를 각각 비교하고 단계·의존성 전후 기록도 읽습니다. 매니페스트를 편집해 지문을 같게 만들지 않습니다.
다음 단계로 돌아갈 조건: 같은 조건의 새 실행에서 지문이 일치하면 그 OS·버전·입력 범위의 재현성으로만 기록합니다.
해결되지 않았을 때: 조건이 같은데도 다르면 두 패키지·입력·산출물 지문과 최소 실행 기록을 인계합니다. 보안 후검사 실패를 성공으로 바꾸지 않습니다.
연결·승인·등록에는 해당 설치에 제공된 실제 자료를 사용하십시오. 이 안내서가 이를 구성하지는 않습니다. 교육용 예시는 고객 실행 증거가 아닙니다. Apple 공식 서명·공증과 고객 활성화·전달은 계속 보류합니다.
가이드와 Part.1–8 연결
가이드에서 목적을 고른 뒤 해당 Part에서 정확한 도구 단계를 확인합니다. 두 문서는 같은 순서·용어·자료 역할을 사용합니다.
목적별 가이드
- PoC 공통 가이드
질문을 정하고 범위에 맞는 관찰을 모아 결과를 검토합니다. 보존 기록 독해에는 신규 설치가 필요하지 않습니다.
- Google 심사자 가이드
정확한 심사 전달물과 기준 증거를 연결합니다. Cloud 접근·문서 범위·실제 Google 승인은 각각 구분합니다.
- 온프레미스 가이드
정확한 OS·패키지·네트워크 선택·도구 체인을 준비합니다. 로컬 SDK 준비 요건이 제공된 뒤에만 해당 단축 경로를 사용합니다.
- Custom Execution 가이드
지원 작업을 선택합니다. 소스 문서 준비·전체 SDK 후보·실제 Work 및 보고서 확인을 서로 다른 경로로 구분합니다.
- 가이드 링크는 네트워크가 필요한 공개 웹사이트를 엽니다. 이 오프라인 매뉴얼과 로컬 예제는 네트워크 없이 읽을 수 있습니다.
권장 연동 순서와 단축 경로
- Part.1 · 설치·준비
- Part.2 · GAPE 구조 관찰
- Part.3A · Integration Helper 계획
- Part.4 · 소스 Document 작성·게시된 대상 Contract 연결
- Part.3B · 전체 요청 확인·구현 필요 여부 확인
- 필요 시 Part.5 · SDK 후보·구현 검토·별도 등록
- 필요 시 Part.6 · Builder Pack 후보·승인 경로
- Part.7 · 허용된 GUI·헤드리스 사용
- Part.8 · 결과·문제 해결·사람 검토
Helper B는 구현·새 Pack 필요 여부를 결정하기 전에 완성된 선언을 확인합니다. 구현·선언 변경 후에는 영향을 받은 지원 검사를 다시 수행하고 별도 구현·등록·Pack 승인 경로를 마친 뒤 사용합니다. 생성 후보는 운영 권한을 부여하지 않습니다.
목표에 필요한 경로만 선택합니다. 보존 PoC 독해는 설치 없이 시작할 수 있습니다. 제공된 로컬 SDK 실습은 Part.1 → Part.5를 따르며 새 GAPE 관찰·어플라이언스 계정이 필요하지 않습니다. 기존 승인 Pack은 현재 준비 요건 확인 후 Part.1 → Part.7 → Part.8을 따를 수 있습니다. 새 연동·Pack 작성은 조건부 전체 순서를 따릅니다.
Part 연결과 도구 역할
| Part | 역할과 기대 범위 |
|---|---|
| Part.1 · 설치·초기 연결 | OS 준비·제공 패키지·초기 연결입니다. 설치는 실행된 Work가 아닙니다. |
| Part.2 · GAPE 관찰·비교·공유 | 리비전에 고정된 구조 관찰입니다. 워크시트는 승인된 GAPE 입력 매니페스트가 아닙니다. |
| Part.3 · Integration Helper 사용 | A는 Document 작성 전 계획, B는 완성된 전체 요청 확인입니다. 단계마다 타입이 있는 status·reason을 읽습니다. |
| Part.4 · Contract·Document 작성 | 소스 Document·매핑을 작성하고 제공된 대상 Contract·리비전을 사용합니다. JSON 구문만으로 의미상 호환성이 확인되지 않습니다. |
| Part.5 · SDK Engine 실습·연동 후보 | 로컬 SDK 구현 후보를 생성합니다. 기존 구현·등록·릴리스 호환 연동이 요구를 충족하면 재사용합니다. |
| Part.6 · Builder·추가 Pack 사용 | 새 Pack이 필요할 때 Pack 후보를 준비합니다. 목표·설치 범위에 맞는 기존 승인 Pack은 재사용합니다. |
| Part.7 · PackrGUI·헤드리스 사용 | 현재 권한·사전 조건에 따라 제공 GUI·헤드리스 경로를 사용합니다. 반환된 Work 식별·결과를 확인합니다. |
| Part.8 · 운영·문제 해결·지원 | 동일 Work 산출물·영수증·종결을 비교하며 사람 인수은 실제 기록될 때까지 대기로 유지합니다. |
공통 용어
- 가이드 / Part
- 가이드는 목적·역할 경로이고 Part는 도구 설명입니다. 서로 보완하며 경쟁하는 두 번호 순서가 아닙니다.
- Contract / 소스 Document
- 게시된 대상 Contract는 지원 대상·리비전을 정합니다. 소스 Document는 소스 형식을 선언합니다. 소스 선언은 실행을 승인하지 않습니다.
- 전체 요청 / 소스 전용 파일
- 전체 SDK 요청은 request_id·correlation_id와 definition·source·mapping·fixture가 있는 draft를 포함합니다. status 소스 Document는 한 구성 요소이며 전체 요청이 아닙니다.
- Fixture / 실제 관찰
- fixture는 선언된 로컬 실습의 합성 값을 제공합니다. 선언 필드는 실제 공급자 호출·현재 연결·고객 결과를 입증하지 않습니다.
- SDK 후보 / Pack 후보
- SDK 후보에는 README.md·adapter.rs·libadapter.rlib·manifest.json이 있습니다. Builder Pack 후보는 별도 제품 반환 후보이며 자체 검증·승인 경로를 가집니다. 어느 쪽도 자동으로 승인 Pack이 되지 않습니다.
- 워크시트 / 영수증 / 인수
- 워크시트는 사람 기록입니다. 영수증은 제품 실행 기록입니다. 검증 PASSED·자동화 완료와 사람 인수 대기는 함께 존재할 수 있으며 각 필드의 실제 범위를 기록합니다.
- Online / Offline
- 구성 선택 사항입니다. Offline 제품 개발에는 정확한 선언 의존성 세트·네이티브 도구가 필요하며 오프라인 매뉴얼 ZIP은 문서 열람을 지원합니다.
입력별 올바른 출력 연결
status.read 소스 전용 예제와 read_quality SDK 실습은 서로 다른 예제입니다. 일치하는 전체 요청을 사용하고 status 소스 파일을 quality SDK 전체 요청으로 제출하지 않습니다. 아래 매핑 값은 설명을 위한 기대값이며 새 실행 캡처가 아닙니다.
| 파일 / 역할 | 입력 | 출력 / 확인 |
|---|---|---|
status-document.jsonstatus.read의 소스 전용 CUSTOM_API 선언입니다. 제공된 전체 준비 요청 안에서 사용합니다. | service: string | service: string·healthy: boolean을 선언합니다. 스키마이며 관찰된 서비스 응답이 아닙니다. |
read-only-custom-api.json / custom-api-01.json유지관리되는 전체 SDK 기준 요청이며 가이드 사본은 같은 JSON입니다. | fixture.response.component = "fixture-component"; score = "97" (문자열) | STRING_TO_INTEGER는 score를 기대 정수 quality_score 97로 매핑합니다. 문서의 SDK 결과는 로컬 후보입니다. |
custom-api-02.jsonfixture 응답 값 두 개만 바꾼 두 번째 전체 SDK 요청입니다. | component = "my-test-component"; score = "88" (문자열) | 기대 매핑 component는 "my-test-component", quality_score는 정수 88입니다. 실제 매니페스트·단계를 확인하며 매핑 소스는 같을 수 있습니다. |
custom-api-score-number.json정상 기준 예제가 아닌 의도적 오류 입력입니다. | 선언된 문자열 스키마에 fixture.response.score = 88 (JSON 숫자) 사용 | 실제 타입 오류 결과를 보존하며 이 예제를 성공 후보로 기록하지 않습니다. |
Worksheet / SDK artifacts / Work reports사람 기록·로컬 컴파일 후보·실제 Work 및 보고서·영수증이라는 서로 다른 산출물 종류입니다. | 해당 도구·현재 타깃을 사용하며 워크시트·이전 결과를 다음 전체 요청으로 제출하지 않습니다. | 실제 입력·버전·후보 또는 Work 식별에 출력을 연결합니다. 파일 존재·종료 0만으로는 충분하지 않습니다. |
