ES /docs

ChildProcessManager::setupEventHandlers | Child process stderr: errorCode: 908

RCA: ChildProcessManager::setupEventHandlers | Child process stderr: errorCode: 908

Overview#

What Happened#

2026-05-26 16:08:09Z에 cupixworks-any-bimrevision-agent 서비스에서 BIM revision 비교 작업 중 child process가 stderr로 errorCode: 908을 출력했다. 이는 소스 모델의 bounding box가 비교 가능한 최대 크기(5000m)를 초과하여 비교가 불가능함을 나타내는 에러이다. 단일 발생이며 특정 고객의 대형 모델에 의한 데이터 기반 에러이다.

Quick Facts#

Field Value
exception.class ForgeAgentError
exception.message The source model bounding box is too large for reliable comparison (max extent: 645970.2m, limit: 5000m)
top_frame compare-utils.js:60 (validateBoundsSize)
runtime Node.js (forge-agents@10.98.0)
env production, us-west-2

Affected Teams#

Team / Domain Error Count Impact
fortis (Fortis Construction) 1 BIM revision 비교 실패, bim_comparison_state가 Error로 전환됨. 사용자(phil.miller@fortisconstruction.com)의 BIM revision 23701 비교 결과를 볼 수 없음.

Timeline#

  1. 16:08:04.612ZBaseService::runByMessage 시작 (bim_revision.id: 23701)
  2. 16:08:05.146ZBimRevisionService::REVISE-BEGIN (bim_id: 16801, src_revision_id: 23701 V3, prev_revision_id: 19729 V2)
  3. 16:08:05.146ZrunBimCompare 시작
  4. 16:08:09.080Z — forge-agents child process에서 validateBoundsSize 실패 (max extent: 645970.2m > limit: 5000m)
  5. 16:08:09.081ZerrorCode: 908 stderr 출력 → ChildProcessManager::setupEventHandlers가 error 레벨로 기록
  6. 16:08:09.082ZforgeErrorCode: 908ForgeErrorMapperREV908로 매핑, critical error로 판정
  7. 16:08:09.083ZBimRevisionService::run catch 블록에서 bim_comparison_state: Error 업데이트
  8. 16:08:09.519Z — 정상 cleanup 수행 (workspace 삭제, SQS message 삭제)

Error Log#

Datadog Logs

text
ChildProcessManager::setupEventHandlers | Child process stderr:   errorCode: 908

Impact#

  • Service: cupixworks-any-bimrevision-agent
  • Team: fortis
  • 발생 횟수: 1
  • 최초 발생: 2026-05-26T16:08:09.081Z
  • 최근 발생: 2026-05-26T16:08:09.081Z

Root Cause Summary#

@cupix/forge-agents 패키지의 validateBoundsSize 함수가 소스 BIM 모델(revision 23701)의 bounding box 최대 축 길이(645,970.2m)를 검증했을 때, 설정된 최대 한도(5,000m)를 초과하여 ForgeAgentError(errorCode: 908)를 throw했다. 이 에러는 child process의 stderr로 출력되어 ChildProcessManager::setupEventHandlers에서 error 레벨 로그로 캡처되었다. 이 에러는 forge-agents 라이브러리의 의도된 안전 검증으로, 부동소수점 정밀도 문제로 인한 부정확한 비교 결과를 방지하기 위한 것이다. 근본 원인은 사용자가 업로드한 BIM 모델의 좌표계가 비정상적으로 큰 값을 포함하고 있는 것이다.

Technical Analysis#

Code Path#

  1. Entry point: bim-revision-service.ts:150BimRevisionService::run 메서드에서 SQS 메시지 처리 시작
applications/agents/packages/cupix-tesla-bim-revision-agent/src/bim-revision-service.ts:177typescript
await this.runBimCompare(this.cpBimRevision, this.cpPreviousBimRevision);
  1. BIM 비교 실행 위임: bim-revision-service.ts:647BimCompareManager.execute() 호출
applications/agents/packages/cupix-tesla-bim-revision-agent/src/bim-revision-service.ts:647typescript
const bimCompareResults = await this.bimCompareManager.execute(params);
  1. Child process IPC: bim-compare.manager.ts:65ChildProcessManager.execute() 호출
applications/agents/packages/cupix-tesla-bim-revision-agent/src/manager/bim-compare.manager.ts:64-67typescript
try {
    const result = await this.childProcessManager.execute<ForgeAgent.Result>('execute', params);
    logger.debug('BimCompareManager::execute | completed successfully');
    return result;
  1. Child process 내부: bim-compare.process.ts:72ForgeAgent.extract() 호출
applications/agents/packages/cupix-tesla-bim-revision-agent/src/process/bim-compare.process.ts:72-81typescript
const result: ForgeAgent.Result = await ForgeAgent.extract(params.apiConfig, params.urn, {
    region: params.region,
    extractRoom: false,
    extractMeta: false,
    extractCompare: {
        urn: params.previousUrn,
        region: params.previousRegion,
        query: params.query
    }
});
  1. Failure point: compare-utils.js:60 (forge-agents 패키지 내부) — validateBoundsSize 함수에서 모델 bounding box 크기 검증 실패. 모델의 최대 축 길이 645,970.2m이 설정 한도 5,000m(maxBoundsSize 파라미터)을 초과.

  2. stderr 캡처: child-process.manager.ts:138-141ChildProcessManager가 child process의 stderr를 error 레벨로 로깅

applications/agents/packages/base/src/manager/child-process.manager.ts:138-141typescript
this.process.stderr?.on('data', (data: Buffer) => {
    const text = data.toString();
    logger.error(`ChildProcessManager::setupEventHandlers | Child process stderr: ${text}`);
});
  1. 에러 처리: bim-revision-service.ts:663-671ForgeErrorMapper가 errorCode 908을 critical error로 판정, REV908로 매핑 후 throw
applications/agents/packages/cupix-tesla-bim-revision-agent/src/bim-revision-service.ts:663-671typescript
if (forgeErrorCode) {
    if (ForgeErrorMapper.isIgnorableError(forgeErrorCode)) {
        logger.warn('BimRevisionService::runBimCompare | Ignorable Forge error detected - forgeErrorCode: %s, message: %s', forgeErrorCode, forgeErrorMessage);
    } else {
        const errorCode = ForgeErrorMapper.mapForgeErrorToRevisionError(forgeErrorCode);
        logger.error('BimRevisionService::runBimCompare | Critical Forge error detected - forgeErrorCode: %s, mapped to revisionErrorCode: %s', forgeErrorCode, errorCode);
        this.setErrorCode(errorCode);
        throw new Error(`BimRevisionService::runBimCompare | Forge error: ${forgeErrorCode} - ${forgeErrorMessage}`);
    }
}

Log Evidence#

Datadog 검색 쿼리:

text
service:cupixworks-any-bimrevision-agent status:error @environment:production

시간 범위: 2026-05-26T15:08:00Z ~ 2026-05-26T17:08:00Z

핵심 로그 시퀀스 (bim_revision.id: 23701):

text
16:08:05.146Z [info] BimRevisionService::REVISE-BEGIN | bim_id:16801, src_revision_id:23701 (V3), prev_revision_id:19729 (V2)
16:08:05.183Z [info] loadBimRevisionEntityParameters | compareConfig - alignmentMethod: auto, maxBoundsSize: 5000, gridAlignmentZ: false
16:08:05.184Z [info] runBimCompare | params - urn: dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6...

에러 발생:

text
16:08:09.080Z [error] ForgeAgentError: The source model bounding box is too large for reliable comparison (max extent: 645970.2m, limit: 5000m). Large models cause floating-point precision issues that make comparison unreliable.

Stack trace:

text
validateBoundsSize (compare-utils.js:60)
  -> CompareExtractor.compare (compare-extractor.js:58)
    -> extractComparison (app.js:133)
      -> Object.extract (app.js:82)
        -> BimCompareProcess.execute (bim-compare.process.cjs:6459)
          -> BimCompareProcess.processMessage (bim-compare.process.cjs:6435)
            -> BimCompareProcess.handleMessage (bim-compare.process.cjs:5919)

에러 처리 로그:

text
16:08:09.082Z [warn] CPBimRevision::validateBimComparerResult | forgeErrorCode: 908
16:08:09.083Z [error] BimRevisionService::runBimCompare | Critical Forge error detected - forgeErrorCode: 908, mapped to revisionErrorCode: REV908
16:08:09.083Z [error] BimRevisionService::run | error: "BimRevisionService::runBimCompare | Forge error: 908 - The source model bounding box is too large..."

정상 cleanup 확인:

text
16:08:09.519Z [info] BimRevisionService::REVISE-END
16:08:09.519Z [info] BaseService::cleanUpAnythingRelatedModel | path: /tmp/workspace/23701
16:08:09.520Z [info] AwsQueueManager::deleteMessage

Hypotheses Considered#

# Hypothesis Evidence for Evidence against Verdict
H1 사용자가 비정상적으로 큰 좌표계를 가진 BIM 모델을 업로드함 (잘못된 단위 또는 좌표 오프셋) 로그: max extent 645,970.2m (약 646km), 정상 건물 모델은 수백m 이하. maxBoundsSize: 5000m 한도를 ~129배 초과. Confirmed
H2 forge-agents의 maxBoundsSize 설정이 너무 낮게 설정됨 5000m은 대부분 건축 모델에 충분하지만 일부 인프라 모델(고속도로, 파이프라인)에는 부족할 수 있음 645,970m은 어떤 합리적인 건축/인프라 모델에도 비정상적. 일반적인 대형 프로젝트도 수km 수준. 한도를 올려도 이 모델은 부동소수점 문제 발생 가능. Rejected
H3 모델 좌표 변환 실패로 인한 잘못된 bounding box 계산 이론적으로 좌표 변환 오류가 극단적 값을 생성할 수 있음 에러 메시지가 "source model bounding box"를 직접 언급하며, 이는 모델 자체의 geometry 데이터에서 계산된 값. 변환 전 원본 데이터 검증 단계에서 발생. Rejected

Fix Recommendation#

즉시 조치 (Critical)#

코드 수정 불필요 — 이 에러는 forge-agents의 의도된 안전 검증이 정상 작동한 결과이다. 서비스는 에러를 올바르게 처리하고 (REV908 상태 업데이트, cleanup 수행, SQS 메시지 삭제) 정상적으로 종료했다.

다만, ChildProcessManager::setupEventHandlers의 stderr 로깅(child-process.manager.ts:138-141)이 모든 stderr 출력을 무조건 error 레벨로 기록하는 것은 과도하다. forge-agents가 에러 정보를 stderr에 출력한 후, 이것이 IPC 응답의 Error 필드로도 반환되어 BimRevisionService::runBimCompare에서 다시 error 로그를 생성한다. 동일 에러가 2번 error 로깅되는 중복이 발생한다.

  • 파일: applications/agents/packages/base/src/manager/child-process.manager.ts:140
  • 방향: stderr 출력을 warn 레벨로 낮추는 것을 검토. child process의 stderr는 진단 정보이며, 실제 에러 처리는 IPC 응답에서 수행됨.

단기 개선 (1주 이내)#

  • Fortis Construction 팀(team_id: 708, user: phil.miller@fortisconstruction.com)에게 BIM revision 23701의 소스 모델 좌표계 확인을 요청. 모델이 밀리미터 단위로 작성되었으나 미터로 해석되고 있을 가능성이 있음 (645,970m ≈ 645km → mm 단위라면 약 646m).
  • Tesla API의 bim_comparison_state: Error (error_code: REV908)가 사용자에게 적절한 에러 메시지로 표시되는지 확인.

장기 개선 (재발 방지)#

  • forge-agents의 validateBoundsSize 단계에서 단위 변환 미스매치를 감지하는 휴리스틱 추가 검토 (예: 값이 1000배 차이나면 단위 불일치 가능성 경고).
  • 사용자 업로드 시점에 BIM 모델의 bounding box 크기를 사전 검증하여, 비교 실행 전에 문제를 감지하고 사용자에게 피드백을 제공하는 방안 검토.

Monitoring#

현재 에러는 단발성이며 특정 모델에 의한 것이므로 추가 모니터링은 선택 사항이다.

재발 모니터링 쿼리:

text
service:cupixworks-any-bimrevision-agent status:error "errorCode: 908"

동일 팀/사용자의 반복 실패 모니터링:

text
service:cupixworks-any-bimrevision-agent status:error @team.id:708

Risk Assessment#

  • Risk level: low
  • 예상 복잡도: trivial (코드 수정 불필요, 사용자 측 데이터 문제)