8.1 KiB
id, status
| id | status |
|---|---|
| dcy-0006 | confirmed |
명시 venue 기반 주문 실행 계약
Problem
trex-core의 주문 venue 계약에는 과거 AUTO와 기본 KRX 동작이 혼재했다. buy/sell intent에서 venue가 누락될 때 core가 wall-clock으로 KRX/NXT를 선택하거나 내부·저장 계층에서 AUTO를 허용하면 caller가 요청한 routing provenance를 잃고 세션 판단이 execution core로 새어 들어간다. 기존 persisted AUTO row도 현재 계약과 충돌한다.
SOR 주문에서는 원주문 routing venue와 실제 체결 거래소가 서로 다른 의미다. 이를 하나의 venue 값으로 취급하면 submit acknowledgement 뒤 slot venue를 실제 KRX/NXT로 덮어쓰거나, 반대로 fill·ledger/outbox에 실제 거래소 대신 SOR를 기록할 수 있다. 부분체결 잔량 취소와 daemon 재시작은 원주문 SOR를 필요로 하고, actual venue는 broker-authoritative KRX/NXT evidence가 있을 때만 확정되어야 한다.
기대 상태는 venue 누락/null intent를 SOR로 정규화하고 explicit KRX/NXT/SOR를 변경 없이 보존하며 AUTO와 wall-clock routing을 제거하는 것이다. original order venue와 actual execution venue는 submit·ack·cancel·fill polling·restart·ledger/outbox 전체에서 별도 의미로 durable하게 보존되어야 한다.
Evidence
- 원본 승인 문서: GitHub issue #61
https://github.com/fourblocks2020/trex-core/issues/61은 SOR default, explicit venue preservation, AUTO removal, persisted AUTO→SOR migration, no wall-clock routing과 execution venue lifecycle을 승인했다. - 승인 결정은 venue 누락의 SOR default, explicit KRX/NXT/SOR 유지, AUTO의 public wire·internal model·persistence 제거, persisted AUTO의 SOR 정규화, SOR ack·조회·취소 계약을 구현 검증으로 증명하고 실패 시 AUTO routing으로 회귀하지 않는다는 다섯 항목이다.
- 구현 진행 원본: issue #61 comment
https://github.com/fourblocks2020/trex-core/issues/61#issuecomment-5337421562는 baseline4975d7166fa70e045096503e85c26d740ae92c55, 한국어 계획, stale PostgreSQL DSN 실패 분류, 수정·검증·독립 QC와 최종 PASS를 기록한다. - 구현 완료 원본: issue #61 comment
https://github.com/fourblocks2020/trex-core/issues/61#issuecomment-5337469578은 구현 내용, 실제 검증 결과, local commits와 외부 단계 경계를 기록한다. trex_core/application/messaging_handlers.py는 buy/sell wire의 누락 또는 explicit null venue를SOR로 정규화하고 invalid venue를 admission 전에 거부한다.trex_core/application/intents.py는 intent venue 기본값과 validation을 소유하고 slot에 original order venue를 전달한다.trex_core/adapters/broker/kis.py는 KRX/NXT/SOR allowlist를 시간과 독립적으로 보존하여EXCG_ID_DVSN_CD로 제출하고, actual execution venue는 검증된ORD_EXG_GB와 explicit exchange-id allowlist에서만 KRX/NXT로 파싱한다.trex_core/application/execution.py는 slot의 original venue를 submit·restart·cancel에 사용하고FillStatus.execution_venue를 ledger actual venue로 전달한다. SOR actual이 확인되지 않으면 추론하지 않고 fail-closed 한다.- migration 023은 persisted AUTO slot/outbox row를 SOR로 전환하고 AUTO 저장을 차단한다. migration 024는 outbox
order_venue와 nullable actualvenue를 분리하고 historical SOR actual을 NULL로 보존하며 NULL-only replay-safe backfill과 constraint를 적용한다. - 구현 기반 revision은
15aeae6930f8c3e6ef9cf659f41278b099a78459,7366cadf03fc6002bfd01ecf0cba7c24486bb618,359ea098ff717e7f04cf4206dcbc64ad17b47755다. issue #61 정합 수정은64e4e32f9d7abf7082588b3c4c9a8c0d272762f6, explicit null regression은43f6fea7ac805f27fba35586af27f0090a672222다. - 구현자 검증은 비-DB focused
107 passed, omitted/null focused8 passed, disposable PostgreSQL 1624 passed, 전체1074 passed, 52 skipped, Ruff·ProofLine validate·diff check PASS다. - 최초 combined focused의
107 passed, 1 failed, 5 errors는 종료된 이전 QC PostgreSQL DSN의 connection refused였으며 새 disposable PostgreSQL 16 semantic suite24 passed로 재검증되었다. - 최종 독립 read-only 재QC는 omitted/null SOR normalization, broker request와 ack 이후 slot routing provenance를 확인하고 blocker 0, major 0, minor 0으로 PASS했다. HEAD
43f6fea7ac805f27fba35586af27f0090a672222, worktree clean이었다. - 현재 active AC-0018은 SOR default, explicit venue preservation, AUTO removal과 no wall-clock routing을 이미 소유하고, active AC-0019는 original order venue와 actual execution venue의 durable split·migration contract를 이미 소유한다.
Scope
- AC admission은 중복 criterion을 새로 만들지 않고 기존 active AC의 의미를 변경하지 않는
satisfy다.satisfy: AC-0018에 issue #61의 venue 누락/null→SOR, explicit KRX/NXT/SOR 보존, AUTO 제거·migration과 no wall-clock routing 구현 evidence를 결속한다.satisfy: AC-0019에 issue #61의 ack·cancel·fill polling·restart·ledger/outbox order/execution venue 분리와 fail-closed actual venue 구현 evidence를 결속한다.
- buy/sell intent의 venue 누락과 explicit null은 SOR로 정규화하고 KIS request에
EXCG_ID_DVSN_CD="SOR"를 명시한다. - caller가 explicit KRX/NXT/SOR를 제공하면 admission, slot, broker request, acknowledgement, restart와 cancel에서 변경 없이 보존한다.
- AUTO는 AMQP intent, domain admission, runtime routing, broker adapter input과 persistence에서 허용·생성·저장하지 않는다. 기존 persisted AUTO는 SOR로 idempotent하게 변환한다.
- core는 wall-clock time으로 KRX/NXT를 선택하거나 SOR를 변환하지 않는다.
- original
order_venue는 KRX/NXT/SOR이며 submit·ack·slot·restart·cancel에 사용한다. actualexecution_venue는 broker-authoritative KRX/NXT 또는 미확정 NULL이며 fill·ledger/outbox에 별도로 기록한다. - SOR actual venue는 검증된 KIS code에서만 KRX/NXT로 확정한다. 누락·SOR 단독·미지원 값과 시간으로 actual venue를 추론하지 않는다.
- historical SOR actual은 order SOR와 actual NULL로 보존한다. migration replay는 정상
(order=KRX, actual=NXT)같은 신규 조합을 오염시키지 않고 DB는 AUTO·invalid order와 actual SOR를 거부한다. - repository current contract 문서와 KIS adapter 주석을 SOR normalization에 맞추고 omitted와 explicit null을 독립 regression으로 검증한다.
Out of Scope
- TVR의 session·portfolio
markets전략 판단 또는 KRX/NXT session policy 변경 - SOR 주문을 실제 운영 KIS 계좌로 제출하거나 취소하는 작업
- live credential·account·database·RabbitMQ·portfolio-hub 연결
- push, PR, 원격 main 반영, image publication, production migration, deployment, release, issue closure 또는 실주문
- ProofLine delivery/release lifecycle closure의 소급 주장
Risks and Unknowns
Risks
- 실제 KIS 운영 응답의 actual exchange field 변형은 fixture 기반 parser 검증 범위를 벗어날 수 있다. 미지원 값은 추론하지 않고 NULL/fail-closed로 유지하며 운영 검증은 별도 승인 환경에서 수행한다.
- migration runner는 history table 없이 SQL을 재실행하므로 AUTO→SOR 및 order/execution split migration의 semantic replay-safe 불변식을 향후 변경에서도 유지해야 한다.
- cancel adapter의 내부 backward-compatible default와 intent의 public SOR default는 서로 다른 경계다. execution path는 항상 stored original venue를 명시적으로 전달해야 하며 문서가 이를 혼동하지 않아야 한다.
Approval State
- Discovery status:
confirmed - 승인 근거: 요청자 genichin이 승인 상태인 issue #61 본문을 최대한 포함하여 템플릿 기반 Discovery와 REQ·AC를 승인된 상태로 사후 정리하라고 명시했다.
- Open Questions: 없음
- 이 확인은 current specification과 implementation evidence의 사후 정리다. push, PR, deployment, release, production migration, issue closure 또는 실주문 승인을 의미하지 않는다.