Files
trex-core/docs/discovery/dcy-016_20260608_operator-cli-rpc-commands.md
T
genichinandClaude Opus 4.8 d09b93195f feat(cli): dcy-016 운영자 CLI 확장 (universe/slots/enter/exit) + 워치독 억제 (BAT-020)
운영자가 조회·매수·매도를 CLI 로 수행하되 데몬 RabbitMQ RPC 로 통일해 단일
writer admission·불변식을 보존(DB 직접 쓰기 없음)하고, 운영자 조회가 전략
생존 신호로 오인되지 않게 워치독을 억제한다.

거버넌스: 전부 change-req (신규 REQ 없음, dcy-016 OQ-3).
- REQ-032: CLI universe/slots(snapshot RPC) + enter(buy)/exit(sell) intent RPC
  + 인스턴스 라우팅(--config/--instance/default) + enter/exit 안전장치
  (확인 프롬프트 기본 ON / --yes(paper) / --yes --live(이중 ack) / --dry-run)
  + 전 명령 --json. pause/resume 는 direct-DB 유지
- REQ-022: CLI request-reply RPC 클라이언트(call_rpc) 재사용
- REQ-021/034: snapshot 요청 워치독 억제 플래그(touch_watchdog/actor=operator)
  → 핸들러가 last_seen_at 갱신 스킵. 기본값 현행 유지(하위호환). 운영자
  조회가 죽은 전략의 safety-sell 을 무력화하던 결함(R-4) 제거
- REQ-026: interface-contract/runtime-flows 정합

CLI 는 rpc/confirm 주입 가능(테스트 broker/DB-free). snapshot envelope 은
asset-centric 이라 exit 은 운영자 제공 slot_id 사용(slot_id 노출은 본 주기 밖).

검증: 단위 327 passed/34 skipped, 인프라 게이트(PG+RabbitMQ) 361 passed, ruff clean.
신규 test_cli_operator(14) + snapshot 워치독 억제(2). BAT-020 release-candidate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 16:48:26 +09:00

27 KiB

0. 문서 상태

이 문서의 현재 상태와 식별 정보를 기록한다. 문서 추적과 승인 흐름에 필요한 최소 메타데이터를 적는다.

  • 상태: confirmed
  • 문서 ID: dcy-016_20260608_operator-cli-rpc-commands
  • 이슈명: 운영자 CLI 명령 확장 — universe/슬롯 확인 + enter/exit + pause/resume (데몬 RPC 통일)
  • 작성 시각(KST): 2026-06-08 15:49 KST
  • 마지막 갱신 시각(KST): 2026-06-08 19:00 KST
  • 대체됨: 없음
  • 후속 Discovery 참조: 없음
  • 생성된 REQ 참조: REQ-032/022/021/034/026 (전부 change-req, 신규 REQ 없음 — OQ-3). REQ-021=CHG-20260608-02, 그 외=CHG-20260608-01. pause/resume 는 direct-DB 유지. delivery: BAT-020

1. 계획 상태 요약

현재 Discovery가 어떤 배경에서 작성되고 있는지, 연계 문서가 있는지, 지금 시점의 해석이 무엇인지 짧게 요약한다.

  • 연계 문서 현황:
    • 관련 점수 파일: 미생성
    • 관련 TODO/메모: 사용자 요청(운영자 CLI 명령 추가)
  • 해석:
    • 현재 trex-core CLI 는 pause/resume/paused 만 제공하고 PostgreSQL PauseStore 에 직접 접근한다. 운영자가 universe 확인·슬롯 상태 확인·매수(enter)·매도(exit) 를 CLI 로 수행할 표면이 없어, 운영 편의와 일관성을 위해 CLI 명령을 확장한다.
    • 이번 Discovery에서는 universe/슬롯 읽기·enter/exit·pause/resume 를 데몬의 기존 RabbitMQ RPC 표면(trex.snapshot.req/trex.intent.req/trex.control.req)으로 통일해 단일 writer admission 을 보존하고, enter/exit 에 운영 안전장치를 넣는 범위를 판정한다. 서버 표면은 대체로 존재하나 운영자 조회의 워치독 부수효과(REQ-034)를 막는 서버측 억제 모드가 동반된다. 거버넌스는 OQ-3 결정에 따라 기존 REQ(REQ-032/022/021/034/026) change-req 로 처리하고 신규 REQ 는 원칙적으로 생성하지 않는다.

2. 요구사항 판정 결과

이번 요청이 기존 요구사항과 비교해 신규인지, 유사한지, 중복인지 판단하고 그 근거를 남긴다.

  • 판정: 신규
  • 근거
    • 기존 Discovery(dcy-001~dcy-015) 중 운영자 CLI 의 universe/슬롯/enter/exit 명령을 다룬 문서는 없다. dcy-002(데몬+HTTP API), dcy-006(전략 transport), dcy-008(kill-switch) 등이 RPC 표면을 도입했으나 CLI 클라이언트 확장을 정의하지 않았다(REQ-032 의 CLI 는 pause/resume 만).
    • 변경이 CLI 진입점(REQ-032)과 messaging transport(REQ-022) 사용을 확장하고 운영자에게 매수/매도 실행 표면을 추가하므로, 기존 Discovery 미세 조정이 아니라 독립 주기로 추적하는 것이 명확하다.

3. 문제점의 요약

문제의 현재 상태, 기대 상태, 관련 이해관계자, 제약사항을 정리한다. Discovery의 핵심 맥락을 가장 먼저 이해할 수 있어야 한다.

  • 현재 상태
    • trex_core/runtime/cli.py(전체 47줄)는 pause/resume/paused 3개 서브커맨드만 제공하고, PostgreSQLPauseStore(cli.py:32~42)에 직접 접근한다. universe/슬롯/매수/매도 명령은 없다.
    • 데몬 RPC 표면은 이미 존재한다 — trex_core/adapters/messaging/topology.py 에 SNAPSHOT_REQ_QUEUE="trex.snapshot.req"(read-only), INTENT_REQ_QUEUE="trex.intent.req"(admission), CONTROL_REQ_QUEUE="trex.control.req"(pause/resume/kill_switch) 가 정의돼 있고, 모두 request-reply(reply_to=amq.rabbitmq.reply-to)다.
    • 인스턴스 라우팅도 존재한다 — _instance_queue(base, instance_key)(topology.py:28~)는 named instance 면 {base}.{instance_key}, default 면 literal base 를 쓴다(dcy-009 다중 인스턴스).
    • 주의(워치독 부수효과): make_snapshot_rpc_handler(messaging_handlers.py:196~200)는 read-only 응답 산출에 더해 응답에 포함된 모든 holding 슬롯의 워치독 last_seen_at 을 갱신한다(REQ-034). 이는 "전략 모듈 폴링 = 생존 신호"로, 폴링이 끊긴(워치독 만기) 슬롯만 safety-sell 트리거 대상이 되게 한다. 현재 이 갱신은 actor/플래그 구분 없이 모든 snapshot 요청에 적용된다.
    • buy/sell 계약은 최근 Discovery 로 정리됐다 — buy 는 portfolio_id 필수 + symbol 서버 resolve(dcy-011, 구현 완료), sell 은 slot_id 대상 + optional 가격(없으면 시장가)(dcy-012, confirmed).
    • baseline 문서(docs/project-structure.md, docs/runtime-flows.md, docs/interface-contract.md)는 존재하며 최신이다. CLI/운영 흐름은 runtime flow·interface-contract 에 속한다.
  • 기대 상태
    • 운영자가 CLI 로 universe(snapshot RPC)·슬롯 상태(snapshot RPC)·enter(buy intent RPC)·exit(sell intent RPC)·pause/resume 를 수행한다.
    • 모든 명령이 데몬 RPC 를 거쳐 단일 writer admission·불변식을 보존한다(특히 enter/exit 은 DB 직접 쓰기 금지).
    • enter/exit 실행 전 확인 프롬프트·live 가드 등 안전장치가 동작해 오발주를 방지한다.
    • 다중 인스턴스 환경에서 CLI 가 대상 인스턴스 큐로 정확히 라우팅한다.
  • 이해관계자
    • 문서 작성자(AI agent) — Discovery/REQ/Batch 산출물 작성
    • 리뷰어/승인자 — CLI 표면·안전장치·트랜스포트 승인
    • 운영 담당자 — CLI 로 일상 운영(조회·매매·일시정지) 수행
    • 전략 모듈 개발자 — 동일 RPC 표면을 공유하므로 계약 일관성 관심
  • 제약사항
    • enter/exit(매수/매도)는 단일 writer 인 데몬 admission(슬롯 할당·portfolio_id 검증·상태 전이)을 반드시 거쳐야 하며 DB 직접 쓰기로 우회할 수 없다.
    • RPC 통일은 데몬·RabbitMQ 가 가동 중일 때만 동작한다(오프라인 조회 불가는 의도된 트레이드오프).
    • 다중 인스턴스(dcy-009)에서 CLI 는 대상 인스턴스를 지정해야 큐 라우팅이 맞는다.

주요 사용자 시나리오

사용자 또는 운영자가 실제로 어떤 상황에서 이 변경을 필요로 하는지 대표 시나리오를 적는다.

  • 운영자가 trex-core universe 로 당일 거래 대상 자산(portfolio_id/symbol)을 확인한다(snapshot RPC).
  • 운영자가 trex-core slots --status holding 으로 현재 슬롯 상태를 조회한다(snapshot RPC).
  • 운영자가 trex-core enter <portfolio_id> --capital N 으로 매수를 넣되, 확인 프롬프트(또는 --yes)와 live 가드를 거쳐 안전하게 admission 한다.
  • 운영자가 trex-core exit <slot_id> [--price P] 로 매도를 넣는다(가격 없으면 시장가, dcy-012).
  • 운영자가 trex-core pause/resume <portfolio_id> 로 portfolio 를 일시정지/해제한다.

4. 이번에 정의할 변경

이번 Discovery에서 다루는 핵심 변경 항목을 목록으로 적는다. 기능, 구조, 규칙 변경을 함께 포함해도 된다.

  • trex-core CLI 에 universe/slots/enter/exit 서브커맨드를 추가하고, 모두 데몬 RabbitMQ RPC(trex.snapshot.req/trex.intent.req)로 request-reply 한다(읽기도 RPC 통일 — 결정됨).
  • enter/exit 에 운영 안전장치를 추가한다(OQ-2 A안) — 확인 프롬프트 기본 ON + --yes(paper) / --yes --live(live 이중 ack) + --dry-run 미리보기.
  • 운영자 조회(universe/slots)가 워치독 생존 신호로 작동하지 않도록 snapshot RPC 에 워치독 억제 플래그(touch_watchdog=false/actor="operator", OQ-4)를 추가한다(REQ-034 서버 부수효과 대응; 기본값=현행 유지로 하위호환).
  • 전 명령에 --json 출력 모드를 추가한다(기계용 비대화형 — enter/exit 는 --yes/--yes --live 필수).
  • CLI 에 인스턴스 라우팅 옵션을 추가해 다중 인스턴스 큐로 정확히 라우팅한다(OQ-1: --config canonical + --instance 단축, 미지정 시 default, 대상 인스턴스 항상 표시).
  • pause/resume 는 기존 동작을 유지하되, 전 명령 RPC 통일 관점에서 trex.control.req 정합 여부를 정한다(범위 경계 참조).
  • docs/interface-contract.md·docs/runtime-flows.md 에 CLI 명령·RPC 매핑·안전장치 흐름을 반영한다.

영향 범위

변경이 미칠 코드/문서/운영 범위를 명시해 REQ 정제와 batch planning에서 추정 누락을 줄인다.

  • 코드 영향:
    • trex_core/runtime/cli.py — universe/slots/enter/exit 서브커맨드 + 인스턴스 옵션 + enter/exit 가드 + RPC 클라이언트 호출
    • trex_core/adapters/messaging/(rabbitmq.py/messaging.py) — CLI 용 request-reply RPC 클라이언트 재사용/노출(전략 모듈이 쓰는 동일 클라이언트)
    • trex_core/application/messaging_handlers.py — make_snapshot_rpc_handler(196~200)에 워치독 억제 모드 추가(운영자 조회 시 last_seen_at 미갱신, REQ-034/021) — R-4 대응, 서버측 변경
    • trex_core/runtime/config.py — CLI 가 RabbitMQ 접속·인스턴스 키를 읽도록 설정 활용(기존 env/TOML 재사용)
  • 문서 영향:
    • docs/interface-contract.md — CLI 명령 ↔ RPC payload 매핑(buy=portfolio_id 필수, sell=slot_id+optional price) 반영
    • docs/runtime-flows.md — 운영자 CLI → RPC → admission 흐름·안전장치 반영
  • 운영 영향:
    • 운영자가 CLI 로 조회·매매·일시정지 수행 → 운영 편의 향상
    • enter/exit 실주문 표면 추가 → 안전장치·권한·paper/live 운영 정책 필요

5. 요구사항 목록

실제로 구현과 검증으로 이어질 요구사항을 기능/비기능으로 나누어 정리하고, 범위 경계를 명확히 적는다.

기능 요구사항

  • FR-1: trex-core universe 는 trex.snapshot.req RPC 로 당일 universe(자산 목록: portfolio_id/symbol 등)를 조회·출력한다.
  • FR-2: trex-core slots [--status ...] 는 snapshot RPC 응답의 슬롯 상태(상태/심볼/수량/가격 등)를 조회·출력한다(view=held/holding 필터 포함).
  • FR-2a: 운영자 CLI 조회(universe/slots)는 워치독 생존 신호로 작동하지 않아야 한다 — snapshot RPC 요청에 워치독 억제 플래그(touch_watchdog=false/actor="operator", OQ-4)를 실어, 서버 핸들러가 응답 holding 슬롯의 last_seen_at 갱신(REQ-034)을 건너뛴다. 기본값(플래그 미지정)은 현행 전략 폴링 갱신 유지(하위호환). CLI 조회는 항상 억제 플래그를 보낸다.
  • FR-3: trex-core enter <portfolio_id> [--capital/--qty ...] 는 trex.intent.req buy 인텐트를 RPC 로 제출한다(symbol 은 서버 resolve, dcy-011). DB 직접 쓰기는 하지 않는다.
  • FR-4: trex-core exit <slot_id> [--price P] 는 trex.intent.req sell 인텐트를 RPC 로 제출한다(가격 미지정 시 시장가, dcy-012). DB 직접 쓰기는 하지 않는다.
  • FR-5: enter/exit 안전장치(OQ-2 A안) — 확인 프롬프트 기본 ON(대상 인스턴스·paper/live·portfolio_id/slot_id·qty/capital·가격 요약, 기본 No), --yes 로 생략(paper), live 는 --yes --live 이중 ack, --dry-run 으로 미제출 미리보기. paper/live 는 데몬 동일 env/--config 로 판별·표시한다.
  • FR-6: 모든 RPC 명령은 대상 인스턴스 큐로 라우팅한다 — --config <toml>(canonical, REQ-048) 또는 --instance <key>(단축, override), 미지정 시 default(OQ-1). 대상 인스턴스를 명령 출력에 항상 표시하고, RPC 응답(admitted/rejected/reason)을 운영자에게 표시한다.
  • FR-7: 전 명령에 --json 출력 모드를 제공한다 — 사람용 표 대신 RPC 응답을 JSON 으로 출력(스크립트/jq 용). --json 은 기계용 비대화형 모드이므로 확인 프롬프트와 양립하지 않는다: enter/exit 에 --json 을 쓰면 --yes(live 는 --yes --live)가 필수이며, 미지정 시 프롬프트 대신 에러로 거부한다(자동 제출 금지).
  • FR-8: docs/interface-contract.md·docs/runtime-flows.md 에 CLI 명령·RPC 매핑·안전장치·출력 모드를 반영한다.

비기능 요구사항

성능, 운영성, 일관성, 자동화 안정성 등 기능 외 요구사항을 적는다.

  • NFR-1: 단일 writer 보존 — enter/exit 는 데몬 admission 을 거쳐 슬롯 할당·portfolio_id 검증·상태 전이 불변식이 깨지지 않아야 한다.
  • NFR-2: 안전성 — enter/exit 오발주를 막는 확인/가드가 기본 동작이며, live 계좌에서는 더 엄격해야 한다.
  • NFR-3: 일관성 — CLI 와 전략 모듈이 동일 RPC 계약을 사용해, 표면 분기로 인한 동작 차이가 없어야 한다.
  • NFR-4: 운영성 — RPC 실패(데몬 미가동·타임아웃·라우팅 오류)를 명확한 에러로 표시해 운영자가 원인을 알 수 있어야 한다.

범위 경계

이번 반복에서 반드시 포함할 범위와 명시적으로 제외할 범위를 구분한다.

  • In Scope
    • universe/slots/enter/exit CLI 명령(전부 데몬 RPC) + 응답 표시
    • enter/exit 안전장치(확인 프롬프트/--yes/live 가드)
    • 운영자 조회의 워치독 억제 모드(snapshot RPC 서버 변경, REQ-034 — R-4 대응)
    • 인스턴스 라우팅 옵션
    • 전 명령 --json 출력 모드(비대화형 — enter/exit 는 --yes 필수)
    • interface-contract/runtime-flows 문서 갱신
  • Out of Scope
    • 신규 서버측 RPC 표면/도메인 로직(기존 표면 재사용 — 단, 워치독 억제 모드는 snapshot 핸들러의 국소 서버 변경으로 In Scope)
    • buy/sell 계약 자체 변경(dcy-011/dcy-012 에서 처리)
    • kill_switch CLI 노출(별도 결정 — 본 주기는 enter/exit/pause/resume 까지)
    • pause/resume 의 control RPC 통일 — 미채택(기존 direct-DB 유지). PauseStore 가 durable source 라 동작에 문제 없어 변경하지 않는다(OQ-3 결정).

6. 리스크/가정 목록

불확실성과 전제 조건을 분리해서 적는다. 리스크는 영향과 완화 방안을, 가정은 현재 판단의 전제를 기록한다.

리스크

  • R-1 (High): enter/exit 가 실주문을 내는 표면이라, 오발주(잘못된 portfolio_id/slot_id/가격)나 live 오작동 시 금전 손실로 직결된다.
    • 완화 방안: FR-5(OQ-2 A안)의 확인 프롬프트 기본 ON·--yes(paper)·--yes --live 이중 ack·--dry-run 을 기본 동작으로 하고, RPC 응답(rejected/reason)을 명확히 표시한다. admission 의 portfolio_id 검증(dcy-011)·slot 상태 검증이 1차 방어선이다.
  • R-2 (Medium): 다중 인스턴스에서 CLI 가 잘못된 인스턴스 큐로 라우팅하면 의도와 다른 인스턴스에 매매가 들어간다.
    • 완화 방안: (OQ-1) --config(canonical, 데몬과 동일 경로) 우선 + --instance 단축, 미지정 시 default. 모든 명령 출력·enter/exit 확인 프롬프트에 대상 인스턴스를 항상 표시해 오라우팅을 사전 차단한다.
  • R-3 (Low): RPC 통일로 데몬·RabbitMQ 미가동 시 조회조차 불가하다(기존 pause 는 direct-DB 라 가능했음).
    • 완화 방안: 의도된 트레이드오프임을 문서화하고, RPC 실패를 명확한 에러로 표시한다. 필요 시 읽기 전용 direct-DB 폴백은 후속 검토.
  • R-4 (High): 운영자 CLI 조회(universe/slots)가 snapshot RPC 의 워치독 갱신 부수효과(REQ-034)를 일으키면, 전략이 실제로 죽어 있어도 운영자 조회가 생존 신호로 오인되어 safety-sell(워치독 만기 강제청산)이 억제된다 — 안전 기능 무력화.
    • 완화 방안: FR-2a 로 운영자 조회는 워치독 억제 플래그(OQ-4)를 실어 서버가 last_seen_at 갱신을 건너뛴다. 스냅샷 RPC 계약/핸들러(REQ-034/021) 변경이 동반되며, 기본값은 현행(전략 폴링=워치독 갱신) 유지로 하위호환.

가정

아직 확정되지 않았지만 현재 문서 작성의 기반이 되는 전제를 적는다.

  • A-1: 서버측 RPC 표면(trex.snapshot.req/trex.intent.req/trex.control.req)과 request-reply 클라이언트가 이미 구현돼 있어, CLI 는 대부분 thin 확장으로 충분하다. 단, 워치독 억제(R-4/FR-2a)는 클라이언트만으로 불가하며 snapshot 핸들러(REQ-034)의 서버측 변경이 동반된다.
  • A-2: dcy-011 구현 완료로 buy 는 portfolio_id 필수 + symbol 서버 resolve 이므로, enter <portfolio_id> 만으로 매수 제출이 가능하다.
  • A-3: dcy-012 구현이 완료되면 sell 인텐트에 optional 가격 필드가 있어 exit <slot_id> [--price] 가 성립한다(미구현 시 exit 은 시장가 전용으로 한정 가능).
  • A-4: 인스턴스 라우팅 헬퍼(_instance_queue)가 존재하므로 CLI 도 동일 규칙으로 큐를 계산할 수 있다.

오픈 질문

답을 아직 모르는 항목을 적는다. 추정으로 덮지 말고 REQ 초안 작성 이전에 확인할 질문으로 남긴다.

  • OQ-1: 인스턴스 라우팅 지정 방식 — --instance <key> 플래그, --config <toml>(REQ-048) 재사용, env default 중 무엇을 표준으로 하는가? default 인스턴스 처리 규칙은?
    • 상태: Answered (2026-06-08, 사용자 결정 — --config canonical + --instance 단축)
    • 결정: --config <path>.toml(REQ-048) 를 canonical 로 한다(데몬 기동과 동일 경로·instance_key 일치 보장). --instance <key> 는 단축/override(둘 다 주면 --instance 우선). 미지정 시 literal default 인스턴스. RabbitMQ 접속은 env(TREX_RABBITMQ_*) 재사용, 큐 네이밍은 _instance_queue 규칙. 오발주 방지를 위해 모든 명령 출력·enter/exit 확인 프롬프트에 대상 인스턴스를 항상 표시(R-2 완화, OQ-2 가드와 연결).
    • 반영 위치: FR-6, R-2
  • OQ-2: enter/exit 안전장치 구체 정책 — 확인 프롬프트 기본 on + --yes 생략, live 계좌 가드(예: 추가 확인/환경변수)·dry-run 제공 범위는?
    • 상태: Answered (2026-06-08, 사용자 결정 — A안)
    • 결정: (1) 확인 프롬프트 기본 ON — 실행 전 대상 인스턴스·broker(paper/live)·portfolio_id/slot_id·qty/capital·가격(또는 시장가) 요약을 표시하고 y/N(기본 No). (2) --yes 로 프롬프트 생략(paper 자동화). (3) live 는 이중 ack — --yes 만으로 부족하고 --yes --live(명시적 live 승인) 를 요구해 muscle-memory 오발주 차단(데몬 TREX_KIS_ALLOW_LIVE 배포 게이트 위에 액션 레벨 게이트 추가). (4) --dry-run — 해석된 intent + 대상 인스턴스만 출력, 미제출. paper/live 판별은 CLI 가 데몬과 동일 env(TREX_BROKER/TREX_KIS_ALLOW_LIVE)/--config 로 표시.
    • 반영 위치: FR-5, NFR-2, R-1
  • OQ-3: 거버넌스 경로 — CLI 진입점(REQ-032)·messaging transport(REQ-022)·제어 채널(REQ-043)·**스냅샷 워치독 부수효과(REQ-034)/메시지 계약(REQ-021)**의 change-req 로 처리할지, CLI 명령을 신규 REQ 로 추적할지?
    • 상태: Answered (2026-06-08, 사용자 결정 — change-req 우선)
    • 결정: 기존 Implemented REQ 본문 수정(change-req)으로 처리한다. change-req 대상 — REQ-032(런타임 제어 CLI: universe/slots/enter/exit 서브커맨드 + 인스턴스 라우팅 + enter/exit 안전장치), REQ-022(messaging transport: CLI request-reply RPC 클라이언트 배선), REQ-021(메시지 계약: snapshot 요청 payload 에 워치독 억제 플래그 추가), REQ-034(워치독: 핸들러가 억제 플래그 시 last_seen_at 미갱신), REQ-026(messaging baseline 문서 정합: interface-contract/runtime-flows CLI·RPC 매핑·플래그 반영). pause/resume 는 기존 direct-DB 유지(REQ-043 control RPC 통일 미채택). 신규 REQ 는 원칙적으로 생성하지 않으며, CLI 명령군을 독립 추적해야 한다고 판단되면 REQ 정제에서 소형 신규 REQ 가능(조건부).
    • 반영 위치: 1. 거버넌스 해석(추가), R-1·R-4 완화, 8. 확인 체크
  • OQ-4: 운영자 조회의 워치독 억제 메커니즘 — snapshot RPC 요청에 actor="operator"/touch_watchdog=false 플래그를 추가해 서버가 워치독 갱신을 건너뛰는 방식인가, 아니면 워치독 갱신을 요청 strategy_id 의 슬롯에만 적용하도록 REQ-034 동작을 좁히는 방식인가?
    • 상태: Answered (2026-06-08, 사용자 결정 — 플래그 방식)
    • 결정: snapshot RPC 요청에 워치독 억제 플래그(예: touch_watchdog=false 또는 actor="operator")를 추가하고, make_snapshot_rpc_handler 가 그 플래그면 watchdog_store.update(...) 를 건너뛴다. 기본값 = 현행(플래그 미지정 시 전략 폴링이 워치독 갱신) 으로 기존 전략 모듈 무변경(하위호환). 운영자 CLI(universe/slots)는 항상 억제 플래그를 보낸다. strategy_id-scoped 방식은 기존 REQ-034 동작을 바꿔 미채택.
    • 반영 위치: FR-2a, 4. 변경 항목/영향 범위, R-4

오픈 질문 처리 기준

  • Open: 아직 답이 없고 다음 단계 진행에 영향이 있는 상태다. 문서에 유지한다.
  • Answered: 답이 확정된 상태다. 관련 본문/요구사항에 반영한 뒤 오픈 질문 목록에서는 제거하거나 resolved 기록으로 이동한다.
  • Deferred: 지금 단계에서 결정하지 않고 다음 단계 또는 후속 이슈로 넘기는 상태다. 넘길 대상과 이유를 반드시 적는다.
  • Dropped: 더 이상 유효하지 않은 질문이다. 삭제 사유를 짧게 남기고 목록에서 제거한다.

7. 초기 성공 기준

이 변경이 성공했다고 판단할 기준을 측정 가능하게 정의한다. 가능하면 데이터 출처까지 연결한다.

  • S-1: trex-core universe·slots 가 데몬 snapshot RPC 응답을 정확히 조회·출력한다(직접 DB 접근 없이).
  • S-2: trex-core enter·exit 가 trex.intent.req RPC 로 인텐트를 제출하고 admitted/rejected 응답을 표시한다(DB 직접 쓰기 0건).
  • S-3: enter/exit 가 확인 프롬프트/--yes·live 가드를 거치며, 미확인 시 주문이 나가지 않는다.
  • S-4: 지정한 인스턴스 큐로 RPC 가 라우팅되고, 잘못된 인스턴스/데몬 미가동 시 명확한 에러를 표시한다.
  • S-5: --json 출력이 유효한 JSON 이며, --json + enter/exit 에 --yes 미지정 시 자동 제출 없이 에러로 거부된다.

측정 방식 및 데이터 출처

각 성공 기준을 어떻게 측정할지와 어떤 데이터나 문서를 근거로 쓸지 적는다.

  • S-1 측정 방식: stub/in-memory messaging 으로 snapshot RPC 응답 주입 후 CLI 출력 검증 / 데이터 출처: CLI 테스트, snapshot RPC 응답 fixture
  • S-2 측정 방식: intent RPC mock 으로 admitted/rejected 응답 시 CLI 동작·출력 검증, DB 미접근 확인 / 데이터 출처: CLI 테스트, intent RPC 응답, 슬롯 저장소 무변경
  • S-3 측정 방식: 확인 프롬프트/--yes/live 가드 분기 테스트(미확인 시 RPC 미호출) / 데이터 출처: CLI 테스트, RPC 호출 여부
  • S-4 측정 방식: 인스턴스 키별 라우팅 큐 검증 + 데몬 미가동/타임아웃 에러 표시 검증 / 데이터 출처: 라우팅 계산, RPC 타임아웃 케이스
  • S-5 측정 방식: --json 출력 파싱(유효 JSON) + --json enter/exit 의 --yes 미지정 거부 테스트 / 데이터 출처: CLI 테스트, 출력 파서, RPC 호출 여부

8. REQ로 넘기기 전 확인 체크

REQ 초안 작성 단계로 넘기기 전에 무엇이 확정되어야 하는지 확인한다. 미완료 항목은 후속 결정이 필요함을 뜻한다.

  • 범위(In Scope/Out of Scope) 확정
    • 기준: OQ-1 라우팅·OQ-2 안전장치·OQ-3 거버넌스·OQ-4 워치독 억제·pause/resume 정합(기존 유지) 모두 확정됨
  • 성공 지표의 측정 방식/데이터 출처 확정
    • 기준: S-1~S-5 의 테스트/검증 출처가 실제 실행 가능한 형태로 지정됨
  • High 영향 리스크 우선순위 및 해소 책임자 지정
    • 기준: R-1(오발주/실주문)·R-4(워치독 억제)의 change-req 대상(REQ-032/022/021/034/026)이 OQ-3 으로 확정됨. 안전장치는 OQ-2(A안)로 확정. 해소 실무 책임자 배정은 REQ/batch planning 단계로 넘김(비차단).
  • 모든 오픈 질문(OQ) Open 상태 없음 확인
    • 기준: OQ-1~OQ-4 모두 Answered, Open 0개
  • Freeze 확정 담당자(CONFIRMED_BY) 지정
    • 기준: Confirmed By = Justin Ko (사람 승인자 지정 완료)

9. 파일 처리 결과

이 Discovery 문서 생성/갱신 결과와 참조 문서를 기록한다. 이후 추적과 리뷰 시 근거로 사용한다.

  • 처리 결과: 생성
  • 생성 경로: docs/discovery/dcy-016_20260608_operator-cli-rpc-commands.md
  • 참조 문서:
    • 사용자 요청(운영자 CLI 명령 추가: universe/슬롯/enter/exit/pause/resume)
    • trex_core/runtime/cli.py — 기존 CLI(pause/resume/paused, direct-DB)
    • trex_core/adapters/messaging/topology.py — snapshot/intent/control RPC 큐 + 인스턴스 라우팅
    • docs/discovery/dcy-011_..._buy-intent-portfolio-id-required-symbol-resolve.md — buy 계약(portfolio_id 필수, A-2)
    • docs/discovery/dcy-012_..._sell-order-pricing-entry-price-bug.md — sell 계약(slot_id+optional price, A-3)
    • docs/interface-contract.md — RPC payload 계약(intent/snapshot/control)

10. 사용자 결정 필요 항목 요약

사용자나 승인자가 결정해야 하는 항목만 모아 정리한다. 결정, 확인, 데이터 요청을 구분해서 적는다.

DECIDE

  • (없음 — OQ-1/OQ-2/OQ-3/OQ-4 및 pause/resume 정합 확정으로 해소)

결정 완료(2026-06-08): OQ-1 인스턴스 라우팅 = --config(canonical, REQ-048) + --instance(단축 override), 미지정 시 default, 대상 인스턴스 항상 표시 / OQ-2 안전장치 = 확인 프롬프트 기본 ON + --yes(paper) / --yes --live(live 이중 ack) + --dry-run / OQ-3 거버넌스 = REQ-032/022/021/034/026 change-req(신규 REQ 없음) / OQ-4 워치독 억제 = snapshot RPC 플래그 방식(touch_watchdog=false/actor, 기본=현행 유지) / pause-resume = 기존 direct-DB 유지(control RPC 통일 미채택). 결정 항목에서 제외됨.

CONFIRM

  • 없음 — 거버넌스 경로는 OQ-3 으로 확정됨(REQ-032/022/021/034/026 change-req, pause/resume 기존 유지, 신규 REQ 원칙적 없음).

DATA

  • 없음

11. Discovery Freeze

REQ 초안 작성 인계 시점의 확정 플래그와 섹션 참조만 기록한다. 내용 재작성 없이 원본 섹션을 링크로 대신한다.

섹션 참조

Freeze 플래그

  • Handoff Decision: 승인
  • Handoff Rationale: confirm-discovery 완료. 트랜스포트(전부 RPC)·enter/exit 안전장치·--json 모드 반영. 운영자 조회의 워치독 부수효과(R-4) 발견·억제 반영. 오픈 질문 OQ-1~OQ-4 모두 Answered (인스턴스 라우팅=--config+--instance / 안전장치=confirm+--yes/--yes --live+--dry-run / 거버넌스=REQ-032/022/021/034/026 change-req / 워치독 억제=플래그). pause/resume 기존 유지. C 유형 플레이스홀더 0개, 저장소 사실관계 일치. REQ 초안 작성 인계 가능.
  • Ready for REQ Drafting: true
  • Confirmed By: Justin Ko
  • Confirmed At (KST): 2026-06-08 17:00 KST