Skip to content

v2.14.0: 확인하지 않은 것을 보고하던 세 곳을 고친다 - #32

Merged
gejyn14 merged 11 commits into
mainfrom
feature/v2.14.0-truthfulness
Jul 20, 2026
Merged

v2.14.0: 확인하지 않은 것을 보고하던 세 곳을 고친다#32
gejyn14 merged 11 commits into
mainfrom
feature/v2.14.0-truthfulness

Conversation

@gejyn14

@gejyn14 gejyn14 commented Jul 20, 2026

Copy link
Copy Markdown
Owner

공개 배포를 앞두고 한 감사에서 나온 결함들입니다. 전부 한 가지 모양이었습니다:
확인하지 않은 것을 확인했다고 보고한다.

위험한 쪽은 눈에 띄게 틀린 출력이 아니라 그럴듯한 출력이었기 때문에 지금까지
드러나지 않았습니다. 성공 메시지, 그럴듯한 숫자, exit 0.

고친 것

종전 이후
프로필 해석 resolve_profile()이 자기 docstring이 선언한 우선순위를 구현하지 않음 — --profile은 호출자가 넘겨줄 때만 반영 Click 컨텍스트를 읽고, 루트에서 한 번 해석해 공유
미국 거래소 캐시 -p 축을 놓쳐 모의에서 학습한 거래소가 실주문 stex_tp로 나갈 수 있었음 선택한 프로필의 도메인을 따름, 세대를 us_exchanges2-*
config show / auth status KIWOOM_DOMAIN 설정 시 config.toml 값을 출력 — "모의"를 확인하고 실거래 주문 가능 실제 접속 도메인을 보고
auth logout 응답을 읽지 않고 revoked:true 보고 후 로컬 토큰 삭제 → 서버에 살아 있는 토큰을 재폐기 불가 확인 후에만 성공 보고, 실패 시 exit 2 + 토큰 보존
부분 실패 "us": null이 "계좌 없음"인지 "조회 실패"인지 구분 불가 meta.partial_failures가 레그 이름과 오류 코드를 알림

근본 원인은 하나였습니다

이 버그는 세 번째 발견입니다. v2.5 리뷰가 streaming.py/watch.py에서 잡아
호출부별로 고쳤고, v2.13.0이 거래소 캐시에서 잡아 KIWOOM_DOMAIN 축만 고쳤습니다.
두 번의 호출부 수정이 각각 결함 자체는 살려 뒀습니다. 그래서 이번에는
config.resolve_profile() 자체를 고쳤습니다.

v2.13.0의 수정이 미완으로 나간 정확한 이유도 확인했습니다: 기존 테스트가
KIWOOM_DOMAIN 축만 몰았고, config.py의 env 단락이 resolve_profile보다 먼저
반환하므로 detect.py가 profile을 넘기든 안 넘기든 똑같이 통과했습니다.
새 테스트는 Task 1을 되돌려 실제로 버그를 재현하는지 확인했습니다.

검증

15개 컴포넌트를 하나씩 되돌려 잡는 테스트가 있는지 전수 확인했습니다.
첫 실행에서 4건이 테스트 0개로 나왔습니다 — 스위트는 전부 초록이었는데도요.
이번 릴리스가 없애려는 결함과 같은 모양이라 그대로 둘 수 없어 각각 테스트를
추가했고, 재실행 결과 15/15가 최소 1개의 잡는 테스트를 갖습니다.

  • 2018 tests pass, ruff clean
  • 멱등성 원장 파일명이 main과 동일함을 고정 (움직이면 기록된 키가 안 보이게
    되고 send_order가 실주문을 재전송함)
  • 문서 예제는 HOME을 임시 디렉터리로 잡고 keyring을 스텁해 검증 — 실제
    ~/.kiwoom/config.toml과 원장의 md5가 전후 동일

Breaking

  • config show / auth statusdata.domainKIWOOM_DOMAIN 설정 시 다른 값을
    냅니다. 이것이 수정의 요지입니다 — 종전 값이 틀린 값이었습니다.
  • auth logout이 상단 폐기 실패 시 exit 2로 끝나고 로컬 토큰을 지우지 않습니다.
  • KiwoomClient.revoke_token()force 매개변수를 받고 반환 dict에 revoked 추가.
  • 거래소 캐시 파일명 us_exchanges-*.jsonus_exchanges2-*.json (마이그레이션 없음,
    최악의 비용은 usa10098 재조회 1회).
  • config profiles -f json의 각 행에 domain_override 추가.

설계 메모

계획은 --force가 폐기 확인을 건너뛰고 revoked:true를 보고하게 했으나, 그것은
이 릴리스가 없애려는 결함을 --force 경로에 그대로 재도입합니다. 대신 항상
확인하고
, --force일 때는 revoked:false로 남긴 채 로컬 정리만 진행합니다.

config profiles는 다른 표시 명령과 다르게 다룹니다. KIWOOM_DOMAIN이 모든
프로필을 덮으므로 행마다 유효 도메인을 계산하면 전부 같은 값이 되어 설정 정보가
사라집니다. 설정값은 유지하고 domain_override를 따로 알립니다. 이 비대칭은
의도적입니다.

🤖 Generated with Claude Code

gejyn14 and others added 11 commits July 20, 2026 23:00
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Task 1이 이미 값을 맞춰놨으므로 새 테스트는 추가 시점에 통과한다.
그래도 남기는 이유는 "우연히 같음"을 "구조적으로 같음"으로 바꾸는 것이
이 커밋의 목적이기 때문이다. test_client_domain_and_meta_env_cannot_diverge는
보고한 env와 실제 접속 도메인을 직접 맞대어 그 불변식을 고정한다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Task 1을 되돌려 새 테스트가 실제로 버그를 재현하는지 확인했다:
두 파일 모두 us_exchanges-mock.json으로 나와 실패한다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
config show / auth status는 활성 프로필을 서술하므로 유효 도메인을 보여준다.
config profiles는 다르게 다룬다 — KIWOOM_DOMAIN이 모든 프로필을 덮으므로
행마다 유효 도메인을 계산하면 전부 같은 값이 되어 설정 정보가 사라진다.
설정값은 유지하고 domain_override를 추가했다.

BREAKING: config show / auth status의 data.domain이 KIWOOM_DOMAIN 설정 시
값이 달라진다. config profiles에 domain_override 키가 추가된다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
계획은 --force가 확인을 건너뛰고 revoked:true를 보고하게 했으나, 그것은
이 릴리스가 없애려는 결함(확인하지 않은 것을 성공이라 보고)을 그대로
재도입한다. 대신 항상 확인하고, --force일 때는 revoked:false로 남긴 채
로컬 정리만 진행한다.

BREAKING: 상단 폐기 실패 시 exit 2로 끝나고 로컬 토큰을 지우지 않는다.
revoke_token(force=False) 시그니처와 반환 dict의 revoked 키가 추가됐다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
dashboard는 문서화된 3상태를 유지한다 — 키 없음=시도 안 함(토큰 없음),
null=시도했고 실패. partial_failures에는 후자만 들어간다.

_run_unified은 손대지 않았다: json 모드에서는 _unified_structured가 먼저
처리하고 return하므로 그 경로는 table/csv 전용이고, meta 키가 갈 곳이 없다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
문서 예제는 HOME을 임시 디렉터리로 잡고 keyring을 스텁해 검증했다.
실제 ~/.kiwoom/config.toml과 멱등성 원장의 md5는 전후 동일하다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
전수 반증(15개 컴포넌트를 하나씩 되돌려 잡히는지 확인)에서 4건이 테스트
0개로 나왔다 — 스위트는 전부 초록이었다. 이번 릴리스가 없애려는 결함과
같은 모양이라(검증하지 않은 것을 검증했다고 여김) 그대로 둘 수 없었다.

- 루트 stash + build_meta 읽기: config set domain prod가 파일을 바꾼 뒤
  내는 envelope의 meta.env가 '이번 실행이 돈 환경'인지 고정
- KiwoomClient의 resolved_profile 읽기: KIWOOM_PROFILE만 있고 -p가 없을 때
  원시 플래그(None)를 읽으면 self.profile이 meta.profile과 갈린다
- config show 표 모드: json만 고치면 정작 눈으로 보는 사용자가 계속
  틀린 도메인을 본다
- logout --force: revoked를 하드코딩 True로 되돌려도 아무도 안 잡았다

재실행 결과 15/15 컴포넌트가 최소 1개의 잡는 테스트를 갖는다.
.gitignore의 .understand-anything/ 항목도 함께 넣는다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gejyn14
gejyn14 merged commit 19cd69e into main Jul 20, 2026
7 checks passed
@gejyn14
gejyn14 deleted the feature/v2.14.0-truthfulness branch July 20, 2026 14:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant