Files
trex-core/.proofline/criteria/ac-0023.md
T

2.9 KiB

id, status
id status
ac-0023 active

C-case quantity mismatch — strategy RPC exclusion and intent blocking

Criterion

KIS 계좌 잔고(hldg_qty)와 같은 instance가 관리하는 동일 symbol의 portfolio-hub asset_quantity 합계가 일치하지 않으면(case_code=C reconcile-warning 활성), 해당 symbol의 모든 holding slot을 trex.slots.req.<instance> 응답에서 제외해야 한다. 수량 대조는 instance_key + symbol 단위 합계로 수행하며, 개별 portfolio 수량을 KIS 종목 합계와 직접 비교해서는 안 된다. 응답에는 excluded_slots.reconcile_quantity_mismatch 필드로 제외된 slot 수를 포함한다. warn-store를 읽지 못하면 경고 유무를 모르는 상태로 slot 목록을 반환하지 않고 degraded=true / reason="warn_store_unavailable"으로 응답해야 한다(fail-closed). 신규 buy/sell intent는 durable warning을 재확인하여 reconcile_warned 사유로 거부한다. C-case 경고 해제는 symbol 단위 합계가 다시 일치한 경우에만 수행하며, 해당 symbol에 걸린 모든 C-case 경고를 함께 해제한다. 이 경로는 주문 submit/cancel, ledger write, slot lifecycle mutation을 유발하지 않아야 한다.

Verification

  • 성공 조건: KIS 440주, hub portfolio A 200주 + B 240주(합계 440) → A·B 모두 반환되고 excluded_slots.reconcile_quantity_mismatch=0.
  • 불일치 조건: KIS 440주, hub A 200주 + B 235주(합계 435) → A·B 모두 제외되고 excluded_slots.reconcile_quantity_mismatch=2. 다른 symbol 정상 slot은 같은 응답에 포함된다.
  • 단일 portfolio 불일치: hub 단일 portfolio qty != KIS → 해당 symbol 전체 slot 제외.
  • fail-closed (slots RPC): warn-store가 list_c_case_warned() 중 예외를 throw하면 slots=[], degraded=true, reason="warn_store_unavailable" 반환.
  • fail-closed (intent): intent 처리 시 warn_store.is_warned() 호출이 실패하면 reconcile_warning_unavailable 사유로 거부해야 한다 — fail-open 허용 불가.
  • intent race: 마지막 slots RPC 이후 경고가 설정된 경우에도 intent 처리 시점의 durable warning을 재확인해 reconcile_warned로 거부.
  • 해제: symbol 합계가 다시 일치하면 해당 symbol의 모든 C-case 경고만 함께 해제. 같은 symbol의 B-case 등 다른 case 경고는 보존해야 한다.
  • 해제 대상: HOLDING 뿐 아니라 모든 상태의 slot에 걸린 C-case 경고를 포함한다.
  • 해제 실패: 해제 도중 예외가 발생하면 result='clear_failed'를 반환하고 완전 성공으로 보고하지 않아야 한다(부분 성공 = 실패).
  • 시간이 지났다는 이유만으로 자동 해제하지 않음.
  • 비침습 조건: slots RPC 호출 전후로 slot 상태 전이, broker mutation, ledger write side effect가 없어야 한다.
  • AC-0022 우선순위: C-case로 제외된 slot에는 broker-authoritative qty 응답 형식(AC-0022)을 적용하지 않는다.