Sitetrack::validateForgeUrns | validation failed - {
RCA: Sitetrack::validateForgeUrns | validation failed
Error Log#
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:45—Sitetrackservice.init()호출 sitetrack-service.ts:48—this.run()실행sitetrack-service.ts:96—this.loadFileSystem(cpSitetrack)— EFS에서 preprocessor 결과물을 workspace로 복사. 이 결과물에는 preprocessor가 다운로드한 시점의bim_model.json(version=5 URN 포함)이 포함됨sitetrack-service.ts:100—this.validateForgeUrns(cpSitetrack)호출sitetrack-service.ts:192—ForgeUrnValidator.validateForgeUrns()정적 메서드 호출- Failure point:
forge-urn-validator.ts:55— URN 비교 실패
Sitetrackservice.validateForgeUrns (sitetrack-service.ts:180-199):
// 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):
// 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.json의 forge_urn (Tesla API에서 가져온 현재 URN)과 bim_model.json의 urn (preprocessor가 다운로드한 시점의 URN)이 동일해야 합니다.
실제 동작: bimModel.forge_urn (request JSON)은 version=12 (dXJuOm...dmVyc2lvbj0xMg==)이고, modelData.urn (disk의 bim_model.json)은 version=5 (dXJuOm...dmVyc2lvbj01)로, 서로 다른 버전을 가리키고 있어 validation이 실패했습니다.
CPBim.exportRequestModel — forge_urn 값의 출처 (cpbim.ts:105-171):
// 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 쿼리:
service:cupixworks-sitetrack-instance status:error @environment:production
service:cupixworks-sitetrack-instance "validateForgeUrns" @environment:production
service:cupixworks-sitetrack-instance ("BIM 16317" OR "16317") @environment:production
첫 번째 발생 (sitetrack 16069, job 1002344) — 2026-04-08T15:27:10Z:
[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:
[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 디코딩 결과:
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곳):
-
forge-urn-validator.ts:56—logger.error→logger.warntypescript// URN mismatch 감지 시 로그 logger.warn( 'ForgeUrnValidator::validateSingleBimModel | URN mismatch for BIM %d, requested: %s, received: %s', bimModel.id, bimModel.forge_urn, modelData.urn ); -
forge-urn-validator.ts:29—logger.error→logger.warntypescript// validation failed 상위 catch logger.warn('ForgeUrnValidator::validateForgeUrns | validation failed - %s', error); -
sitetrack-service.ts:195—logger.error→logger.warntypescript// 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사용):
service:cupixworks-sitetrack-instance "URN mismatch" status:warn @environment:production
- BIM별 실패 패턴 모니터링 (특정 BIM이 반복적으로 실패하는지):
service:cupixworks-sitetrack-instance "validateForgeUrns" "validation failed" status:warn @environment:production
- Error code
AGT1813발생 추이:
service:cupixworks-sitetrack-instance "AGT1813" @environment:production
Risk Assessment#
- Risk level: low
- 예상 복잡도: trivial — 의도된 validation 실패이며, 수정 범위는 3개 파일의
logger.error→logger.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.error→logger.warn변경 3곳으로 단순화 (validation 로직, throw, error code 설정은 유지) - Monitoring: Datadog 쿼리의
status:error→status:warn으로 업데이트 - Risk Assessment: medium → low, standard → trivial로 하향 조정
추가 조사 내용:
forge-urn-validator.ts(전체 파일) — 3개의logger.error호출 위치 확인 (line 29, 56)sitetrack-service.ts:180-199—validateForgeUrns메서드의 catch blocklogger.error(line 195) 확인- validation 로직이 throw +
AGT1813error code 설정을 수행하므로 기능 동작은 log level과 독립적임을 확인