ES /docs

BaseService::handlingMessageErrors | sqsMessage - {"MessageId":"02d8aa9c-0173-422c-adaf-b6b0fc260ae9

Fix Plan: BaseService::handlingMessageErrors error: 공란 (observability) + svf2 code 진단성

RCA 의 "### 단기 개선 (1주 이내)" 3개 항목만 구현한다. underlying trigger 인 svf2 code:305 (외부 Autodesk APS 데이터 품질) 는 noise 이며 코드 수정 대상이 아니다 — 관측성/진단성 개선에 한정한다.

Changes#

cupixworks: applications/agents/packages/base/src/base-service.ts (handlingMessageErrors 로그)#

  • What: handlingMessageErrors 마지막 error 로그(:318-319)의 포맷 지정자와 splat 인자 개수를 일치시킨다. 현재 'BaseService::handlingMessageErrors | sqsMessage - %s, error:'%s 를 1개만 두고 splat 인자를 2개(JSON.stringify(sqsMessage), errorAndMessage.error) 넘긴다. 두 번째 인자를 포맷 문자열의 명시적 지정자로 소비하도록 ', error: %s' 로 바꾸고, error 인자는 사전 직렬화하여 넘긴다: errorAndMessage.error instanceof Error ? (errorAndMessage.error.stack ?? errorAndMessage.error.message) : JSON.stringify(errorAndMessage.error). 이렇게 하면 winston splat 이 numeric key 로 밀어내지 않아 filterNumericKeys(cplogger.ts:45-53)에 의해 삼켜지지 않는다.
  • Why: RCA Root Cause (2) observability bug — %s 1개 + splat 2개 불일치로 두 번째 인자(error)가 winston 에 의해 numeric key 로 저장되고 cplogger 가 출력 직전 제거 → error 내용이 통째로 유실되어 대표 로그의 error: 뒤가 공란이 됨.
  • Lines: base-service.ts:318-319

cupixworks: applications/agents/packages/base/src/base-service.ts (원본 error 보존)#

  • What: :304 errorAndMessage.error = apiErrorObject;apiErrorObject 가 실제 API 에러 객체가 아니라 문자열 'undefined response'/'undefined error' 일 때 원본 예외(message/stack)를 소실시킨다. apiErrorObject 가 truthy 하되 문자열인 경우 원본 error 도 함께 보존하도록, error 대입을 원본 error 를 잃지 않는 형태로 변경한다: apiErrorObject 가 문자열이면 errorAndMessage.error 를 원본 error 로 유지하고, 객체(실제 API 에러)면 apiErrorObject 를 사용한다.
  • Why: RCA 단기개선 2번 — apiErrorObject 가 실제 API 에러 객체가 아닌 'undefined response' 문자열일 때 원본 error 의 message/stack 이 소실됨. 진단 정보 보존.
  • Lines: base-service.ts:304

cupixworks: applications/agents/packages/cupix-tesla-room-agent/src/process/room-extractor.process.ts (throw 메시지에 code 포함)#

  • What: :52(origin/develop 기준 else 블록의 throw new Error('Failed to get rooms from svf2')) throw 메시지에 forge-agents 가 반환한 code 를 포함한다: throw new Error(\Failed to get rooms from svf2 (code: ${result.Error})`). (바로 위 this.logError` 에서 이미 code/message 를 JSON 으로 남기고 있으나, throw 로 전파된 상위(base-service) 로그에서는 code 가 사라지므로 throw 메시지 자체에 code 를 실어 로그만으로 305 식별이 가능하게 한다.)
  • Why: RCA 단기개선 3번 — throw 메시지에 code 포함하여 상위 Failed to get rooms from svf2 로그만으로 305 식별 가능하게.
  • Lines: room-extractor.process.ts throw 라인 (else 블록, origin/develop 기준 ~55)

Acceptance Criteria#

  • base-service.ts handlingMessageErrors 최종 로그의 포맷 문자열 %s 개수 == splat 인자 개수 (지정자-인자 일치).
  • errorAndMessage.error 가 error 로그에서 numeric key 로 밀려나지 않고 문자열로 정상 출력됨 (사전 직렬화).
  • apiErrorObject 가 문자열('undefined response'/'undefined error')일 때 원본 error 의 message/stack 이 로그에 보존됨.
  • room-extractor.process.ts 의 svf2 throw 메시지에 (code: ...) 가 포함됨.
  • eslint (변경 파일) 통과.

Tests#

  • 기존 테스트: base / cupix-tesla-room-agent 패키지의 기존 유닛 테스트 (존재 시). 변경 파일에 대응하는 spec 없으면 lint 만 수행.
  • 신규 테스트: 없음 (로그 포맷/문자열 조정 — trivial observability 개선, 별도 단위테스트 불요).