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) + sibling23a74e95(handlingMessageErrors) 세 개 error 로그를 발생시킴. 캡처 fetch 를 먼저 수행하면 첫 실패가capture.get에서 발생하고, ENT4000 을 정상 skip 으로 분류할 수 있어 세 로그가 모두 warn 한 줄로 정리됨. - Lines: 84-112 (
run재정렬 및 ENT4000 skip 경로 추가), 343-357 (updateSiLiteStatecatch 블록 로그 다운그레이드).
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.get이body.result.code === 'ENT4000'로 실패하면logger.warn한 줄과 함께 run 이 정상 resolve 하며capture.update는 호출되지 않는다 (신규 스펙 케이스로 확인). -
updateSiLiteStatecatch 블록에서 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.ts—run재정렬 이후에도 전체 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.