ES /docs

Forge URN validation failed: Error: Forge URN mismatch for BIM 18647: expected dXJuOmFkc2sub2JqZWN0c

RCA: Forge URN validation failed: Forge URN mismatch for BIM 18647

Overview#

What Happened#

2026-05-01 09:49 UTC에 cupixworks-sitetrack-instance 서비스에서 BIM 18647에 대한 Forge URN 검증이 실패했다. sitetrack-master-agent의 ForgeUrnValidator가 요청 JSON의 forge_urn과 디스크의 bim_model.jsonurn 값이 불일치함을 감지하고 job 1046324를 실패 처리했다. team clark-vdc, sitetrack 17216에 영향.

Quick Facts#

Field Value
exception.class Error
exception.message Forge URN mismatch for BIM 18647: expected dXJuOmFkc2sub2JqZWN0c...
top_frame _ForgeUrnValidator.validateSingleBimModel (app.cjs:9175)
env production, us-west-2

Affected Teams#

Team / Domain Error Count Impact
clark-vdc (team 87) 1 sitetrack job 1046324 실패, BIM validation 중단으로 sitetrack 17216 분석 미완료

Timeline#

  1. 2026-05-01T09:49:07.682ZForgeUrnValidator::validateSingleBimModel에서 BIM 18647 URN mismatch 감지
  2. 2026-05-01T09:49:07.684ZForgeUrnValidator::validateForgeUrns에서 validation failed로 래핑
  3. 2026-05-01T09:49:07.685ZSitetrackservice.run에서 에러 catch, job error 상태로 업데이트 (error code AGT1813)
  4. 2026-05-01T09:49:07.685Z — 최상위 에러 로그 기록

Error Log#

Datadog Logs

text
Forge URN validation failed: Error: Forge URN mismatch for BIM 18647: expected dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dGVzbGEtcHJvZHVjdGlvbi8xODY0N18xNzczODY0NzAzMzE3XzIwMjYwMzEyLUlBRDU1NCUyMEJMREctQ09NUE9TSVRFLm53ZA==, got dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dGVzbGEtcHJvZHVjdGlvbi8xODY0N18xNzczODc5Njk1MzkyXzIwMjYwMzEyLUlBRDU1NCUyMEJMREctQ09NUE9TSVRFLm53ZA==

Impact#

  • Service: cupixworks-sitetrack-instance
  • Team: clark-vdc
  • 발생 횟수: 1
  • 최초 발생: 2026-05-01T09:49:07.685Z
  • 최근 발생: 2026-05-01T09:49:07.685Z

Root Cause Summary#

BIM 18647의 Forge URN이 두 단계 사이에서 불일치가 발생했다. preprocessor 단계에서 Tesla API로부터 BIM의 forge_urn을 읽어 요청 JSON에 기록하고, 동시에 mesh archive(mesh.zip)를 다운로드하여 bim_model.json을 추출한다. 이후 master 단계에서 ForgeUrnValidator가 요청 JSON의 forge_urnbim_model.jsonurn을 비교 검증한다. 두 값의 base64 디코딩 결과, 동일 파일명(20260312-IAD554%20BLDG-COMPOSITE.nwd)이지만 타임스탬프가 1773864703317 vs 1773879695392로 약 4.2시간 차이가 나며, 이는 BIM 모델이 재업로드되어 새로운 bim_revision이 생성되고 Tesla DB의 forge_urn이 갱신되었으나, mesh archive(EFS에 캐시된 이전 버전)는 이전 forge_urn을 여전히 포함하고 있기 때문이다. preprocessor가 API에서 최신 forge_urn을 읽었지만, mesh archive는 EFS에서 이전 forge-agent가 생성한 구버전이 로드되어 mismatch가 발생한 것이다.

Technical Analysis#

Code Path#

  1. Entry point: Sitetrackservice.initrun 메서드에서 validateForgeUrns 호출
cupix-sitetrack-master-agent/src/sitetrack-service.ts:96-101typescript
await this.loadFileSystem(cpSitetrack);

await this.jobManager.updateJobProgress(30, 'execute_bim_validator');
await this.extractMeshes(cpSitetrack);
this.validateForgeUrns(cpSitetrack);
await this.executeBimValidator(cpSitetrack);
  1. Validation trigger: validateForgeUrnsForgeUrnValidator.validateForgeUrns를 호출
cupix-sitetrack-master-agent/src/sitetrack-service.ts:180-198typescript
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;
  }
};
  1. Failure point: ForgeUrnValidator.validateSingleBimModel에서 bimModel.forge_urn !== modelData.urn 비교 실패
cupix-sitetrack-master-agent/src/forge-urn-validator.ts:55-62typescript
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}`);
}
  1. 데이터 소스 #1 — 요청 JSON의 forge_urn: preprocessor가 CPBim.exportRequestModel()에서 this.forgeUrn (= serverModel.forge_urn, Tesla API에서 최신 값)을 기록
models/src/cpbim.ts:160-164typescript
const requestModel: IRequestModel = {
  id: this.id,
  key: this.key,
  type: 'bim',
  forge_urn: this.forgeUrn,
  1. 데이터 소스 #2bim_model.jsonurn: {meshDirPath}/{bimId}/bim_model.json 파일은 forge-agent가 mesh archive 생성 시 포함한 값. EFS에 저장되며 loadFileSystem에서 workspace로 복사됨. 이 파일의 URN은 forge-agent가 실행된 시점의 forge_urn을 반영하며, BIM 재업로드 후 갱신되지 않는다.

  2. Tesla DB의 forge_urn 갱신: BIM revision 완료 시 statable/bim.rb에서 forge_urn을 최신 revision의 값으로 업데이트

tesla/app/models/concerns/statable/bim.rb:290-293ruby
self.forge_urn = _last_bim_revision&.forge_urn
self.forge_region = _last_bim_revision&.forge_region
self.forge_format_type = _last_bim_revision&.forge_format_type
self.last_bim_revision = _last_bim_revision

기대 동작: preprocessor의 forge_urnbim_model.jsonurn이 동일해야 한다. 실제 동작: BIM 18647가 재업로드되어 DB의 forge_urn은 갱신되었으나, mesh archive(EFS)는 이전 버전 그대로여서 두 값이 불일치.

Log Evidence#

검색한 Datadog 쿼리:

text
service:cupixworks-sitetrack-instance status:error @environment:production "Forge URN"
text
service:cupixworks-sitetrack-instance @environment:production "18647"

에러 로그 (3건이 밀리초 이내 연속 발생):

json
{
  "timestamp": "2026-05-01T09:49:07.682Z",
  "message": "ForgeUrnValidator::validateSingleBimModel | URN mismatch for BIM 18647",
  "source": "_ForgeUrnValidator.validateSingleBimModel (app.cjs:9175)",
  "host": "8e66f1f1d443",
  "attributes": {
    "sitetrack.id": 17216,
    "job.id": 1046324,
    "team": "clark-vdc",
    "session.id": "967e25b0ad339096c294269dad6484da4003bc9a",
    "user": "integration@cupix.com"
  }
}

URN base64 디코딩 비교:

text
expected (bim_model.json): urn:adsk.objects:os.object:tesla-production/18647_1773864703317_20260312-IAD554%20BLDG-COMPOSITE.nwd
got (request forge_urn):   urn:adsk.objects:os.object:tesla-production/18647_1773879695392_20260312-IAD554%20BLDG-COMPOSITE.nwd

두 URN은 동일한 BIM 파일(IAD554 BLDG-COMPOSITE.nwd)이지만 업로드 타임스탬프가 1773864703317 vs 1773879695392로 약 4.2시간 차이. 이는 같은 날 약 4시간 간격으로 BIM 모델이 재업로드되었음을 의미한다.

Hypotheses Considered#

# Hypothesis Evidence for Evidence against Verdict
H1 BIM 재업로드로 인한 forge_urn stale 불일치 — Tesla DB의 forge_urn이 갱신되었으나 EFS의 mesh archive(bim_model.json)는 이전 forge-agent 실행 시점의 값을 유지 URN 디코딩 결과 동일 파일명, 타임스탬프만 4.2시간 차이. statable/bim.rb:290에서 revision 완료 시 DB forge_urn 업데이트 확인. preprocessor는 API에서 최신 forge_urn을 읽고, bim_model.json은 EFS에서 이전 버전 로드 Confirmed
H2 Forge-agent 실행 실패로 bim_model.json이 미갱신 forge-agent가 실패하면 mesh archive가 생성되지 않아 bim_model.json 자체가 없을 수 있음 bim_model.json 파일은 존재함 (existsSync 통과). forge-agent는 정상 완료되었으나 이전 revision 기준 Rejected
H3 네트워크/다운로드 에러로 bim_model.json이 손상 파일이 손상되면 JSON 파싱 실패가 먼저 발생 JSON 파싱은 정상 완료, urn 필드도 유효한 base64 값. 에러는 값 불일치(mismatch)이지 파일 손상이 아님 Rejected

Fix Recommendation#

즉시 조치 (Critical)#

해당 job을 재실행(retry)하면 preprocessor가 최신 mesh archive를 다시 다운로드하여 자연스럽게 해결될 가능성이 높다. 다만 EFS에 캐시된 이전 버전이 남아있으면 동일 에러가 반복될 수 있으므로, 재실행 전 해당 sitetrack의 EFS workspace를 정리해야 한다.

단기 개선 (1주 이내)#

  • forge-urn-validator.ts:55에서 URN mismatch 발생 시 즉시 실패하는 대신, mesh archive를 재다운로드하고 재검증하는 retry 로직 추가를 검토한다. sitetrack-service.ts:100validateForgeUrns 호출 전에 forge_urn이 불일치하면 해당 BIM의 mesh를 강제로 재다운로드하는 flow를 추가할 수 있다.
  • preprocessor에서 bim_model.jsonurn과 API의 forge_urn을 미리 비교하여, 불일치 시 mesh archive를 재다운로드하는 검증 단계를 추가한다.

장기 개선 (재발 방지)#

  • BIM revision이 갱신될 때 관련 EFS 캐시(mesh archive)를 무효화하는 메커니즘 도입. Tesla에서 forge_urn 업데이트 시 이전 mesh archive를 삭제하거나, mesh archive에 version/revision 메타데이터를 포함하여 sitetrack-master가 캐시 유효성을 판단할 수 있게 한다.
  • preprocessor와 master 사이의 데이터 일관성을 보장하기 위해, preprocessor가 request JSON에 forge_urn을 기록할 때 동시에 다운로드한 mesh archive의 bim_model.json URN과 비교 검증하는 단계를 preprocessor 자체에 추가한다. 이렇게 하면 master 단계까지 가지 않고 preprocessor에서 조기에 불일치를 감지할 수 있다.

Monitoring#

  • Forge URN mismatch 에러의 빈도를 추적하는 모니터 추가:
text
service:cupixworks-sitetrack-instance status:error "Forge URN mismatch"
  • BIM 재업로드 후 sitetrack job 실패율을 상관 분석하여, 재업로드가 빈번한 팀에서 이 에러가 집중적으로 발생하는지 확인.

Risk Assessment#

  • Risk level: low
  • 예상 복잡도: standard
  • 1건의 단발성 에러로, BIM 재업로드라는 특정 시나리오에서만 발생. 사용자 데이터 손실은 없으며 job 재실행으로 복구 가능. 다만 재업로드가 빈번한 팀에서는 반복될 수 있다.