ES /docs

All Elements are E trust_level (out of range)

RCA: All Elements are E trust_level (out of range)

Overview#

What Happened#

2026-06-26 11:03:35 KST에 cupixworks-sitetrack-postprocessor-agent(ap-southeast-2)가 sitetrack id 2855 (job id 212894)의 post-processing 마지막 단계인 validateModel에서 Error: All Elements are E trust_level (out of range)를 던지며 작업을 실패 처리했다. cpElementTraces에 포함된 모든 element trace의 points_validator.trust_level'E'(out-of-range)였기 때문에 in-range element가 0개로 판정되었고, validateModel이 의도된 가드(AGT1811 DeviationAllElementsOutOfRange)를 발동시킨 결과다.

Quick Facts#

Field Value
exception.class Error
exception.message All Elements are E trust_level (out of range)
top_frame packages/siteinsights/src/runner/base-postprocessor-runner.ts:56
error_code AGT1811 (DeviationAllElementsOutOfRange)
env production, region ap-southeast-2
sitetrack.id 2855
job.id 212894
cpTask 15187 (24 cpElementRecords)

Affected Teams#

Team / Domain Error Count Impact
built (sitetrack postprocessor) 1 단일 sitetrack(id 2855) 후처리 job 1건 실패. deviation 산출물이 사용자에게 노출되지 않음.

지난 14일 기준 동일 메시지가 2026-06-15 23:19:42 KST, 2026-06-18 23:05:13 KST, 2026-06-26 11:03:35 KST에 3회 발생 — 산발적·간헐적 패턴이며 폭넓은 사용자 영향은 확인되지 않았다.

Timeline#

  1. 2026-06-26 11:02:23 KSTPostprocessorService::run | begin (job 212894, sitetrack 2855)
  2. 2026-06-26 11:03:03 KSTFileSystemManager::loadCPSiteinsightsModel | loaded 24 cpElementRecordsMeta, cpTask 15187에서 24 element record 로드
  3. 2026-06-26 11:03:14 KSTBasePostprocessorRunner::uploadDataFiles | end
  4. 2026-06-26 11:03:35 KSTapply_results 단계 진입 후 CPSitetrack::applyBimValidatorResultsV3 | bimValidationScoped: true, 직후 validateModel에서 throw → 에러 로그 기록, 작업 정리 후 PostprocessorService::run | end
  5. 2026-06-26 11:03:35 KST — SQS 메시지 삭제(cd1dd5e1-120c-477e-9ba3-7419dc280dd2), /tmp/workspace/2855 정리
  6. 2026-06-26 — error-sweeper가 클러스터 3d98bd82-1279-4a29-bf97-c353959f0f22로 수집

Error Log#

Datadog Logs

text
All Elements are E trust_level (out of range)

Impact#

  • Service: cupixworks-sitetrack-postprocessor-agent
  • Team: built
  • 발생 횟수: 1 (지난 14일 누적 3회)
  • 최초 발생: 2026-06-26 11:03:35 KST
  • 최근 발생: 2026-06-26 11:03:35 KST

Root Cause Summary#

sitetrack 2855의 post-processing 결과로 생성된 24개의 cpElementTrace 모두가 processingResult.points_validator.trust_level == 'E'였다. BasePostprocessorRunner.validateModel은 element trace를 'E' 여부로 partition한 뒤 in-range(='E'가 아님) 개수가 0이면 AGT1811을 세팅하고 throw new Error('All Elements are E trust_level (out of range)')를 수행하도록 설계되어 있다. 즉, 이 throw는 버그가 아닌 의도된 데이터 품질 가드다. 실제 root cause는 코드가 아니라 데이터 조건 — 이 sitetrack에서 측정된 모든 element가 범위 밖(E)으로 판정될 만큼 BIM-pointcloud 매칭/측정이 빈약했다는 점이다. 입력 element 수가 24개로 매우 적었던 점, bimValidationScoped: true로 좁은 scope만 검증된 점, 같은 worker pod에서 직후 처리된 sitetrack 20158(89,709 records, trust_level 분포 정상)은 성공한 점이 이를 뒷받침한다.

Technical Analysis#

Code Path#

  • Entry point: packages/cupix-sitetrack-postprocessor-agent/src/postprocessor-service.ts:48 (PostprocessorService.run)
  • 흐름: loadFileSystemuploadDataFilesloadAllSiteinsightsModelcheckResultFilesapplyResultsToModelvalidateModelupdateTargetModels
  • Failure point: packages/siteinsights/src/runner/base-postprocessor-runner.ts:56

validateModel은 element trace의 trust_level 분포를 보고 후속 단계를 진행할지 결정한다. 모든 trace가 'E'면 in-range가 비어 있어 의도적으로 throw하여 잘못된 결과가 DB로 반영되는 것을 막는다.

packages/siteinsights/src/runner/base-postprocessor-runner.ts:47-57typescript
validateModel(cpParent: SiteinsightParentModel): void {
    if (cpParent.deviationType === TESLA.DeviationType.Report) {
        logger.debug('BasePostprocessorRunner::validateModel | skipped - report type');
        return;
    }

    const [outOfRangeETs, inRangeETs] = partition(cpParent.cpElementTraces, et => et.processingResult?.points_validator?.trust_level == 'E');
    if (inRangeETs.length == 0) {
        this.jobManager.setErrorCode(ErrorCode.Agent.DeviationAllElementsOutOfRange);
        throw new Error('All Elements are E trust_level (out of range)');
    }

호출 측은 validateModel이 동기 throw를 일으키면 상위 try/catch에서 잡혀 job을 error 상태로 마감한다.

packages/cupix-sitetrack-postprocessor-agent/src/postprocessor-service.ts:84-101typescript
start = Date.now();
await this.jobManager.updateJobProgress(90, 'apply_results');
runner.applyResultsToModel(cpSitetrack);
runner.validateModel(cpSitetrack);
this.logDuration(start, Date.now(), `apply_results - sitetrack_id: ${cpSitetrack.id}, job_id: ${targetId}`);
// ... updateTargetModels 등이 이어진다
} catch (error) {
    logger.error('PostprocessorService::run | end', error);
    await this.jobManager.updateErrorActionJob(this.ActionName);
}

ErrorCode.Agent.DeviationAllElementsOutOfRange = 'AGT1811'은 명시적으로 정의된 오류 코드다.

packages/utils/src/error-code/agent.ts:55-59typescript
static readonly DeviationElementsNotFound = 'AGT1808';
static readonly DeviationTracksNotFound = 'AGT1809';
static readonly DeviationAllElementsCompleted = 'AGT1810';
static readonly DeviationAllElementsOutOfRange = 'AGT1811';
static readonly DeviationAllElementsCompletedWithinRange = 'AGT1812';

기대 동작: 일부라도 in-range element가 있으면 정상 처리. 실제 동작: 24개 element 전부 'E'로 판정되어 가드가 throw. 코드 측에서는 의도대로 동작했으나, 데이터 조건이 가드 경로에 도달했다.

Log Evidence#

Datadog 검색 쿼리:

text
service:cupixworks-sitetrack-postprocessor-agent "All Elements are E trust_level"

직전 동일 job(212894 / sitetrack 2855)의 핵심 로그 발췌 (KST):

text
11:02:23  info   BaseService::runByMessage | id: 212894
11:02:23  info   PostprocessorService::run | begin
11:02:23  info   JobManager::loadJob | begin - job id: 212894
11:02:27  info   JobManager::updateJobProgress | begin - jobId: 212894, processingStatus: load_sitetrack_on_postprocessor
11:03:03  info   FileSystemManager::loadCPSiteinsightsModel | loaded 24 cpElementRecordsMeta
11:03:03  info   CPSitetrack::fromSiteinsightsMeta | 24 cpElementRecord loaded in cpTask ID: 15187 in Sitetrack ID: 2855
11:03:14  info   BasePostprocessorRunner::uploadDataFiles | end
11:03:35  info   BasePostprocessorRunner::checkResultFiles | end
11:03:35  info   JobManager::updateJobProgress | begin - jobId: 212894, processingStatus: apply_results
11:03:35  info   CPSitetrack::applyBimValidatorResultsV3 | bimValidationScoped: true
11:03:35  error  All Elements are E trust_level (out of range)
11:03:35  info   PostprocessorService::run | end
11:03:35  info   BaseService::cleanUpAnythingRelatedModel | path: /tmp/workspace/2855
11:03:35  info   AwsQueueManager::deleteMessage | begin - queue url: https://sqs.ap-southeast-2.amazonaws.com/002596530511/cupix-sitetrack-postprocessor-agent-production

비교용 — 같은 worker가 직후 처리한 sitetrack 20158은 정상 종료. 11:08:52 KST 통계 로그:

text
SitetrackPostprocessorRunner::computeTrustLevelStats | trust_level_stats: {"A":10,"B":0,"C":3349,"D":337,"E":9269,"F":1127,"S":75610,"NotFound":0,"evaluation":1}

또 다른 직전 성공 job(1154415, 11:01:43 KST 부근)의 trust_level 분포:

text
SitetrackPostprocessorRunner::computeTrustLevelStats | trust_level_stats: {"A":0,"B":0,"C":3936,"D":816,"E":12,"F":296,"S":504,"NotFound":0,"evaluation":0}

위 두 경우는 E가 일부에 그치고 in-range가 충분해 정상 처리됐다. 반면 실패한 sitetrack 2855는 element 자체가 24개로 매우 적었고(computeTrustLevelStats 로그도 남지 않음 — throw 시점이 stats 계산 이전 단계), 전부 'E'로 분류되었다.

14일 발생 빈도:

text
2026-06-15 23:19:42 KST  error  All Elements are E trust_level (out of range)
2026-06-18 23:05:13 KST  error  All Elements are E trust_level (out of range)
2026-06-26 11:03:35 KST  error  All Elements are E trust_level (out of range)

Hypotheses Considered#

# Hypothesis Evidence for Evidence against Verdict
H1 의도된 데이터 품질 가드가 정상 발동 — sitetrack 2855의 모든 24개 element trace가 trust_level == 'E'(out-of-range)로 판정되어 validateModelAGT1811을 세팅하고 throw (1) Code base-postprocessor-runner.ts:53-57inRangeETs.length == 0일 때 정확히 이 메시지를 throw. (2) Spec base-postprocessor-runner.spec.ts:132-137,167-172가 동일 동작을 검증. (3) 직전 로그 loaded 24 cpElementRecordsMeta, bimValidationScoped: true로 좁은 scope에 적은 element. (4) 같은 pod의 다른 sitetrack(20158, 1154415)은 분포가 정상이라 성공. Confirmed
H2 cpElementTraces 파싱 버그로 trust_level이 잘못 매핑됨 (1) 다른 sitetrack은 같은 코드 경로에서 정상 trust_level 분포(A/B/C/D/E/F/S) 산출. (2) 동일 코드가 14일 중 3회만 throw하고 그 외 다수 job은 정상 종료. Rejected
H3 업스트림(cupix-sitetrack-preprocessor-agent/validator) 장애로 모든 element가 E로 계산됨 sitetrack 2855가 24 element 전부 E인 이례적 분포. (1) 같은 pod, 같은 시간대의 다른 sitetrack은 정상 분포. (2) Status board에 active 인시던트 없음. (3) 별도 업스트림 에러 로그 부재. — 가능성은 있으나 단일 사례로는 증거 부족. Rejected (single occurrence — inconclusive at preprocessor level)
H4 외부 의존성(S3/SQS/DB) 장애 (1) uploadDataFiles end, loadCPSiteinsightsModel loaded 24, applyBimValidatorResultsV3 모두 정상 통과. throw는 메모리상 partition 결과로 발생. (2) Status board dep:* active 없음. Rejected

Fix Recommendation#

즉시 조치 (Critical)#

  • 운영 조치 불필요. 이 throw는 base-postprocessor-runner.ts:56에서 의도적으로 발동되는 데이터 품질 가드이며, 코드 변경으로 해결할 버그가 아니다. sitetrack 2855에 대한 원시 capture/BIM 입력 품질을 도메인 팀(built)이 확인하고, 필요 시 재처리 또는 데이터 보정 후 재요청한다.

단기 개선 (1주 이내)#

  • 로그 레벨 재검토packages/siteinsights/src/runner/base-postprocessor-runner.ts:55-56. 이 케이스는 "예상 가능한 운영 시나리오 (입력 데이터 부족/범위 밖)"에 해당하므로 throw new Error(...)가 상위 catch에서 logger.error로 기록되는 현재 동작이 과도하다. 사용자 영향을 자세히 평가한 뒤 다음 중 하나를 고려:
    • throw 직전에 logger.warn('BasePostprocessorRunner::validateModel | All Elements are E trust_level (out of range)')를 추가하여 후속 catch가 error로 기록하더라도 분류 가능한 분기 로그를 남긴다 (이미 'S' trust_level 케이스는 line 65에 logger.warn이 있어 일관성 회복 측면도 있음).
    • 또는 PostprocessorService.run catch에서 errorCode === 'AGT1811' | 'AGT1812'를 분기해 logger.warn으로 기록한다.
  • 컨텍스트 보강 — throw 시 sitetrack id, cpElementTraces 개수, trust_level 분포(가능하면 computeTrustLevelStats 결과)를 메시지에 포함하면 단일 로그만으로 원인 데이터 식별이 가능하다.

장기 개선 (재발 방지)#

  • 데이터 검증을 preprocessor로 이관 — out-of-range element만으로 구성된 sitetrack은 postprocessor에 도달하기 전에 preprocessor 단계에서 AGT1811에 해당하는 사전 검증을 수행하여 사용자에게 더 빠르게 피드백을 줄 수 있다.
  • 사용자 측 가시화 — sitetrack 결과 페이지에서 AGT1811 발생 시 "측정 element가 BIM 범위 밖" 메시지를 노출하면 운영팀의 reactive 조사를 줄일 수 있다.

Monitoring#

  • 발생 빈도를 추적하는 timeseries widget을 release dashboard에 추가:
text
count:logs("service:cupixworks-sitetrack-postprocessor-agent \"All Elements are E trust_level\"").index("*").rollup("count").by("region")
  • 동반 가드(AGT1812 DeviationAllElementsCompletedWithinRange)도 함께 모니터링:
text
count:logs("service:cupixworks-sitetrack-postprocessor-agent \"All Elements are S trust_level (completed in the range)\"").index("*").rollup("count").by("region")
  • 임계치 알람: 1주에 3회 이상 같은 region에서 발생 시 Slack 알림 (현재 14일 3회 baseline에서 명백히 벗어나는 경우).

Risk Assessment#

  • Risk level: low — 의도된 가드 throw, 단일 sitetrack 한정, 사용자 데이터 손상 없음
  • 예상 복잡도: trivial (로그 레벨/메시지 보강 권장 시) ~ skipped (코드 변경 불필요로 결정 시)