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

3.6 KiB

id, status
id status
ac-0023 active

B/C reconcile warning — strategy RPC exclusion and intent blocking

Criterion

case_code=B(core slot↔KIS 수량 불일치) 또는 case_code=C(portfolio-hub↔KIS 수량 불일치) reconcile-warning이 활성인 holding slot은 trex.slots.req.<instance> 응답에서 제외해야 한다. 동일 slot의 B/C 원인은 서로 덮어쓰지 않고 동시에 보존하며, 응답에는 제외된 slot 수와 활성 case별 count를 포함한다. 신규 buy/sell intent는 같은 durable warning 원인 집합을 재확인하여 reconcile_warned 사유로 거부한다. warn-store를 읽지 못하거나 warning metadata가 비어 있거나 지원하지 않는 case를 포함하면 안전한 eligibility를 입증할 수 없으므로 slots RPC는 degraded=true / reason="warn_store_unavailable", intent는 reconcile_warning_unavailable(조회 실패) 또는 reconcile_warned(empty/unsupported metadata)로 fail-closed 처리해야 한다. sync는 수량 일치 확인 후 B-case만 해제하고, verify는 instance+symbol 단위 KIS와 portfolio-hub 합계가 다시 일치한 경우 C-case만 해제하여 다른 활성 원인을 보존한다. C-case 수량 대조는 instance_key + symbol 단위 합계로 수행하며, 개별 portfolio 수량을 KIS 종목 합계와 직접 비교해서는 안 된다. 이 경로는 주문 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, active_reconcile_warning_cases.C=2. 다른 symbol 정상 slot은 같은 응답에 포함된다.
  • 복합 원인: 동일 slot에 B와 C가 동시에 활성일 때 두 원인이 모두 조회·차단되며, B 또는 C 하나를 해제해도 다른 원인은 보존된다.
  • B-case: B warning이 활성인 holding slot은 slots RPC에서 제외되고 신규 buy/sell intent도 거부된다.
  • 단일 portfolio 불일치: hub 단일 portfolio qty != KIS → 해당 symbol 전체 slot 제외.
  • fail-closed (slots RPC): warn-store 조회가 실패하거나 empty/unknown case metadata를 반환하면 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로 거부. unknown case도 거래 허용 근거로 사용하지 않는다.
  • 해제: 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)을 적용하지 않는다.