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#
- 2026-06-26 11:02:23 KST —
PostprocessorService::run | begin(job 212894, sitetrack 2855) - 2026-06-26 11:03:03 KST —
FileSystemManager::loadCPSiteinsightsModel | loaded 24 cpElementRecordsMeta, cpTask 15187에서 24 element record 로드 - 2026-06-26 11:03:14 KST —
BasePostprocessorRunner::uploadDataFiles | end - 2026-06-26 11:03:35 KST —
apply_results단계 진입 후CPSitetrack::applyBimValidatorResultsV3 | bimValidationScoped: true, 직후validateModel에서 throw → 에러 로그 기록, 작업 정리 후PostprocessorService::run | end - 2026-06-26 11:03:35 KST — SQS 메시지 삭제(
cd1dd5e1-120c-477e-9ba3-7419dc280dd2),/tmp/workspace/2855정리 - 2026-06-26 — error-sweeper가 클러스터
3d98bd82-1279-4a29-bf97-c353959f0f22로 수집
Error Log#
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) - 흐름:
loadFileSystem→uploadDataFiles→loadAllSiteinsightsModel→checkResultFiles→applyResultsToModel→validateModel→updateTargetModels - Failure point:
packages/siteinsights/src/runner/base-postprocessor-runner.ts:56
validateModel은 element trace의 trust_level 분포를 보고 후속 단계를 진행할지 결정한다. 모든 trace가 'E'면 in-range가 비어 있어 의도적으로 throw하여 잘못된 결과가 DB로 반영되는 것을 막는다.
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 상태로 마감한다.
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'은 명시적으로 정의된 오류 코드다.
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 검색 쿼리:
service:cupixworks-sitetrack-postprocessor-agent "All Elements are E trust_level"
직전 동일 job(212894 / sitetrack 2855)의 핵심 로그 발췌 (KST):
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 통계 로그:
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 분포:
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일 발생 빈도:
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)로 판정되어 validateModel이 AGT1811을 세팅하고 throw |
(1) Code base-postprocessor-runner.ts:53-57가 inRangeETs.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.runcatch에서errorCode === 'AGT1811' | 'AGT1812'를 분기해logger.warn으로 기록한다.
- throw 직전에
- 컨텍스트 보강 — 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에 추가:
count:logs("service:cupixworks-sitetrack-postprocessor-agent \"All Elements are E trust_level\"").index("*").rollup("count").by("region")
- 동반 가드(
AGT1812 DeviationAllElementsCompletedWithinRange)도 함께 모니터링:
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 (코드 변경 불필요로 결정 시)