ES /docs

Sitetrack::validateForgeUrns | validation failed - {

RCA: Sitetrack::validateForgeUrns | validation failed

Error Log#

Datadog Logs

text
Sitetrack::validateForgeUrns | validation failed - {
  name: 'Error',
  message: 'Forge URN validation failed: Error: Forge URN mismatch for BIM 16317: expected dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLjdIeFh0SjA2UnpTWHRNZ3FhRVVKU3c_dmVyc2lvbj01, got dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLjdIeFh0SjA2UnpTWHRNZ3FhRVVKU3c_dmVyc2lvbj0xMg==',
  stack: 'Error: Forge URN validation failed: ...'
    at _ForgeUrnValidator.validateForgeUrns (/tmp/agent/dist/app.cjs:9138:13)
    at Sitetrackservice.validateForgeUrns (/tmp/agent/dist/app.cjs:9301:27)
    at Sitetrackservice.run (/tmp/agent/dist/app.cjs:9225:16)
    at async Sitetrackservice.init (/tmp/agent/dist/app.cjs:9180:7)
}

Impact#

  • Service: cupixworks-sitetrack-instance
  • Team: tpc
  • 발생 횟수: 2
  • 최초 발생: 2026-04-08T15:27:10.495Z
  • 최근 발생: 2026-04-08T17:05:59.942Z

Root Cause Summary#

BIM 16317의 Forge 파일이 preprocessor 다운로드 이후 새 버전으로 업데이트(re-translate)되어, Tesla API의 Bim.forge_urn(version=12)과 EFS의 preprocessor 결과물 bim_model.json.urn(version=5) 사이에 버전 불일치가 발생했습니다. ForgeUrnValidator가 이 불일치를 감지하여 sitetrack master agent 실행을 중단시켰으며, 이는 의도된 동작입니다 — stale preprocessor 결과물로 분석을 진행하는 것을 방지하기 위한 safety check입니다. 문제는 validation 로직 자체가 아니라, 이 의도된 실패가 logger.error로 기록되어 에러 모니터링에 불필요한 노이즈를 발생시키는 것입니다.

Technical Analysis#

Code Path#

  • Entry point: sitetrack-service.ts:45Sitetrackservice.init() 호출
  • sitetrack-service.ts:48this.run() 실행
  • sitetrack-service.ts:96this.loadFileSystem(cpSitetrack) — EFS에서 preprocessor 결과물을 workspace로 복사. 이 결과물에는 preprocessor가 다운로드한 시점의 bim_model.json (version=5 URN 포함)이 포함됨
  • sitetrack-service.ts:100this.validateForgeUrns(cpSitetrack) 호출
  • sitetrack-service.ts:192ForgeUrnValidator.validateForgeUrns() 정적 메서드 호출
  • Failure point: forge-urn-validator.ts:55 — URN 비교 실패

Sitetrackservice.validateForgeUrns (sitetrack-service.ts:180-199):

typescript
// applications/agents/packages/cupix-sitetrack-master-agent/src/sitetrack-service.ts:180-199
private validateForgeUrns = (cpSitetrack: CPSitetrack): void => {
  if (!cpSitetrack.modelWorkspaceDirPath || !cpSitetrack.pointsValidatorRequestFilePath) {
    logger.error('Sitetrack::validateForgeUrns | modelWorkspaceDirPath or pointsValidatorRequestFilePath is missing');
    throw new Error('modelWorkspaceDirPath or pointsValidatorRequestFilePath is missing');
  }

  logger.info('Sitetrack::validateForgeUrns | begin - sitetrack_id: %d', cpSitetrack.id);
  const workspacePath = cpSitetrack.modelWorkspaceDirPath;
  const bimValidatorRequestPath = cpSitetrack.pointsValidatorRequestFilePath;

  try {
    ForgeUrnValidator.validateForgeUrns(workspacePath, bimValidatorRequestPath);
    logger.info('Sitetrack::validateForgeUrns | end - validation passed');
  } catch (error) {
    logger.error('Sitetrack::validateForgeUrns | validation failed - %s', error);
    this.jobManager.setErrorCode('AGT1813');
    throw error;
  }
};

ForgeUrnValidator.validateSingleBimModel — 실제 URN 비교 로직 (forge-urn-validator.ts:34-70):

typescript
// applications/agents/packages/cupix-sitetrack-master-agent/src/forge-urn-validator.ts:34-63
static validateSingleBimModel(
  workspacePath: string,
  bimModel: IRequestModel
): void {
  const bimModelPath = path.join(
    workspacePath, 'input_data', 'bim_model',
    bimModel.id!.toString(), 'bim_model.json'
  );
  // ...
  const modelContent = fs.readFileSync(bimModelPath, 'utf-8');
  const modelData: BimModelJson = JSON.parse(modelContent);

  if (bimModel.forge_urn !== modelData.urn) {  // <-- 여기서 실패
    logger.error(
      'ForgeUrnValidator::validateSingleBimModel | URN mismatch for BIM %d, requested: %s, received: %s',
      bimModel.id, bimModel.forge_urn, modelData.urn
    );
    throw new Error(`Forge URN mismatch for BIM ${bimModel.id}: expected ${modelData.urn}, got ${bimModel.forge_urn}`);
  }
}

기대 동작: bim_validator_request.jsonforge_urn (Tesla API에서 가져온 현재 URN)과 bim_model.jsonurn (preprocessor가 다운로드한 시점의 URN)이 동일해야 합니다.

실제 동작: bimModel.forge_urn (request JSON)은 version=12 (dXJuOm...dmVyc2lvbj0xMg==)이고, modelData.urn (disk의 bim_model.json)은 version=5 (dXJuOm...dmVyc2lvbj01)로, 서로 다른 버전을 가리키고 있어 validation이 실패했습니다.

CPBim.exportRequestModelforge_urn 값의 출처 (cpbim.ts:105-171):

typescript
// applications/agents/packages/models/src/cpbim.ts:49,160-164
get forgeUrn(): string | undefined { return this.serverModel?.forge_urn; }
// ...
const requestModel: IRequestModel = {
  id: this.id,
  key: this.key,
  type: 'bim',
  forge_urn: this.forgeUrn,  // Tesla API의 Bim.forge_urn — 현재 최신 버전
  // ...
};

Log Evidence#

사용한 Datadog 쿼리:

text
service:cupixworks-sitetrack-instance status:error @environment:production
text
service:cupixworks-sitetrack-instance "validateForgeUrns" @environment:production
text
service:cupixworks-sitetrack-instance ("BIM 16317" OR "16317") @environment:production

첫 번째 발생 (sitetrack 16069, job 1002344) — 2026-04-08T15:27:10Z:

text
[2026-04-08T15:27:10.490Z] [info] Sitetrack::validateForgeUrns | begin - sitetrack_id: 16069
[2026-04-08T15:27:10.490Z] [info] ForgeUrnValidator::validateForgeUrns | begin
[2026-04-08T15:27:10.493Z] [error] ForgeUrnValidator::validateSingleBimModel | URN mismatch for BIM 16317, requested: dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLjdIeFh0SjA2UnpTWHRNZ3FhRVVKU3c_dmVyc2lvbj0xMg==, received: dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLjdIeFh0SjA2UnpTWHRNZ3FhRVVKU3c_dmVyc2lvbj01
[2026-04-08T15:27:10.495Z] [error] ForgeUrnValidator::validateForgeUrns | validation failed - Error: Forge URN mismatch for BIM 16317...
[2026-04-08T15:27:10.495Z] [error] Sitetrack::validateForgeUrns | validation failed - Error: Forge URN validation failed...

두 번째 발생 (sitetrack 16041, job 1002484) — 2026-04-08T17:05:59Z:

text
[2026-04-08T17:05:59.939Z] [info] Sitetrack::validateForgeUrns | begin - sitetrack_id: 16041
[2026-04-08T17:05:59.939Z] [info] ForgeUrnValidator::validateForgeUrns | begin
[2026-04-08T17:05:59.941Z] [error] ForgeUrnValidator::validateSingleBimModel | URN mismatch for BIM 16317, requested: dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLjdIeFh0SjA2UnpTWHRNZ3FhRVVKU3c_dmVyc2lvbj0xMg==, received: dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLjdIeFh0SjA2UnpTWHRNZ3FhRVVKU3c_dmVyc2lvbj01
[2026-04-08T17:05:59.942Z] [error] ForgeUrnValidator::validateForgeUrns | validation failed
[2026-04-08T17:05:59.942Z] [error] Sitetrack::validateForgeUrns | validation failed

URN 디코딩 결과:

text
Expected (bim_model.json): urn:adsk.wipprod:fs.file:vf.7HxXtJ06RzSXtMgqaEUJSw?version=5
Got (Tesla API):           urn:adsk.wipprod:fs.file:vf.7HxXtJ06RzSXtMgqaEUJSw?version=12

동일한 Forge 파일(vf.7HxXtJ06RzSXtMgqaEUJSw)이지만, preprocessor 시점에는 version=5였고 현재 Tesla API에는 version=12가 저장되어 있습니다. 두 번의 발생 모두 동일 사용자(alexander.shahinian@tutorperini.com, user_id: 41934), 동일 팀(tpc, id: 778), 동일 세션(a093b811543cb14f791a47074e68ffc6e6bc0a05)에서 발생했으며, 서로 다른 sitetrack ID(16069, 16041)에서 같은 BIM 16317에 대해 실패했습니다.

같은 시간대에 다른 7개 팀의 sitetrack 실행(16062, 16065, 16070, 16073, 16076, 16071, 15841)은 모두 "all validations passed"로 성공하여, 이 문제가 BIM 16317에 국한된 것임을 확인합니다.

Fix Recommendation#

Log Level 조정#

URN mismatch는 의도된 실패이므로, 관련 로그를 error에서 warn으로 변경하여 에러 모니터링 노이즈를 제거합니다.

변경 대상 (3곳):

  1. forge-urn-validator.ts:56logger.errorlogger.warn

    typescript
    // URN mismatch 감지 시 로그
    logger.warn(
      'ForgeUrnValidator::validateSingleBimModel | URN mismatch for BIM %d, requested: %s, received: %s',
      bimModel.id, bimModel.forge_urn, modelData.urn
    );
    
  2. forge-urn-validator.ts:29logger.errorlogger.warn

    typescript
    // validation failed 상위 catch
    logger.warn('ForgeUrnValidator::validateForgeUrns | validation failed - %s', error);
    
  3. sitetrack-service.ts:195logger.errorlogger.warn

    typescript
    // sitetrack-service의 catch block
    logger.warn('Sitetrack::validateForgeUrns | validation failed - %s', error);
    

validation 로직(strict equality 비교, throw, AGT1813 error code 설정)은 의도된 동작이므로 변경 불필요합니다.

Monitoring#

  • URN validation 실패 빈도 추적 (log level 변경 후 status:warn 사용):
text
service:cupixworks-sitetrack-instance "URN mismatch" status:warn @environment:production
  • BIM별 실패 패턴 모니터링 (특정 BIM이 반복적으로 실패하는지):
text
service:cupixworks-sitetrack-instance "validateForgeUrns" "validation failed" status:warn @environment:production
  • Error code AGT1813 발생 추이:
text
service:cupixworks-sitetrack-instance "AGT1813" @environment:production

Risk Assessment#

  • Risk level: low
  • 예상 복잡도: trivial — 의도된 validation 실패이며, 수정 범위는 3개 파일의 logger.errorlogger.warn 변경으로 한정됩니다. 기능 동작에 영향 없이 에러 모니터링 노이즈만 제거합니다.

Revision History#

Revision 1#

Feedback: 의도된 실패라서 log level 만 조정

판정:

피드백 항목 판정 근거
URN mismatch는 의도된 실패이므로 validation 로직 변경 불필요, log level만 조정 수용 forge-urn-validator.ts:55-62 — strict equality 비교(bimModel.forge_urn !== modelData.urn)는 stale preprocessor 결과물 사용을 방지하는 safety check로, 의도된 동작이 맞음. 현재 mismatch 시 logger.error (line 56), validation failed 시 logger.error (line 29), sitetrack-service.ts:195에서도 logger.error로 기록 중 — 의도된 실패를 error로 기록하면 Datadog 에러 모니터링에 불필요한 노이즈 발생. warn level로 변경하면 모니터링 노이즈 제거되면서도 로그 추적 가능.

변경 사항:

  • Root Cause Summary: 의도된 동작임을 명시하고, 문제를 "validation 로직"이 아닌 "log level"로 재정의
  • Fix Recommendation: 기존 3단계(즉시/단기/장기) 권장사항을 모두 제거하고, logger.errorlogger.warn 변경 3곳으로 단순화 (validation 로직, throw, error code 설정은 유지)
  • Monitoring: Datadog 쿼리의 status:errorstatus:warn으로 업데이트
  • Risk Assessment: medium → low, standard → trivial로 하향 조정

추가 조사 내용:

  • forge-urn-validator.ts (전체 파일) — 3개의 logger.error 호출 위치 확인 (line 29, 56)
  • sitetrack-service.ts:180-199validateForgeUrns 메서드의 catch block logger.error (line 195) 확인
  • validation 로직이 throw + AGT1813 error code 설정을 수행하므로 기능 동작은 log level과 독립적임을 확인