--- id: "ac-0001" status: active --- # KIS 연속 잔고 전체 조회 및 종목별 집계 ## Criterion `KISBroker.get_balance()`는 KIS 국내주식 잔고조회 최초 요청에서 빈 continuation key와 공백/미지정 `tr_cont`를 사용해야 한다. 성공 응답의 response header `tr_cont`가 `F` 또는 `M`이면 body의 `ctx_area_fk100`과 `ctx_area_nk100`을 다음 요청 query에 전달하고 후속 요청 header에 `tr_cont=N`을 사용해야 하며, `D` 또는 `E`에서 종료해야 한다. 전체 성공 페이지의 유효한 양수 `hldg_qty`는 `pdno`별로 합산한 하나의 `BalanceItem`으로 반환하고 0 이하 수량 row는 제외해야 한다. `OwnershipAwareBroker`가 KIS broker를 감싸는 경우에도 완전한 raw snapshot이 기존 projection의 입력이 되어야 하며 ownership 및 `ownership_mismatch` 정책은 변경되지 않아야 한다. ## Verification - 성공 조건: synthetic `F → M → E` 다중 페이지 응답에서 요청별 header와 continuation query가 계약대로 이어지고, 첫 페이지와 후속 페이지의 모든 양수 보유종목 및 페이지에 걸쳐 중복된 종목의 합산 수량이 최종 결과에 포함되며 `E` 이후 추가 요청이 없어야 한다. 별도 fixture로 `D` 종료도 확인한다. - 실패·경계 조건: 정상 단일 페이지와 검증된 빈 잔고는 추가 요청 없이 기존 결과를 반환하고, 0 이하 수량 row는 결과에서 제외되어야 한다. 실전 50건·모의 20건이라는 page-size에 의존하지 않고 response header 계약만으로 순회해야 한다. - ownership 보존 조건: 첫 페이지의 manual holding과 후속 페이지의 strategy-owned symbol을 포함한 KIS 응답을 `OwnershipAwareBroker`에 연결했을 때 후속 페이지 종목이 projection 결과에 포함되어야 한다. 전체 raw 수량이 전략 소유수량 이상이면 성공하고, 실제로 작을 때만 기존 `ownership_mismatch`가 유지되어야 한다. - 검사 방법: `tests/adapters/broker/test_kis.py`에서 `httpx.get`을 페이지별 response header/body fixture로 대체하여 호출 횟수, 요청 header, query key, 종료 조건과 최종 `BalanceItem` 집계를 단언하고, ownership adapter 회귀 테스트에서 완전한 delegate 결과의 projection과 기존 mismatch 경계를 단언한다.