Co-authored-by: genichin <4282227+genichin@users.noreply.github.com>
2.9 KiB
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)을 적용하지 않는다.