83 lines
4.0 KiB
Markdown
83 lines
4.0 KiB
Markdown
# dcy-041 Core broker gap closure validation
|
|
|
|
- 검증 시각: 2026-07-29 17:54 KST
|
|
- 브랜치: `codex/core-adapter-gap-closure`
|
|
- 검증 HEAD: `611805d`
|
|
- 분류: `research_only=true`, `official_comparable=false`,
|
|
`real_order_allowed=false`, `order_adapter=virtual_locked_replay`
|
|
|
|
## 검증 결과
|
|
|
|
1. 정적검사: `uv run --extra dev ruff check .` PASS.
|
|
2. 로컬 전체 회귀: `903 passed, 50 skipped`.
|
|
3. 격리 Docker PostgreSQL/RabbitMQ 전체 통합: `953 passed, 1 skipped`.
|
|
4. 공용 매매 인증 7단계:
|
|
- logic
|
|
- regression
|
|
- virtual_contract
|
|
- virtual_e2e
|
|
- fault_injection
|
|
- restart_recovery
|
|
- ledger_reconcile
|
|
- 결과: PASS
|
|
5. 인증 산출물:
|
|
`/Volumes/J_HDD/virtual_exchange/artifacts/validation/trex-core-execution/core-gap-final-20260729-1753-kst/run.json`
|
|
|
|
## 장애 주입·재시작 판정
|
|
|
|
- 결과불명 주문은 동일 broker order 조회로만 수렴하고 중복 주문 0.
|
|
- timeout·운영자 취소는 `cancel_state IS NULL` 비교·설정에 성공한 한
|
|
호출만 전송하며 재시작 후 반복 취소 0.
|
|
- AUTO는 실제 KRX/NXT로 확정되어 주문번호와 함께 저장되고 취소·재시작에 재사용.
|
|
- 체결 후 잔량과 재시작 원장대조는 실시간 잔고만 사용.
|
|
- KIS 조회 전송 오류에만 동일 endpoint·계좌·상품·app identity의 미만료
|
|
스냅샷을 사용.
|
|
- 계정 2와 같은 혼합계정은 전략 소유수량만 스냅샷·매도수량에 노출.
|
|
- 신규매수 현금검사와 pending 전이는 동일 instance advisory lock 안에서 원자 처리.
|
|
|
|
## 최초 Docker 실패와 해소
|
|
|
|
- 최초 실패 단계: PostgreSQL 마이그레이션 재적용.
|
|
- 최초 원인: 017 마이그레이션이 019에서 도입한 기존 `AUTO` 행을 허용하지 않아
|
|
반복 적용 시 check constraint 위반.
|
|
- 마지막 안전 상태: 운영 컨테이너·DB·주문 경로 미접촉, 격리 테스트 DB만 사용.
|
|
- 수정: 017 제약을 AUTO 호환으로 만들고 기존 AUTO 행이 있는 상태의 migration
|
|
replay 회귀를 추가.
|
|
- 재실행: 새 격리 DB에서 전체 마이그레이션과 953개 통합검사 PASS.
|
|
|
|
## 실전 잠금
|
|
|
|
- 실전 계정·주문·운영 컨테이너 변경 없음.
|
|
- `live_dry_run`, `live_one_shot`, 서버 배포, 로컬 어댑터 제거는 미수행.
|
|
- 실전 반영은 서버 차이 검증 후 대상 계정·전략·이미지 SHA를 명시한 별도 승인 필요.
|
|
|
|
## 서버 이미지 차이와 적용 대기
|
|
|
|
- 검증 후보 이미지:
|
|
- tag: `trex-core:candidate-12b6eb5`
|
|
- image id: `sha256:343f0a0955f92357db5ce53f26d22d8196bc325ec0e07919c53c44a7997a44aa`
|
|
- revision label: `12b6eb5`
|
|
- import smoke: PASS
|
|
- 현재 운영 Core 이미지:
|
|
- 계정 2: `sha256:21c4ed9bfdcf...`
|
|
- 계정 3: `sha256:bf8064a94e93...`
|
|
- Top50 가상: `sha256:fa9b9c609a01...`
|
|
- Top50 섀도: `sha256:fb981d8c62fc...`
|
|
- 네 운영 이미지의 `execution.py`, `kis.py`, `intents.py` 해시는 모두 후보와 다르다.
|
|
- 계정 2·3의 `TREX_ACCOUNT_SNAPSHOT_ENABLED`는 현재 미설정이라 기본 OFF다.
|
|
- 계정 2는 `TREX_KIS_STRATEGY_OWNERSHIP_PATH`가 설정되어 수동 보유 보호가 유지되고,
|
|
계정 3은 전용 전략계정이라 이 경로가 미설정이다.
|
|
- 현재 Compose의 Docker build context는 정본 `/Volumes/J_HDD/trex/trex-core`
|
|
(`7084304`)를 복사한다. PR 브랜치는 별도 worktree이므로 일반 rebuild만 실행하면
|
|
후보가 아니라 이전 소스를 다시 만든다.
|
|
|
|
### 승인 후 적용 순서
|
|
|
|
1. 현재 계정별 image id를 rollback tag로 보존한다.
|
|
2. PR 브랜치 또는 승인된 merge SHA를 명시한 이미지로만 교체한다.
|
|
3. DB 백업 뒤 migration 017/019/020/021 재적용과 테이블·제약을 확인한다.
|
|
4. 계정 3에서 주문 없는 `live_dry_run`과 계좌범위 해시·조회만 확인한다.
|
|
5. 계정 3 Core 적용·재시작 복구·원장대조 후 계정 2를 별도 적용한다.
|
|
6. 계정 2는 수동보유 보호와 전략 소유수량을 재확인한다.
|
|
7. 두 계정의 Core 동작이 확인된 뒤에만 로컬 KIS 어댑터 중복 기능을 제거한다.
|