GET /analyses/:analysisId는 필드가 30개가 넘습니다. 이 페이지는 필드 정의가 아니라 읽는 순서와 해석 규칙을 다룹니다. 필드 목록과 타입은 API 레퍼런스를, 용어는 핵심 개념을 참조하세요.
읽는 순서
status 확인
completed가 아니면 아래로 내려가지 마세요. failed면 error.code · error.message를 기록하고 아이템 상태를 점검합니다.outputFormatting.status 확인
systemMetadata.outputFormatting.status가 formatted 또는 validation_failed일 때만 extractedData가 출력 스키마 구조입니다. skipped · fallback_raw면 봉투가 없습니다(아래 참조).verificationStatus로 분기
verified → 자동 승인, pending_review → 검토 큐, rejected → 거부. 세부 판정은 그다음입니다.extractedData와 details[] 읽기
value, 이유는 reasoning, 비어 있는 필드의 원인은 details[]의 reasonCode.필요하면 agentAuditLog
extractedData 봉투
출력 스키마의 말단 필드마다 값 대신 세 키를 가진 객체가 들어옵니다. 중간 객체와 배열 구조는 스키마 그대로입니다.- 값을 얻지 못한 필드도
value: null로 자리를 유지합니다.extractedData의 필드 목록은 출력 스키마와 항상 같습니다. - 상위 객체 자체가 산출되지 않으면 그 아래 경로는 만들지 않습니다. 이때
details[]에 상위 항목의reasonCode: "PARENT_MISSING"한 건이 남습니다. reasoning은 분석 완료 시점에 저장된 값입니다. 다시 조회해도 바뀌지 않습니다.sourceStep은 실행 순서 번호라 워크플로우를 수정하면 다음 분석부터 달라질 수 있습니다. 단계를 안정적으로 가리키려면agentAuditLog.steps[].work_id를 쓰세요.0과false는 유효한 값입니다. 비어 있음의 기준은null/""/[]/{}입니다.
봉투가 없는 경우
fallback_raw는 “출력 스키마의 모든 필드가 비어 보이는” 가장 흔한 원인입니다. 스키마 키로 값을 찾기 전에 status부터 분기하세요. validation_failed는 조립은 됐지만 스키마 검증에 어긋난 항목이 있다는 뜻이며, 봉투는 정상이고 ajvErrors[]에 불일치 목록이 있습니다.
outputFormatting이 없습니다. 이때는 outputSchema가 null인지로 봉투 유무를 판단하세요.비어 있는 필드의 사유
값이 채워지지 않은 필드는 봉투에value: null로 남고, details[]에 category: "JSON_OUTPUT" 항목이 추가되어 Analysis Score의 outputCompleteness를 낮춥니다.
reasonCode는 확장 가능한 열거형입니다. 표에 없는 값이 와도 오류 없이 처리하세요.type(OUTPUT_MISSING/OUTPUT_EMPTY등 고정 6종)과는 별개의 축입니다.reasonCode·message·stepId는JSON_OUTPUT항목에만 붙습니다.STEP·TOOL항목에는 없습니다.message는 담당 단계가 남긴 판단 근거이고, 봉투의reasoning은 필드 단위 사유를 우선합니다. 두 문장은 다를 수 있으므로 필드별 맥락은reasoning을 먼저 읽으세요.target은 실제 인스턴스 경로입니다. 배열은 원소 수만큼 인덱스로 펼쳐집니다(ubo_register[0].name). 빈 배열이나 배열 키 부재는ubo_register한 건으로 계상합니다.- Omni는 원본 문서를 다시 검사하지 않습니다. “문서에 그 값이 없었다”는 판정은 하지 않으며, 상한선은 “추출 결과에 포함되지 않았다”(
NOT_IN_FINAL_OUTPUT)입니다.
사유를 제공하지 못하는 경우
reasoning: null은 “근거가 없다”가 아니라 “사유를 제공하지 못했다”는 뜻입니다. 과거 분석에 소급 생성하지 않습니다.
extractionStatus는 쓰지 마세요
extractionStatus는 하위 호환용 deprecated 필드입니다. 스키마 최상위 키 단위(extracted / missing)라 중첩 필드나 배열 원소를 구분하지 못합니다. 신규 연동은 봉투의 value와 details[]를 사용하세요. 값의 판정 기준은 봉투와 같습니다(0 · false는 extracted). 출력 스키마가 없는 분석에서는 extractedData의 최상위 키 기준 맵을 돌려줍니다.
판정 값 읽기
응답 안에는 이름이 비슷한 판정이 세 층위에 있고 값 집합이 다릅니다.failed가 하나라도 있으면 rejected, 전부 passed면 verified, 그 외 pending_review. summary.overall_decision도 같은 집계라 passed → verified, needs_review → pending_review, failed → rejected로 대응합니다. findings[].result는 같은 액션 결과를 UI용으로 바꾼 값입니다(needs_review → warning).
confidence와 confidenceScore
confidenceScore가 높아도 confidence.score는 낮을 수 있습니다. 모든 단계를 통과했지만 출력 스키마가 비어 있는 경우가 대표적입니다. 자동 승인 조건에는 verificationStatus와 함께 confidence.score와 details[]를 넣으세요. 가중치와 등급 구간은 핵심 개념에 있습니다.
어떤 플레이북으로 판정했는가
분석은 실행 시점의 플레이북을 동결해playbookSnapshot으로 함께 돌려줍니다. 이후 워크플로우를 수정해도 과거 분석의 근거는 그대로 남습니다.
frozen인 분석의 playbookSnapshot을 저장하세요. outputSchema도 같은 방식으로 실행 시점에 동결됩니다.
감사 로그 읽기
agentAuditLog는 단계별 실행 기록입니다. 최상위 필드와 달리 스네이크 케이스(work_id, executed_at, duration_ms)를 씁니다.
- 단계 식별:
step은 실행 순서,work_id는 플레이북 액션의 고정 ID입니다.GET /workflows/:workflowId의workflowActions[].workId와 대응합니다. - 단계 판정:
status(passed/needs_review/failed)와reasoning이 대시보드 Summary 탭의 판단 줄입니다.rule은 그 단계가 수행한 지시입니다. - 외부 엔진 호출:
mcpcalls[]의success와error_code로 실패를 판단하세요. HTTP 상태 코드는 없습니다.fallback_to_rag: true는 엔진 실패 후 문서 검색으로 대체 실행했다는 뜻입니다. - 같은 호출을 액션 기준으로 보려면
rawActionResults.{action}.mcpResults[]를 쓰세요. 이쪽은 카멜 케이스(durationMs,errorCode,fallbackToRag)입니다. - 실행되지 않은 단계는
systemMetadata.workflowHistory[]에도 나오지 않습니다. 전체 단계 정의는 워크플로우 응답의workflowActions에서 확인하세요. 미실행 단계는details[]에STEP_NOT_EXECUTED로 남습니다.
후속 처리 패턴
- 검토자에게는
details[]의target·reasonCode·message와 봉투의reasoning을 함께 보여주면 원인 파악이 빠릅니다. - 아이템을 보강한 뒤 같은 프로파일에서 다시 분석하면 새
analysisId가 발급됩니다. 이전 결과는 유지되며 대시보드의 Run 선택으로 비교할 수 있습니다. - 사람이 읽는 리포트가 필요하면
GET /analyses/:analysisId/report로 PDF를 받으세요.