ES /docs

SiliteService::updateSiLiteState | failed - captureId: 736992, state: processing, error: {"stack":"H

Fix Plan: SiliteService::updateSiLiteState — 403 ENT4000 on trashed capture

Changes#

cupixworks: applications/agents/packages/cupix-si-lite-agent/src/silite-service.ts#

  • What: run 흐름을 재정렬. 진입 즉시 fetchAndValidateCapture(targetId) 를 먼저 호출해 캡처 상태를 확인한 뒤에 updateSiLiteState(Processing) 을 호출하도록 순서를 바꾼다. capture.get 이 Tesla API 로부터 HTTP 403 + body.result.code === 'ENT4000' 로 실패하면 logger.warn('SiliteService::run | capture in trash, skipping - captureId: %d', targetId) 로 warn 한 줄만 남기고 정상 종료(SQS 메시지 자동 삭제). 그 외의 예외는 기존과 동일하게 catch 절로 propagate 되어 updateSiLiteState(Error) 를 시도.
  • Why: RCA 근본 원인 — 검증 이전 시점의 첫 상태 전환 시도가 트래시된 캡처에서 무조건 403 을 유발해 본 클러스터 + sibling ab8a602b(state:error) + sibling 23a74e95(handlingMessageErrors) 세 개 error 로그를 발생시킴. 캡처 fetch 를 먼저 수행하면 첫 실패가 capture.get 에서 발생하고, ENT4000 을 정상 skip 으로 분류할 수 있어 세 로그가 모두 warn 한 줄로 정리됨.
  • Lines: 84-112 (run 재정렬 및 ENT4000 skip 경로 추가), 343-357 (updateSiLiteState catch 블록 로그 다운그레이드).

cupixworks: applications/agents/packages/cupix-si-lite-agent/src/silite-service.ts (updateSiLiteState catch)#

  • What: updateSiLiteState 의 catch 블록에서 에러의 response.body.result.code === 'ENT4000' 인 경우 logger.warn 로 다운그레이드, 그 외 코드/에러는 기존 logger.error 유지. 모든 4xx 를 warn 으로 낮추지 않고 ENT4000 만 좁혀서 처리 (실제 authorization 실패 PERM10000 은 error 로 유지).
  • Why: run 재정렬 이후 정상 흐름에서 ENT4000 이 발생할 가능성은 낮지만, 큐잉 후 소비 전에 trash 로 이동한 race 케이스에서 updateSiLiteState(Done) 이나 updateSiLiteState(Error) 가 ENT4000 을 만날 수 있음. 이 경로도 expected operational condition 으로 분류.
  • Lines: 349-356 (catch 블록 내 코드 분기).

cupixworks: applications/agents/packages/cupix-si-lite-agent/test/silite-service.spec.ts#

  • What: 신규 describe 블록 (run - trashed capture handling) 추가. capture.get 이 ENT4000 을 mock 으로 throw 하면 (1) logger.warn 로 skip 메시지가 남는지, (2) capture.update 가 호출되지 않는지 (Processing 상태 전환 없음), (3) run 이 정상 resolve (throw 하지 않음) 하는지 검증. 별도 describe (updateSiLiteState - ENT4000 downgrade) 로 catch 블록의 warn/error 분기 검증. 기존 스펙 케이스들은 run 재정렬 후에도 capture.update 첫 호출이 여전히 Processing 이어야 하므로 순서 검증부만 재정렬 (fetch 성공 후 Processing).
  • Why: 회귀 방지 및 diff coverage 유지 (mesh-agent 스펙 확장 패턴 재사용, memory: d208f6f7).
  • Lines: 신규 케이스 2-3 개 추가; 기존 should update si_lite_state to processing at start of run 등의 케이스는 mock 순서만 조정.

Acceptance Criteria#

  • run 흐름이 fetchAndValidateCapture 를 먼저 호출한 뒤 updateSiLiteState(Processing) 을 호출한다 (silite-service.ts diff 로 확인).
  • capture.getbody.result.code === 'ENT4000' 로 실패하면 logger.warn 한 줄과 함께 run 이 정상 resolve 하며 capture.update 는 호출되지 않는다 (신규 스펙 케이스로 확인).
  • updateSiLiteState catch 블록에서 ENT4000 만 logger.warn 로, 그 외 에러는 logger.error 로 남긴다 (신규 스펙 케이스로 확인).
  • 기존 스펙 (should complete full pipeline successfully, should update si_lite_state to processing at start of run) 은 재정렬 후에도 통과.
  • pnpm exec eslint 클린.

Tests#

  • 기존 테스트: applications/agents/packages/cupix-si-lite-agent/test/silite-service.spec.tsrun 재정렬 이후에도 전체 pipeline / no-workareas / no-trades / validation-error 케이스 통과 유지.
  • 신규 테스트:
    • describe('run - trashed capture handling') — ENT4000 skip 경로.
    • describe('updateSiLiteState - ENT4000 downgrade') — catch 블록 warn/error 분기.
  • 실행: cd applications/agents && pnpm exec nx run cupix-si-lite-agent:test.