{
 "environment": {
  "base_url": "http://127.0.0.1:8891",
  "db": "weltiq_blog_trial",
  "pg_port": "55531",
  "commit_sha": "f9e58918454f94c52d0d8893ede77c92f3e0d5cb",
  "started_at": "2026-09-27T13:22:31.372891+00:00",
  "note": "격리 임시 PostgreSQL · 합성 호가 · 운영 배포 아님 · 실계좌 아님",
  "finished_at": "2026-09-27T13:23:33.689022+00:00"
 },
 "setup": {
  "user_id": "u_90e97e1f00826fd7",
  "email": "blog-trial@example.invalid",
  "plan": "pro",
  "api_key_id": "wqk_bb2c3e40a371",
  "api_key_scopes": [
   "read-data",
   "run-forward-tests"
  ],
  "listings_inserted": [
   {
    "instrument_id": "BTCUSDT",
    "asset_class": "crypto",
    "price_venue": "binance-spot",
    "alt_venues": [
     "binance-usdm"
    ],
    "tradable": true
   },
   {
    "instrument_id": "AAPL",
    "asset_class": "us_stock",
    "price_venue": "us-equity",
    "alt_venues": [],
    "tradable": true
   }
  ],
  "account_seed": {
   "account_id": "acc_u_90e97e1f00826fd7",
   "book": "cash",
   "amount": "100000",
   "ccy": "USDT"
  },
  "synthetic_quotes": {
   "binance-spot:BTCUSDT": [
    "50000",
    "50001"
   ],
   "binance-usdm:BTCUSDT": [
    "50000",
    "50001"
   ],
   "us-equity:AAPL": [
    "230.00",
    "230.02"
   ]
  },
  "profiles": {
   "binance-spot": [
    "binance-spot",
    1
   ],
   "binance-usdm": [
    "binance-usdm",
    1
   ],
   "us-equity": [
    "us-equity",
    4
   ]
  },
  "env_forward_test_monthly_limit": "(unset)"
 },
 "cases": [
  {
   "id": "T0",
   "what": "시작 직전 usage + 계좌 원장 스냅샷",
   "request": {
    "method": "GET",
    "path": "/v1/forward-tests/usage",
    "body": null
   },
   "response": {
    "status": 200,
    "json": {
     "limit": 1000,
     "used": 0,
     "remaining": 1000,
     "entries_enabled": true,
     "period_start": "2026-09-01T00:00:00+00:00",
     "reset_at": "2026-10-01T00:00:00+00:00",
     "plan": "pro",
     "can_enter": true,
     "counts": "승인된 신규 진입 1건 = 1회 (청산·부분체결·재시도·조회는 0회)",
     "period": "UTC 달력월 · 이월 없음 · 자동 초과 과금 없음"
    }
   },
   "at": "2026-09-27T13:22:31.436457+00:00",
   "expected_status": 200,
   "status_matches_expectation": true,
   "account_snapshot": {
    "account.accounts": [
     {
      "account_id": "acc_u_90e97e1f00826fd7",
      "user_id": "u_90e97e1f00826fd7",
      "portfolio_id": "pf_u_90e97e1f00826fd7",
      "venue": "binance-spot",
      "mode": "paper",
      "base_ccy": "USDT",
      "allocation": 0,
      "broker": null,
      "markets": [],
      "external_account": {},
      "credential_ref": null,
      "created_at": "2026-09-27T22:22:30.889618+09:00"
     }
    ],
    "account.portfolios": [
     {
      "portfolio_id": "pf_u_90e97e1f00826fd7",
      "user_id": "u_90e97e1f00826fd7",
      "name": "default",
      "capital_allocation": 0,
      "risk_budget": {},
      "membership_version": 0,
      "created_at": "2026-09-27T22:22:30.889618+09:00"
     }
    ],
    "account.sleeves": [],
    "account.ledger": [
     {
      "entry_id": 1,
      "txn_id": "blog-a2-02-seed",
      "sleeve_id": null,
      "account_id": "acc_u_90e97e1f00826fd7",
      "book": "cash",
      "amount": 100000,
      "ccy": "USDT",
      "ref_kind": "blog_evidence_fixture",
      "ref_id": null,
      "created_at": "2026-09-27T22:22:30.892197+09:00"
     }
    ],
    "account.direction_leases": [],
    "account.reduce_reservations": [],
    "trading.intents": [],
    "trading.fills": [],
    "trading.order_transitions": []
   },
   "usage_ledger": {
    "forward.usage": [],
    "forward.usage_events": []
   }
  },
  {
   "id": "T1",
   "what": "binance-spot BTCUSDT long · close_after_seconds=60 + TP/SL",
   "request": {
    "method": "POST",
    "path": "/v1/trial-buys",
    "body": {
     "venue": "binance-spot",
     "symbol": "BTCUSDT",
     "client_order_id": "blog-a2-02-t1",
     "side": "long",
     "exit_plan": {
      "close_after_seconds": 60,
      "take_profit": "51000",
      "stop_loss": "49000"
     },
     "max_duration_hours": 24,
     "memo": "기사용 실측: 현물 롱 60초 자동 완결",
     "client_tracking_id": "blog-a2-02",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "external_run_id": "blog-a2-02-run-1",
      "tool": "29B-review.py"
     }
    }
   },
   "response": {
    "status": 201,
    "json": {
     "order_id": "fto_d596594eb466f49167c7c19f0ea5",
     "test_id": "ft_9a32a6e251c39d816a1f015d",
     "variant_id": "trial",
     "round_id": "ft_9a32a6e251c39d816a1f015d:trial:1",
     "action": "enter",
     "state": "accepted",
     "order_type": "market",
     "limit_px": null,
     "qty": "0.00013",
     "filled_qty": "0",
     "reject_code": null,
     "client_order_id": "blog-a2-02-t1",
     "client_tracking_id": "blog-a2-02",
     "memo": "기사용 실측: 현물 롱 60초 자동 완결",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "tool": "29B-review.py",
      "external_run_id": "blog-a2-02-run-1"
     },
     "origin": {
      "kind": "api_key",
      "user_id": "u_90e97e1f00826fd7",
      "client_id": "wqk_bb2c3e40a371",
      "api_key_id": "wqk_bb2c3e40a371",
      "received_at": "2026-09-27T13:22:31.442110+00:00",
      "container_id": null,
      "slot_version": null,
      "deployment_id": null,
      "schema_version": 1,
      "execution_purpose": "forward_test"
     },
     "counted": true,
     "accepted_at": "2026-09-27T22:22:31.444496+09:00",
     "placed_at": null,
     "terminal_at": null,
     "execution_purpose": "forward_test",
     "affects_account": false,
     "round_no": 1,
     "side": "long",
     "exit_plan": {
      "close_at": null,
      "close_after_seconds": 60,
      "take_profit": "51000",
      "stop_loss": "49000"
     },
     "auto_close": {
      "managed": true,
      "state": "waiting_entry",
      "close_at": null,
      "stop_loss": "49000",
      "take_profit": "51000",
      "close_after_seconds": 60,
      "relative_from": null,
      "relative_close_at": null,
      "relative_clock_started": false,
      "max_duration_until": "2026-09-28T22:22:31.442830+09:00",
      "effective_close_at": "2026-09-28T22:22:31.442830+09:00",
      "effective_close_basis": "max_duration",
      "trigger": null,
      "triggered_at": null,
      "trigger_px": null,
      "attempts": 0,
      "retry_at": null,
      "blocked": false,
      "blocked_reason": null,
      "waiting_on": null,
      "exit_block": null,
      "recovery": null,
      "round_status": "entering",
      "note": "등록된 조건 중 **먼저 도달하는 것**에 닿으면 서버가 청산합니다 — 별도 청산 호출이 필요하지 않습니다. 조건 만족 시각은 체결 시각이 아니며, 체결은 그 뒤 처음 공개된 시세에서 일어납니다. 상대 시간은 첫 진입 체결의 공개 시각부터 세고 부분 추가 체결·재시작으로 연장되지 않습니다."
     },
     "usage": {
      "limit": 1000,
      "used": 1,
      "remaining": 999,
      "entries_enabled": true,
      "period_start": "2026-09-01T00:00:00+00:00",
      "reset_at": "2026-10-01T00:00:00+00:00",
      "counted": 1
     },
     "venue": "binance-spot",
     "symbol": "BTCUSDT",
     "qty_basis": {
      "lot": "0.00001",
      "rule": "smallest_lot_multiple_meeting_min_notional_within_price_headroom",
      "venue": "binance-spot",
      "source": "symbol_metadata",
      "min_notional": "5",
      "reference_px": "50000.5",
      "price_headroom_pct": "20",
      "contract_multiplier": "1"
     },
     "trial": true,
     "execution_model": {
      "profile_id": "binance-spot",
      "version": 1
     },
     "expires_at": "2026-09-28T22:22:31.442830+09:00",
     "max_duration_hours": 24,
     "data_mode": "realtime",
     "delay_s": 0,
     "paper_only": true,
     "disclaimer": "시험 원장 전용 — 모의·실거래 계좌의 현금·보유량·손익·성과에 합산되지 않습니다."
    }
   },
   "at": "2026-09-27T13:22:31.446548+00:00",
   "expected_status": 201,
   "status_matches_expectation": true
  },
  {
   "id": "T2",
   "what": "binance-spot + side=short → unsupported_direction",
   "request": {
    "method": "POST",
    "path": "/v1/trial-buys",
    "body": {
     "venue": "binance-spot",
     "symbol": "BTCUSDT",
     "client_order_id": "blog-a2-02-t2",
     "side": "short",
     "exit_plan": {
      "close_after_seconds": 60,
      "take_profit": "49000",
      "stop_loss": "51000"
     },
     "max_duration_hours": 24,
     "memo": "기사용 실측: 현물 숏 거절 원문",
     "client_tracking_id": "blog-a2-02",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "external_run_id": "blog-a2-02-run-1",
      "tool": "29B-review.py"
     }
    }
   },
   "response": {
    "status": 422,
    "json": {
     "detail": {
      "code": "unsupported_direction",
      "detail": "binance-spot does not support short entries",
      "venue": "binance-spot",
      "short_venues": [
       "binance-usdm",
       "bybit-linear",
       "cme",
       "us-equity"
      ]
     }
    }
   },
   "at": "2026-09-27T13:22:31.452165+00:00",
   "expected_status": 422,
   "status_matches_expectation": true
  },
  {
   "id": "T3",
   "what": "binance-usdm BTCUSDT short · TP 49000 < SL 51000 · close_after 60",
   "request": {
    "method": "POST",
    "path": "/v1/trial-buys",
    "body": {
     "venue": "binance-usdm",
     "symbol": "BTCUSDT",
     "client_order_id": "blog-a2-02-t3",
     "side": "short",
     "exit_plan": {
      "close_after_seconds": 60,
      "take_profit": "49000",
      "stop_loss": "51000"
     },
     "max_duration_hours": 24,
     "memo": "기사용 실측: 선물 숏 목표가 발동",
     "client_tracking_id": "blog-a2-02",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "external_run_id": "blog-a2-02-run-1",
      "tool": "29B-review.py"
     }
    }
   },
   "response": {
    "status": 201,
    "json": {
     "order_id": "fto_3e5910823bc53afa076e12172945",
     "test_id": "ft_4954b1fd1bb1b5dc7ad0d1ba",
     "variant_id": "trial",
     "round_id": "ft_4954b1fd1bb1b5dc7ad0d1ba:trial:1",
     "action": "enter",
     "state": "accepted",
     "order_type": "market",
     "limit_px": null,
     "qty": "0.002",
     "filled_qty": "0",
     "reject_code": null,
     "client_order_id": "blog-a2-02-t3",
     "client_tracking_id": "blog-a2-02",
     "memo": "기사용 실측: 선물 숏 목표가 발동",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "tool": "29B-review.py",
      "external_run_id": "blog-a2-02-run-1"
     },
     "origin": {
      "kind": "api_key",
      "user_id": "u_90e97e1f00826fd7",
      "client_id": "wqk_bb2c3e40a371",
      "api_key_id": "wqk_bb2c3e40a371",
      "received_at": "2026-09-27T13:22:31.453698+00:00",
      "container_id": null,
      "slot_version": null,
      "deployment_id": null,
      "schema_version": 1,
      "execution_purpose": "forward_test"
     },
     "counted": true,
     "accepted_at": "2026-09-27T22:22:31.454755+09:00",
     "placed_at": null,
     "terminal_at": null,
     "execution_purpose": "forward_test",
     "affects_account": false,
     "round_no": 1,
     "side": "short",
     "exit_plan": {
      "close_at": null,
      "close_after_seconds": 60,
      "take_profit": "49000",
      "stop_loss": "51000"
     },
     "auto_close": {
      "managed": true,
      "state": "waiting_entry",
      "close_at": null,
      "stop_loss": "51000",
      "take_profit": "49000",
      "close_after_seconds": 60,
      "relative_from": null,
      "relative_close_at": null,
      "relative_clock_started": false,
      "max_duration_until": "2026-09-28T22:22:31.453926+09:00",
      "effective_close_at": "2026-09-28T22:22:31.453926+09:00",
      "effective_close_basis": "max_duration",
      "trigger": null,
      "triggered_at": null,
      "trigger_px": null,
      "attempts": 0,
      "retry_at": null,
      "blocked": false,
      "blocked_reason": null,
      "waiting_on": null,
      "exit_block": null,
      "recovery": null,
      "round_status": "entering",
      "note": "등록된 조건 중 **먼저 도달하는 것**에 닿으면 서버가 청산합니다 — 별도 청산 호출이 필요하지 않습니다. 조건 만족 시각은 체결 시각이 아니며, 체결은 그 뒤 처음 공개된 시세에서 일어납니다. 상대 시간은 첫 진입 체결의 공개 시각부터 세고 부분 추가 체결·재시작으로 연장되지 않습니다."
     },
     "usage": {
      "limit": 1000,
      "used": 2,
      "remaining": 998,
      "entries_enabled": true,
      "period_start": "2026-09-01T00:00:00+00:00",
      "reset_at": "2026-10-01T00:00:00+00:00",
      "counted": 1
     },
     "venue": "binance-usdm",
     "symbol": "BTCUSDT",
     "qty_basis": {
      "lot": "0.001",
      "rule": "smallest_lot_multiple_meeting_min_notional_within_price_headroom",
      "venue": "binance-usdm",
      "source": "symbol_metadata",
      "min_notional": "50",
      "reference_px": "50000.5",
      "price_headroom_pct": "20",
      "contract_multiplier": "1"
     },
     "trial": true,
     "execution_model": {
      "profile_id": "binance-usdm",
      "version": 1
     },
     "expires_at": "2026-09-28T22:22:31.453926+09:00",
     "max_duration_hours": 24,
     "data_mode": "realtime",
     "delay_s": 0,
     "paper_only": true,
     "disclaimer": "시험 원장 전용 — 모의·실거래 계좌의 현금·보유량·손익·성과에 합산되지 않습니다."
    }
   },
   "at": "2026-09-27T13:22:31.455954+00:00",
   "expected_status": 201,
   "status_matches_expectation": true
  },
  {
   "id": "T4",
   "what": "us-equity AAPL short — 기본 라이선스(license_pending) 그대로",
   "request": {
    "method": "POST",
    "path": "/v1/trial-buys",
    "body": {
     "venue": "us-equity",
     "symbol": "AAPL",
     "client_order_id": "blog-a2-02-t4",
     "side": "short",
     "exit_plan": {
      "close_after_seconds": 60
     },
     "max_duration_hours": 24,
     "memo": "기사용 실측: 주식 숏 (라이선스 기본값)",
     "client_tracking_id": "blog-a2-02",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "external_run_id": "blog-a2-02-run-1",
      "tool": "29B-review.py"
     }
    }
   },
   "response": {
    "status": 422,
    "json": {
     "detail": {
      "code": "market_not_licensed",
      "venue": "us-equity",
      "status": "license_pending",
      "detail": "us-equity does not allow orders on this instance"
     }
    }
   },
   "at": "2026-09-27T13:22:31.458054+00:00"
  },
  {
   "id": "T4b",
   "what": "us-equity AAPL short — WELTIQ_MARKET_OPEN=us-equity 로 다시",
   "request": {
    "method": "POST",
    "path": "/v1/trial-buys",
    "body": {
     "venue": "us-equity",
     "symbol": "AAPL",
     "client_order_id": "blog-a2-02-t4b",
     "side": "short",
     "exit_plan": {
      "close_after_seconds": 60
     },
     "max_duration_hours": 24,
     "memo": "기사용 실측: 주식 숏 (시장 개방)",
     "client_tracking_id": "blog-a2-02",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "external_run_id": "blog-a2-02-run-1",
      "tool": "29B-review.py"
     }
    }
   },
   "response": {
    "status": 201,
    "json": {
     "order_id": "fto_b2b711df924ac75c45499583ef9c",
     "test_id": "ft_86e6a3fbf61fdb04d60de9e7",
     "variant_id": "trial",
     "round_id": "ft_86e6a3fbf61fdb04d60de9e7:trial:1",
     "action": "enter",
     "state": "accepted",
     "order_type": "market",
     "limit_px": null,
     "qty": "1",
     "filled_qty": "0",
     "reject_code": null,
     "client_order_id": "blog-a2-02-t4b",
     "client_tracking_id": "blog-a2-02",
     "memo": "기사용 실측: 주식 숏 (시장 개방)",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "tool": "29B-review.py",
      "external_run_id": "blog-a2-02-run-1"
     },
     "origin": {
      "kind": "api_key",
      "user_id": "u_90e97e1f00826fd7",
      "client_id": "wqk_bb2c3e40a371",
      "api_key_id": "wqk_bb2c3e40a371",
      "received_at": "2026-09-27T13:22:31.459699+00:00",
      "container_id": null,
      "slot_version": null,
      "deployment_id": null,
      "schema_version": 1,
      "execution_purpose": "forward_test"
     },
     "counted": true,
     "accepted_at": "2026-09-27T22:22:31.460709+09:00",
     "placed_at": null,
     "terminal_at": null,
     "execution_purpose": "forward_test",
     "affects_account": false,
     "round_no": 1,
     "side": "short",
     "exit_plan": {
      "close_at": null,
      "close_after_seconds": 60,
      "take_profit": null,
      "stop_loss": null
     },
     "auto_close": {
      "managed": true,
      "state": "waiting_entry",
      "close_at": null,
      "stop_loss": null,
      "take_profit": null,
      "close_after_seconds": 60,
      "relative_from": null,
      "relative_close_at": null,
      "relative_clock_started": false,
      "max_duration_until": "2026-09-28T22:22:31.459929+09:00",
      "effective_close_at": "2026-09-28T22:22:31.459929+09:00",
      "effective_close_basis": "max_duration",
      "trigger": null,
      "triggered_at": null,
      "trigger_px": null,
      "attempts": 0,
      "retry_at": null,
      "blocked": false,
      "blocked_reason": null,
      "waiting_on": null,
      "exit_block": null,
      "recovery": null,
      "round_status": "entering",
      "note": "등록된 조건 중 **먼저 도달하는 것**에 닿으면 서버가 청산합니다 — 별도 청산 호출이 필요하지 않습니다. 조건 만족 시각은 체결 시각이 아니며, 체결은 그 뒤 처음 공개된 시세에서 일어납니다. 상대 시간은 첫 진입 체결의 공개 시각부터 세고 부분 추가 체결·재시작으로 연장되지 않습니다."
     },
     "usage": {
      "limit": 1000,
      "used": 3,
      "remaining": 997,
      "entries_enabled": true,
      "period_start": "2026-09-01T00:00:00+00:00",
      "reset_at": "2026-10-01T00:00:00+00:00",
      "counted": 1
     },
     "venue": "us-equity",
     "symbol": "AAPL",
     "qty_basis": {
      "lot": "1",
      "rule": "one_share_or_contract",
      "venue": "us-equity",
      "source": "symbol_metadata",
      "min_notional": "1",
      "contract_multiplier": "1"
     },
     "trial": true,
     "execution_model": {
      "profile_id": "us-equity",
      "version": 1
     },
     "expires_at": "2026-09-28T22:22:31.459929+09:00",
     "max_duration_hours": 24,
     "data_mode": "realtime",
     "delay_s": 0,
     "paper_only": true,
     "disclaimer": "시험 원장 전용 — 모의·실거래 계좌의 현금·보유량·손익·성과에 합산되지 않습니다."
    }
   },
   "at": "2026-09-27T13:22:31.461783+00:00"
  },
  {
   "id": "T5",
   "what": "T1 과 같은 client_order_id + 같은 본문 재전송",
   "request": {
    "method": "POST",
    "path": "/v1/trial-buys",
    "body": {
     "venue": "binance-spot",
     "symbol": "BTCUSDT",
     "client_order_id": "blog-a2-02-t1",
     "side": "long",
     "exit_plan": {
      "close_after_seconds": 60,
      "take_profit": "51000",
      "stop_loss": "49000"
     },
     "max_duration_hours": 24,
     "memo": "기사용 실측: 현물 롱 60초 자동 완결",
     "client_tracking_id": "blog-a2-02",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "external_run_id": "blog-a2-02-run-1",
      "tool": "29B-review.py"
     }
    }
   },
   "response": {
    "status": 200,
    "json": {
     "order_id": "fto_d596594eb466f49167c7c19f0ea5",
     "test_id": "ft_9a32a6e251c39d816a1f015d",
     "variant_id": "trial",
     "round_id": "ft_9a32a6e251c39d816a1f015d:trial:1",
     "action": "enter",
     "state": "accepted",
     "order_type": "market",
     "limit_px": null,
     "qty": "0.00013",
     "filled_qty": "0",
     "reject_code": null,
     "client_order_id": "blog-a2-02-t1",
     "client_tracking_id": "blog-a2-02",
     "memo": "기사용 실측: 현물 롱 60초 자동 완결",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "tool": "29B-review.py",
      "external_run_id": "blog-a2-02-run-1"
     },
     "origin": {
      "kind": "api_key",
      "user_id": "u_90e97e1f00826fd7",
      "client_id": "wqk_bb2c3e40a371",
      "api_key_id": "wqk_bb2c3e40a371",
      "received_at": "2026-09-27T13:22:31.442110+00:00",
      "container_id": null,
      "slot_version": null,
      "deployment_id": null,
      "schema_version": 1,
      "execution_purpose": "forward_test"
     },
     "counted": true,
     "accepted_at": "2026-09-27T22:22:31.444496+09:00",
     "placed_at": null,
     "terminal_at": null,
     "execution_purpose": "forward_test",
     "affects_account": false,
     "idempotent_replay": true,
     "round_no": 1,
     "side": "long",
     "exit_plan": {
      "close_at": null,
      "stop_loss": "49000",
      "take_profit": "51000",
      "close_after_seconds": 60
     },
     "auto_close": {
      "managed": true,
      "state": "waiting_entry",
      "close_at": null,
      "stop_loss": "49000",
      "take_profit": "51000",
      "close_after_seconds": 60,
      "relative_from": null,
      "relative_close_at": null,
      "relative_clock_started": false,
      "max_duration_until": "2026-09-28T22:22:31.442830+09:00",
      "effective_close_at": "2026-09-28T22:22:31.442830+09:00",
      "effective_close_basis": "max_duration",
      "trigger": null,
      "triggered_at": null,
      "trigger_px": null,
      "attempts": 0,
      "retry_at": null,
      "blocked": false,
      "blocked_reason": null,
      "waiting_on": null,
      "exit_block": null,
      "recovery": null,
      "round_status": "entering",
      "note": "등록된 조건 중 **먼저 도달하는 것**에 닿으면 서버가 청산합니다 — 별도 청산 호출이 필요하지 않습니다. 조건 만족 시각은 체결 시각이 아니며, 체결은 그 뒤 처음 공개된 시세에서 일어납니다. 상대 시간은 첫 진입 체결의 공개 시각부터 세고 부분 추가 체결·재시작으로 연장되지 않습니다."
     },
     "usage": {
      "limit": 1000,
      "used": 3,
      "remaining": 997,
      "entries_enabled": true,
      "period_start": "2026-09-01T00:00:00+00:00",
      "reset_at": "2026-10-01T00:00:00+00:00"
     }
    }
   },
   "at": "2026-09-27T13:22:31.464299+00:00",
   "expected_status": 200,
   "status_matches_expectation": true
  },
  {
   "id": "T5-usage",
   "what": "재전송 직후 usage (한도 재사용 확인)",
   "request": {
    "method": "GET",
    "path": "/v1/forward-tests/usage",
    "body": null
   },
   "response": {
    "status": 200,
    "json": {
     "limit": 1000,
     "used": 3,
     "remaining": 997,
     "entries_enabled": true,
     "period_start": "2026-09-01T00:00:00+00:00",
     "reset_at": "2026-10-01T00:00:00+00:00",
     "plan": "pro",
     "can_enter": true,
     "counts": "승인된 신규 진입 1건 = 1회 (청산·부분체결·재시도·조회는 0회)",
     "period": "UTC 달력월 · 이월 없음 · 자동 초과 과금 없음"
    }
   },
   "at": "2026-09-27T13:22:31.465864+00:00",
   "expected_status": 200,
   "status_matches_expectation": true,
   "note": "T5 직후 — T0 대비 증가분이 승인된 신규 진입 건수와 같아야 한다"
  },
  {
   "id": "T6",
   "what": "같은 client_order_id + memo 한 글자만 다른 본문",
   "request": {
    "method": "POST",
    "path": "/v1/trial-buys",
    "body": {
     "venue": "binance-spot",
     "symbol": "BTCUSDT",
     "client_order_id": "blog-a2-02-t1",
     "side": "long",
     "exit_plan": {
      "close_after_seconds": 60,
      "take_profit": "51000",
      "stop_loss": "49000"
     },
     "max_duration_hours": 24,
     "memo": "기사용 실측: 현물 롱 60초 자동 완결!",
     "client_tracking_id": "blog-a2-02",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "external_run_id": "blog-a2-02-run-1",
      "tool": "29B-review.py"
     }
    }
   },
   "response": {
    "status": 409,
    "json": {
     "detail": {
      "code": "client_order_id_conflict",
      "detail": "same client_order_id with a different trial buy"
     }
    }
   },
   "at": "2026-09-27T13:22:31.468269+00:00",
   "expected_status": 409,
   "status_matches_expectation": true
  },
  {
   "id": "T9",
   "what": "qty 를 명시해서 보내기",
   "request": {
    "method": "POST",
    "path": "/v1/trial-buys",
    "body": {
     "venue": "binance-spot",
     "symbol": "BTCUSDT",
     "client_order_id": "blog-a2-02-t9",
     "side": "long",
     "exit_plan": {
      "close_after_seconds": 60
     },
     "max_duration_hours": 24,
     "memo": "기사용 실측: 수량 지정 거절",
     "client_tracking_id": "blog-a2-02",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "external_run_id": "blog-a2-02-run-1",
      "tool": "29B-review.py"
     },
     "qty": "0.001"
    }
   },
   "response": {
    "status": 422,
    "json": {
     "detail": [
      {
       "type": "extra_forbidden",
       "loc": [
        "body",
        "qty"
       ],
       "msg": "Extra inputs are not permitted",
       "input": "0.001"
      }
     ]
    }
   },
   "at": "2026-09-27T13:22:31.470102+00:00",
   "expected_status": 422,
   "status_matches_expectation": true
  },
  {
   "id": "T10",
   "what": "시간 조건을 아무것도 안 주기",
   "request": {
    "method": "POST",
    "path": "/v1/trial-buys",
    "body": {
     "venue": "binance-spot",
     "symbol": "BTCUSDT",
     "client_order_id": "blog-a2-02-t10",
     "side": "long",
     "exit_plan": {
      "take_profit": "51000",
      "stop_loss": "49000"
     },
     "max_duration_hours": 24,
     "memo": "기사용 실측: 시한 없는 계획 거절",
     "client_tracking_id": "blog-a2-02",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "external_run_id": "blog-a2-02-run-1",
      "tool": "29B-review.py"
     }
    }
   },
   "response": {
    "status": 422,
    "json": {
     "detail": {
      "code": "exit_plan_deadline_required",
      "detail": "exit_plan needs close_at (absolute, timezone-aware) or close_after_seconds (from the first entry fill) — both is allowed and the earlier one wins",
      "max_close_at_hours": 168,
      "max_close_after_seconds": 604800
     }
    }
   },
   "at": "2026-09-27T13:22:31.472158+00:00",
   "expected_status": 422,
   "status_matches_expectation": true
  },
  {
   "id": "T3-entry",
   "what": "T3 진입 체결까지",
   "samples": [
    {
     "at": "2026-09-27T13:22:31.474418+00:00",
     "elapsed_s": 0.0,
     "status": "entering",
     "auto_close_state": "waiting_entry",
     "exit_trigger": null,
     "close_reason": null,
     "effective_close_basis": "max_duration",
     "exit_block": null,
     "waiting_on": null,
     "blocked": false,
     "test_status": "running",
     "end_reason": null,
     "exit_trigger_at": null,
     "exit_trigger_px": null,
     "entry": null,
     "exit": null
    },
    {
     "at": "2026-09-27T13:22:33.480918+00:00",
     "elapsed_s": 2.0,
     "status": "open",
     "auto_close_state": "armed",
     "exit_trigger": null,
     "close_reason": null,
     "effective_close_basis": "close_after",
     "exit_block": null,
     "waiting_on": null,
     "blocked": false,
     "test_status": "running",
     "end_reason": null,
     "exit_trigger_at": null,
     "exit_trigger_px": null,
     "entry": {
      "qty": "0.002",
      "avg_px": "49994.49995",
      "at": "2026-09-27T22:22:31.454602+09:00"
     },
     "exit": null
    }
   ]
  },
  {
   "id": "T3-exit",
   "what": "T3 청산 발동까지",
   "samples": [
    {
     "at": "2026-09-27T13:22:33.484211+00:00",
     "elapsed_s": 0.0,
     "status": "open",
     "auto_close_state": "armed",
     "exit_trigger": null,
     "close_reason": null,
     "effective_close_basis": "close_after",
     "exit_block": null,
     "waiting_on": null,
     "blocked": false,
     "test_status": "running",
     "end_reason": null,
     "exit_trigger_at": null,
     "exit_trigger_px": null,
     "entry": {
      "qty": "0.002",
      "avg_px": "49994.49995",
      "at": "2026-09-27T22:22:31.454602+09:00"
     },
     "exit": null
    },
    {
     "at": "2026-09-27T13:22:35.488564+00:00",
     "elapsed_s": 2.0,
     "status": "closed",
     "auto_close_state": "done",
     "exit_trigger": "take_profit",
     "close_reason": "take_profit",
     "effective_close_basis": "close_after",
     "exit_block": null,
     "waiting_on": null,
     "blocked": false,
     "test_status": "running",
     "end_reason": null,
     "exit_trigger_at": "2026-09-27T22:22:34.304586+09:00",
     "exit_trigger_px": "48901",
     "entry": {
      "qty": "0.002",
      "avg_px": "49994.49995",
      "at": "2026-09-27T22:22:31.454602+09:00"
     },
     "exit": {
      "qty": "0.002",
      "avg_px": "48906.39005",
      "at": "2026-09-27T22:22:35.315508+09:00"
     }
    }
   ],
   "final_detail": {
    "test_id": "ft_4954b1fd1bb1b5dc7ad0d1ba",
    "status": "running",
    "venue": "binance-usdm",
    "symbol": "BTCUSDT",
    "qty": "0.002",
    "qty_basis": {
     "lot": "0.001",
     "rule": "smallest_lot_multiple_meeting_min_notional_within_price_headroom",
     "venue": "binance-usdm",
     "source": "symbol_metadata",
     "min_notional": "50",
     "reference_px": "50000.5",
     "price_headroom_pct": "20",
     "contract_multiplier": "1"
    },
    "data_mode": "realtime",
    "delay_s": 0,
    "execution_model": {
     "profile_id": "binance-usdm",
     "version": 1
    },
    "monthly_limit": 1000,
    "deployment_id": null,
    "trial": true,
    "max_duration_until": "2026-09-28T22:22:31.453926+09:00",
    "memo": "기사용 실측: 선물 숏 목표가 발동",
    "tags": [
     "a2-02",
     "evidence"
    ],
    "metadata": {
     "tool": "29B-review.py",
     "external_run_id": "blog-a2-02-run-1"
    },
    "created_at": "2026-09-27T22:22:31.454032+09:00",
    "started_at": "2026-09-27T22:22:31.454177+09:00",
    "expires_at": "2026-09-28T22:22:31.453926+09:00",
    "ended_at": null,
    "end_reason": null,
    "cursor_at": "2026-09-27T22:22:35.308426+09:00",
    "variants": [
     {
      "variant_id": "trial",
      "label": null,
      "memo": null,
      "metadata": {},
      "round_no": 1,
      "created_at": "2026-09-27T22:22:31.454087+09:00"
     }
    ],
    "comparison": [
     {
      "variant_id": "trial",
      "round_no": 1,
      "round_id": "ft_4954b1fd1bb1b5dc7ad0d1ba:trial:1",
      "status": "closed",
      "side": "short",
      "exit_plan": {
       "close_at": null,
       "stop_loss": "51000",
       "take_profit": "49000",
       "close_after_seconds": 60
      },
      "auto_close": {
       "managed": true,
       "state": "done",
       "close_at": null,
       "stop_loss": "51000",
       "take_profit": "49000",
       "close_after_seconds": 60,
       "relative_from": "2026-09-27T22:22:32.286031+09:00",
       "relative_close_at": "2026-09-27T22:23:32.286031+09:00",
       "relative_clock_started": true,
       "max_duration_until": "2026-09-28T22:22:31.453926+09:00",
       "effective_close_at": "2026-09-27T22:23:32.286031+09:00",
       "effective_close_basis": "close_after",
       "trigger": "take_profit",
       "triggered_at": "2026-09-27T22:22:34.304586+09:00",
       "trigger_px": "48901",
       "attempts": 1,
       "retry_at": "2026-09-27T22:22:34.304689+09:00",
       "blocked": false,
       "blocked_reason": null,
       "waiting_on": null,
       "exit_block": null,
       "recovery": null,
       "round_status": "closed",
       "note": "등록된 조건 중 **먼저 도달하는 것**에 닿으면 서버가 청산합니다 — 별도 청산 호출이 필요하지 않습니다. 조건 만족 시각은 체결 시각이 아니며, 체결은 그 뒤 처음 공개된 시세에서 일어납니다. 상대 시간은 첫 진입 체결의 공개 시각부터 세고 부분 추가 체결·재시작으로 연장되지 않습니다."
      },
      "exit_trigger": "take_profit",
      "exit_trigger_at": "2026-09-27T22:22:34.304586+09:00",
      "exit_trigger_px": "48901",
      "entry": {
       "qty": "0.002",
       "avg_px": "49994.49995",
       "at": "2026-09-27T22:22:31.454602+09:00"
      },
      "exit": {
       "qty": "0.002",
       "avg_px": "48906.39005",
       "at": "2026-09-27T22:22:35.315508+09:00"
      },
      "open_qty": "0.000",
      "fees": "0.09890089",
      "fee_ccy": "USDT",
      "gross_pnl": "2.17621980",
      "net_pnl": "2.07731891",
      "realized_pnl": "2.07731891",
      "contract_multiplier": "1",
      "unrealized": null,
      "mark_px": "48901",
      "unrealized_as_of": "2026-09-27T22:22:34.302350+09:00",
      "close_reason": "take_profit",
      "orders": 2,
      "fills": 2
     }
    ],
    "feed": {
     "quote_status": "unlisted",
     "subscribed": false,
     "cursor_at": "2026-09-27T22:22:35.308426+09:00",
     "notice": {
      "status": "unlisted",
      "venue": "binance-usdm",
      "symbol": "BTCUSDT",
      "subscribed": false,
      "ko": "binance-usdm 상장 목록에 BTCUSDT 가 없습니다 — 시세 수집이 시작되지 않았고, 이대로 두면 체결 없이 계속 돕니다. 종목 코드를 확인하세요.",
      "en": "BTCUSDT is not in the binance-usdm listing, so no market data collection started — it would run without fills. Check the symbol code."
     }
    },
    "execution_purpose": "forward_test",
    "paper_only": true,
    "affects_account": false,
    "disclaimer": "시험 원장 전용 — 모의·실거래 계좌의 현금·보유량·손익·성과에 합산되지 않습니다."
   }
  },
  {
   "id": "T1-exit",
   "what": "T1 시간 발동까지",
   "samples": [
    {
     "at": "2026-09-27T13:22:35.491968+00:00",
     "elapsed_s": 0.0,
     "status": "open",
     "auto_close_state": "armed",
     "exit_trigger": null,
     "close_reason": null,
     "effective_close_basis": "close_after",
     "exit_block": null,
     "waiting_on": null,
     "blocked": false,
     "test_status": "running",
     "end_reason": null,
     "exit_trigger_at": null,
     "exit_trigger_px": null,
     "entry": {
      "qty": "0.00013",
      "avg_px": "50006.50005",
      "at": "2026-09-27T22:22:31.444188+09:00"
     },
     "exit": null
    },
    {
     "at": "2026-09-27T13:23:33.675247+00:00",
     "elapsed_s": 58.2,
     "status": "closed",
     "auto_close_state": "done",
     "exit_trigger": "close_after",
     "close_reason": "close_after",
     "effective_close_basis": "close_after",
     "exit_block": null,
     "waiting_on": null,
     "blocked": false,
     "test_status": "running",
     "end_reason": null,
     "exit_trigger_at": "2026-09-27T22:23:32.285872+09:00",
     "exit_trigger_px": null,
     "entry": {
      "qty": "0.00013",
      "avg_px": "50006.50005",
      "at": "2026-09-27T22:22:31.444188+09:00"
     },
     "exit": {
      "qty": "0.00013",
      "avg_px": "49994.49995",
      "at": "2026-09-27T22:23:32.671239+09:00"
     }
    }
   ],
   "final_detail": {
    "test_id": "ft_9a32a6e251c39d816a1f015d",
    "status": "running",
    "venue": "binance-spot",
    "symbol": "BTCUSDT",
    "qty": "0.00013",
    "qty_basis": {
     "lot": "0.00001",
     "rule": "smallest_lot_multiple_meeting_min_notional_within_price_headroom",
     "venue": "binance-spot",
     "source": "symbol_metadata",
     "min_notional": "5",
     "reference_px": "50000.5",
     "price_headroom_pct": "20",
     "contract_multiplier": "1"
    },
    "data_mode": "realtime",
    "delay_s": 0,
    "execution_model": {
     "profile_id": "binance-spot",
     "version": 1
    },
    "monthly_limit": 1000,
    "deployment_id": null,
    "trial": true,
    "max_duration_until": "2026-09-28T22:22:31.442830+09:00",
    "memo": "기사용 실측: 현물 롱 60초 자동 완결",
    "tags": [
     "a2-02",
     "evidence"
    ],
    "metadata": {
     "tool": "29B-review.py",
     "external_run_id": "blog-a2-02-run-1"
    },
    "created_at": "2026-09-27T22:22:31.442993+09:00",
    "started_at": "2026-09-27T22:22:31.443430+09:00",
    "expires_at": "2026-09-28T22:22:31.442830+09:00",
    "ended_at": null,
    "end_reason": null,
    "cursor_at": "2026-09-27T22:23:32.661504+09:00",
    "variants": [
     {
      "variant_id": "trial",
      "label": null,
      "memo": null,
      "metadata": {},
      "round_no": 1,
      "created_at": "2026-09-27T22:22:31.443163+09:00"
     }
    ],
    "comparison": [
     {
      "variant_id": "trial",
      "round_no": 1,
      "round_id": "ft_9a32a6e251c39d816a1f015d:trial:1",
      "status": "closed",
      "side": "long",
      "exit_plan": {
       "close_at": null,
       "stop_loss": "49000",
       "take_profit": "51000",
       "close_after_seconds": 60
      },
      "auto_close": {
       "managed": true,
       "state": "done",
       "close_at": null,
       "stop_loss": "49000",
       "take_profit": "51000",
       "close_after_seconds": 60,
       "relative_from": "2026-09-27T22:22:32.285872+09:00",
       "relative_close_at": "2026-09-27T22:23:32.285872+09:00",
       "relative_clock_started": true,
       "max_duration_until": "2026-09-28T22:22:31.442830+09:00",
       "effective_close_at": "2026-09-27T22:23:32.285872+09:00",
       "effective_close_basis": "close_after",
       "trigger": "close_after",
       "triggered_at": "2026-09-27T22:23:32.285872+09:00",
       "trigger_px": null,
       "attempts": 1,
       "retry_at": "2026-09-27T22:23:32.661511+09:00",
       "blocked": false,
       "blocked_reason": null,
       "waiting_on": null,
       "exit_block": null,
       "recovery": null,
       "round_status": "closed",
       "note": "등록된 조건 중 **먼저 도달하는 것**에 닿으면 서버가 청산합니다 — 별도 청산 호출이 필요하지 않습니다. 조건 만족 시각은 체결 시각이 아니며, 체결은 그 뒤 처음 공개된 시세에서 일어납니다. 상대 시간은 첫 진입 체결의 공개 시각부터 세고 부분 추가 체결·재시작으로 연장되지 않습니다."
      },
      "exit_trigger": "close_after",
      "exit_trigger_at": "2026-09-27T22:23:32.285872+09:00",
      "exit_trigger_px": null,
      "entry": {
       "qty": "0.00013",
       "avg_px": "50006.50005",
       "at": "2026-09-27T22:22:31.444188+09:00"
      },
      "exit": {
       "qty": "0.00013",
       "avg_px": "49994.49995",
       "at": "2026-09-27T22:23:32.671239+09:00"
      },
      "open_qty": "0.00000",
      "fees": "0.01300013",
      "fee_ccy": "USDT",
      "gross_pnl": "-0.0015600130",
      "net_pnl": "-0.0145601430",
      "realized_pnl": "-0.0145601430",
      "contract_multiplier": "1",
      "unrealized": null,
      "mark_px": "50000",
      "unrealized_as_of": "2026-09-27T22:23:31.654555+09:00",
      "close_reason": "close_after",
      "orders": 2,
      "fills": 2
     }
    ],
    "feed": {
     "quote_status": "subscribed",
     "subscribed": true,
     "cursor_at": "2026-09-27T22:23:32.661504+09:00",
     "notice": null
    },
    "execution_purpose": "forward_test",
    "paper_only": true,
    "affects_account": false,
    "disclaimer": "시험 원장 전용 — 모의·실거래 계좌의 현금·보유량·손익·성과에 합산되지 않습니다."
   }
  },
  {
   "id": "T4b-track",
   "what": "T4b 집행 결과 추적",
   "samples": [
    {
     "at": "2026-09-27T13:23:33.677669+00:00",
     "elapsed_s": 0.0,
     "status": "closed",
     "auto_close_state": "done",
     "exit_trigger": null,
     "close_reason": "rejected:market_closed",
     "effective_close_basis": "max_duration",
     "exit_block": null,
     "waiting_on": null,
     "blocked": false,
     "test_status": "ended",
     "end_reason": "trial_completed",
     "exit_trigger_at": null,
     "exit_trigger_px": null,
     "entry": null,
     "exit": null
    }
   ],
   "final_detail": {
    "test_id": "ft_86e6a3fbf61fdb04d60de9e7",
    "status": "ended",
    "venue": "us-equity",
    "symbol": "AAPL",
    "qty": "1",
    "qty_basis": {
     "lot": "1",
     "rule": "one_share_or_contract",
     "venue": "us-equity",
     "source": "symbol_metadata",
     "min_notional": "1",
     "contract_multiplier": "1"
    },
    "data_mode": "realtime",
    "delay_s": 0,
    "execution_model": {
     "profile_id": "us-equity",
     "version": 1
    },
    "monthly_limit": 1000,
    "deployment_id": null,
    "trial": true,
    "max_duration_until": "2026-09-28T22:22:31.459929+09:00",
    "memo": "기사용 실측: 주식 숏 (시장 개방)",
    "tags": [
     "a2-02",
     "evidence"
    ],
    "metadata": {
     "tool": "29B-review.py",
     "external_run_id": "blog-a2-02-run-1"
    },
    "created_at": "2026-09-27T22:22:31.460030+09:00",
    "started_at": "2026-09-27T22:22:31.460156+09:00",
    "expires_at": "2026-09-28T22:22:31.459929+09:00",
    "ended_at": "2026-09-27T22:22:32.290714+09:00",
    "end_reason": "trial_completed",
    "cursor_at": "2026-09-27T22:22:32.276786+09:00",
    "variants": [
     {
      "variant_id": "trial",
      "label": null,
      "memo": null,
      "metadata": {},
      "round_no": 1,
      "created_at": "2026-09-27T22:22:31.460082+09:00"
     }
    ],
    "comparison": [
     {
      "variant_id": "trial",
      "round_no": 1,
      "round_id": "ft_86e6a3fbf61fdb04d60de9e7:trial:1",
      "status": "closed",
      "side": "short",
      "exit_plan": {
       "close_at": null,
       "stop_loss": null,
       "take_profit": null,
       "close_after_seconds": 60
      },
      "auto_close": {
       "managed": true,
       "state": "done",
       "close_at": null,
       "stop_loss": null,
       "take_profit": null,
       "close_after_seconds": 60,
       "relative_from": null,
       "relative_close_at": null,
       "relative_clock_started": false,
       "max_duration_until": "2026-09-28T22:22:31.459929+09:00",
       "effective_close_at": "2026-09-28T22:22:31.459929+09:00",
       "effective_close_basis": "max_duration",
       "trigger": null,
       "triggered_at": null,
       "trigger_px": null,
       "attempts": 0,
       "retry_at": null,
       "blocked": false,
       "blocked_reason": null,
       "waiting_on": null,
       "exit_block": null,
       "recovery": null,
       "round_status": "closed",
       "note": "등록된 조건 중 **먼저 도달하는 것**에 닿으면 서버가 청산합니다 — 별도 청산 호출이 필요하지 않습니다. 조건 만족 시각은 체결 시각이 아니며, 체결은 그 뒤 처음 공개된 시세에서 일어납니다. 상대 시간은 첫 진입 체결의 공개 시각부터 세고 부분 추가 체결·재시작으로 연장되지 않습니다."
      },
      "exit_trigger": null,
      "exit_trigger_at": null,
      "exit_trigger_px": null,
      "entry": null,
      "exit": null,
      "open_qty": "0",
      "fees": "0",
      "fee_ccy": null,
      "gross_pnl": null,
      "net_pnl": null,
      "realized_pnl": null,
      "contract_multiplier": "1",
      "unrealized": null,
      "mark_px": null,
      "unrealized_as_of": null,
      "close_reason": "rejected:market_closed",
      "orders": 1,
      "fills": 0
     }
    ],
    "feed": {
     "quote_status": "subscribed",
     "subscribed": true,
     "cursor_at": "2026-09-27T22:22:32.276786+09:00",
     "notice": null
    },
    "execution_purpose": "forward_test",
    "paper_only": true,
    "affects_account": false,
    "disclaimer": "시험 원장 전용 — 모의·실거래 계좌의 현금·보유량·손익·성과에 합산되지 않습니다."
   }
  },
  {
   "id": "T7-detail",
   "what": "T1 상세",
   "request": {
    "method": "GET",
    "path": "/v1/forward-tests/ft_9a32a6e251c39d816a1f015d",
    "body": null
   },
   "response": {
    "status": 200,
    "json": {
     "test_id": "ft_9a32a6e251c39d816a1f015d",
     "status": "ended",
     "venue": "binance-spot",
     "symbol": "BTCUSDT",
     "qty": "0.00013",
     "qty_basis": {
      "lot": "0.00001",
      "rule": "smallest_lot_multiple_meeting_min_notional_within_price_headroom",
      "venue": "binance-spot",
      "source": "symbol_metadata",
      "min_notional": "5",
      "reference_px": "50000.5",
      "price_headroom_pct": "20",
      "contract_multiplier": "1"
     },
     "data_mode": "realtime",
     "delay_s": 0,
     "execution_model": {
      "profile_id": "binance-spot",
      "version": 1
     },
     "monthly_limit": 1000,
     "deployment_id": null,
     "trial": true,
     "max_duration_until": "2026-09-28T22:22:31.442830+09:00",
     "memo": "기사용 실측: 현물 롱 60초 자동 완결",
     "tags": [
      "a2-02",
      "evidence"
     ],
     "metadata": {
      "tool": "29B-review.py",
      "external_run_id": "blog-a2-02-run-1"
     },
     "created_at": "2026-09-27T22:22:31.442993+09:00",
     "started_at": "2026-09-27T22:22:31.443430+09:00",
     "expires_at": "2026-09-28T22:22:31.442830+09:00",
     "ended_at": "2026-09-27T22:23:33.673396+09:00",
     "end_reason": "trial_completed",
     "cursor_at": "2026-09-27T22:23:32.661504+09:00",
     "variants": [
      {
       "variant_id": "trial",
       "label": null,
       "memo": null,
       "metadata": {},
       "round_no": 1,
       "created_at": "2026-09-27T22:22:31.443163+09:00"
      }
     ],
     "comparison": [
      {
       "variant_id": "trial",
       "round_no": 1,
       "round_id": "ft_9a32a6e251c39d816a1f015d:trial:1",
       "status": "closed",
       "side": "long",
       "exit_plan": {
        "close_at": null,
        "stop_loss": "49000",
        "take_profit": "51000",
        "close_after_seconds": 60
       },
       "auto_close": {
        "managed": true,
        "state": "done",
        "close_at": null,
        "stop_loss": "49000",
        "take_profit": "51000",
        "close_after_seconds": 60,
        "relative_from": "2026-09-27T22:22:32.285872+09:00",
        "relative_close_at": "2026-09-27T22:23:32.285872+09:00",
        "relative_clock_started": true,
        "max_duration_until": "2026-09-28T22:22:31.442830+09:00",
        "effective_close_at": "2026-09-27T22:23:32.285872+09:00",
        "effective_close_basis": "close_after",
        "trigger": "close_after",
        "triggered_at": "2026-09-27T22:23:32.285872+09:00",
        "trigger_px": null,
        "attempts": 1,
        "retry_at": "2026-09-27T22:23:32.661511+09:00",
        "blocked": false,
        "blocked_reason": null,
        "waiting_on": null,
        "exit_block": null,
        "recovery": null,
        "round_status": "closed",
        "note": "등록된 조건 중 **먼저 도달하는 것**에 닿으면 서버가 청산합니다 — 별도 청산 호출이 필요하지 않습니다. 조건 만족 시각은 체결 시각이 아니며, 체결은 그 뒤 처음 공개된 시세에서 일어납니다. 상대 시간은 첫 진입 체결의 공개 시각부터 세고 부분 추가 체결·재시작으로 연장되지 않습니다."
       },
       "exit_trigger": "close_after",
       "exit_trigger_at": "2026-09-27T22:23:32.285872+09:00",
       "exit_trigger_px": null,
       "entry": {
        "qty": "0.00013",
        "avg_px": "50006.50005",
        "at": "2026-09-27T22:22:31.444188+09:00"
       },
       "exit": {
        "qty": "0.00013",
        "avg_px": "49994.49995",
        "at": "2026-09-27T22:23:32.671239+09:00"
       },
       "open_qty": "0.00000",
       "fees": "0.01300013",
       "fee_ccy": "USDT",
       "gross_pnl": "-0.0015600130",
       "net_pnl": "-0.0145601430",
       "realized_pnl": "-0.0145601430",
       "contract_multiplier": "1",
       "unrealized": null,
       "mark_px": "50000",
       "unrealized_as_of": "2026-09-27T22:23:31.654555+09:00",
       "close_reason": "close_after",
       "orders": 2,
       "fills": 2
      }
     ],
     "feed": {
      "quote_status": "subscribed",
      "subscribed": true,
      "cursor_at": "2026-09-27T22:23:32.661504+09:00",
      "notice": null
     },
     "execution_purpose": "forward_test",
     "paper_only": true,
     "affects_account": false,
     "disclaimer": "시험 원장 전용 — 모의·실거래 계좌의 현금·보유량·손익·성과에 합산되지 않습니다."
    }
   },
   "at": "2026-09-27T13:23:33.679971+00:00",
   "expected_status": 200,
   "status_matches_expectation": true
  },
  {
   "id": "T7-csv",
   "what": "T1 CSV 내보내기",
   "request": {
    "method": "GET",
    "path": "/v1/forward-tests/ft_9a32a6e251c39d816a1f015d/export?format=csv",
    "body": null
   },
   "response": {
    "status": 200,
    "json": null,
    "text": "test_id,variant_id,round_id,order_id,action,state,order_type,qty,filled_qty,client_order_id,client_tracking_id,tags,memo,metadata,accepted_at,fill_id,fill_qty,fill_px,fee,fee_ccy,liquidity,fill_at,quote_source,published_at,side,exit_plan,exit_trigger,exit_trigger_at,exit_trigger_px,close_reason\r\nft_9a32a6e251c39d816a1f015d,trial,ft_9a32a6e251c39d816a1f015d:trial:1,fto_d596594eb466f49167c7c19f0ea5,enter,filled,market,0.00013,0.00013,blog-a2-02-t1,blog-a2-02,a2-02|evidence,기사용 실측: 현물 롱 60초 자동 완결,\"{\"\"tool\"\": \"\"29B-review.py\"\", \"\"external_run_id\"\": \"\"blog-a2-02-run-1\"\"}\",2026-09-27T22:22:31.444496+09:00,fto_d596594eb466f49167c7c19f0ea5:f1,0.00013,50006.50005,0.00650085,USDT,taker,2026-09-27T22:22:32.287298+09:00,binance,2026-09-27T22:22:32.285872+09:00,long,\"{\"\"close_after_seconds\"\": 60, \"\"close_at\"\": null, \"\"stop_loss\"\": \"\"49000\"\", \"\"take_profit\"\": \"\"51000\"\"}\",close_after,2026-09-27T22:23:32.285872+09:00,,close_after\r\nft_9a32a6e251c39d816a1f015d,trial,ft_9a32a6e251c39d816a1f015d:trial:1,fto_x61e0a4ed4816438e53ad148a84,exit,filled,market,0.00013,0.00013,exit-plan:ft_9a32a6e251c39d816a1f015d:trial:1:1,,,등록된 청산 조건에 따른 자동 청산,{},2026-09-27T22:23:32.664539+09:00,fto_x61e0a4ed4816438e53ad148a84:f1,0.00013,49994.49995,0.00649928,USDT,taker,2026-09-27T22:23:32.669799+09:00,binance,2026-09-27T22:23:32.667114+09:00,long,\"{\"\"close_after_seconds\"\": 60, \"\"close_at\"\": null, \"\"stop_loss\"\": \"\"49000\"\", \"\"take_profit\"\": \"\"51000\"\"}\",close_after,2026-09-27T22:23:32.285872+09:00,,close_after\r\n"
   },
   "at": "2026-09-27T13:23:33.684116+00:00",
   "expected_status": 200,
   "status_matches_expectation": true,
   "csv_header": "test_id,variant_id,round_id,order_id,action,state,order_type,qty,filled_qty,client_order_id,client_tracking_id,tags,memo,metadata,accepted_at,fill_id,fill_qty,fill_px,fee,fee_ccy,liquidity,fill_at,quote_source,published_at,side,exit_plan,exit_trigger,exit_trigger_at,exit_trigger_px,close_reason",
   "csv_lines": [
    "test_id,variant_id,round_id,order_id,action,state,order_type,qty,filled_qty,client_order_id,client_tracking_id,tags,memo,metadata,accepted_at,fill_id,fill_qty,fill_px,fee,fee_ccy,liquidity,fill_at,quote_source,published_at,side,exit_plan,exit_trigger,exit_trigger_at,exit_trigger_px,close_reason",
    "ft_9a32a6e251c39d816a1f015d,trial,ft_9a32a6e251c39d816a1f015d:trial:1,fto_d596594eb466f49167c7c19f0ea5,enter,filled,market,0.00013,0.00013,blog-a2-02-t1,blog-a2-02,a2-02|evidence,기사용 실측: 현물 롱 60초 자동 완결,\"{\"\"tool\"\": \"\"29B-review.py\"\", \"\"external_run_id\"\": \"\"blog-a2-02-run-1\"\"}\",2026-09-27T22:22:31.444496+09:00,fto_d596594eb466f49167c7c19f0ea5:f1,0.00013,50006.50005,0.00650085,USDT,taker,2026-09-27T22:22:32.287298+09:00,binance,2026-09-27T22:22:32.285872+09:00,long,\"{\"\"close_after_seconds\"\": 60, \"\"close_at\"\": null, \"\"stop_loss\"\": \"\"49000\"\", \"\"take_profit\"\": \"\"51000\"\"}\",close_after,2026-09-27T22:23:32.285872+09:00,,close_after",
    "ft_9a32a6e251c39d816a1f015d,trial,ft_9a32a6e251c39d816a1f015d:trial:1,fto_x61e0a4ed4816438e53ad148a84,exit,filled,market,0.00013,0.00013,exit-plan:ft_9a32a6e251c39d816a1f015d:trial:1:1,,,등록된 청산 조건에 따른 자동 청산,{},2026-09-27T22:23:32.664539+09:00,fto_x61e0a4ed4816438e53ad148a84:f1,0.00013,49994.49995,0.00649928,USDT,taker,2026-09-27T22:23:32.669799+09:00,binance,2026-09-27T22:23:32.667114+09:00,long,\"{\"\"close_after_seconds\"\": 60, \"\"close_at\"\": null, \"\"stop_loss\"\": \"\"49000\"\", \"\"take_profit\"\": \"\"51000\"\"}\",close_after,2026-09-27T22:23:32.285872+09:00,,close_after"
   ]
  },
  {
   "id": "T7-json",
   "what": "T1 JSON 내보내기",
   "request": {
    "method": "GET",
    "path": "/v1/forward-tests/ft_9a32a6e251c39d816a1f015d/export?format=json",
    "body": null
   },
   "response": {
    "status": 200,
    "json": {
     "schema": "forward-test-export/v1",
     "exported_at": "2026-09-27T13:23:33.685522+00:00",
     "test": {
      "test_id": "ft_9a32a6e251c39d816a1f015d",
      "status": "ended",
      "venue": "binance-spot",
      "symbol": "BTCUSDT",
      "qty": "0.00013",
      "qty_basis": {
       "lot": "0.00001",
       "rule": "smallest_lot_multiple_meeting_min_notional_within_price_headroom",
       "venue": "binance-spot",
       "source": "symbol_metadata",
       "min_notional": "5",
       "reference_px": "50000.5",
       "price_headroom_pct": "20",
       "contract_multiplier": "1"
      },
      "data_mode": "realtime",
      "delay_s": 0,
      "execution_model": {
       "profile_id": "binance-spot",
       "version": 1
      },
      "monthly_limit": 1000,
      "deployment_id": null,
      "trial": true,
      "max_duration_until": "2026-09-28T22:22:31.442830+09:00",
      "memo": "기사용 실측: 현물 롱 60초 자동 완결",
      "tags": [
       "a2-02",
       "evidence"
      ],
      "metadata": {
       "tool": "29B-review.py",
       "external_run_id": "blog-a2-02-run-1"
      },
      "created_at": "2026-09-27T22:22:31.442993+09:00",
      "started_at": "2026-09-27T22:22:31.443430+09:00",
      "expires_at": "2026-09-28T22:22:31.442830+09:00",
      "ended_at": "2026-09-27T22:23:33.673396+09:00",
      "end_reason": "trial_completed",
      "cursor_at": "2026-09-27T22:23:32.661504+09:00",
      "variants": [
       {
        "variant_id": "trial",
        "label": null,
        "memo": null,
        "metadata": {},
        "round_no": 1,
        "created_at": "2026-09-27T22:22:31.443163+09:00"
       }
      ],
      "comparison": [
       {
        "variant_id": "trial",
        "round_no": 1,
        "round_id": "ft_9a32a6e251c39d816a1f015d:trial:1",
        "status": "closed",
        "side": "long",
        "exit_plan": {
         "close_at": null,
         "stop_loss": "49000",
         "take_profit": "51000",
         "close_after_seconds": 60
        },
        "auto_close": {
         "managed": true,
         "state": "done",
         "close_at": null,
         "stop_loss": "49000",
         "take_profit": "51000",
         "close_after_seconds": 60,
         "relative_from": "2026-09-27T22:22:32.285872+09:00",
         "relative_close_at": "2026-09-27T22:23:32.285872+09:00",
         "relative_clock_started": true,
         "max_duration_until": "2026-09-28T22:22:31.442830+09:00",
         "effective_close_at": "2026-09-27T22:23:32.285872+09:00",
         "effective_close_basis": "close_after",
         "trigger": "close_after",
         "triggered_at": "2026-09-27T22:23:32.285872+09:00",
         "trigger_px": null,
         "attempts": 1,
         "retry_at": "2026-09-27T22:23:32.661511+09:00",
         "blocked": false,
         "blocked_reason": null,
         "waiting_on": null,
         "exit_block": null,
         "recovery": null,
         "round_status": "closed",
         "note": "등록된 조건 중 **먼저 도달하는 것**에 닿으면 서버가 청산합니다 — 별도 청산 호출이 필요하지 않습니다. 조건 만족 시각은 체결 시각이 아니며, 체결은 그 뒤 처음 공개된 시세에서 일어납니다. 상대 시간은 첫 진입 체결의 공개 시각부터 세고 부분 추가 체결·재시작으로 연장되지 않습니다."
        },
        "exit_trigger": "close_after",
        "exit_trigger_at": "2026-09-27T22:23:32.285872+09:00",
        "exit_trigger_px": null,
        "entry": {
         "qty": "0.00013",
         "avg_px": "50006.50005",
         "at": "2026-09-27T22:22:31.444188+09:00"
        },
        "exit": {
         "qty": "0.00013",
         "avg_px": "49994.49995",
         "at": "2026-09-27T22:23:32.671239+09:00"
        },
        "open_qty": "0.00000",
        "fees": "0.01300013",
        "fee_ccy": "USDT",
        "gross_pnl": "-0.0015600130",
        "net_pnl": "-0.0145601430",
        "realized_pnl": "-0.0145601430",
        "contract_multiplier": "1",
        "unrealized": null,
        "mark_px": "50000",
        "unrealized_as_of": "2026-09-27T22:23:31.654555+09:00",
        "close_reason": "close_after",
        "orders": 2,
        "fills": 2
       }
      ],
      "feed": {
       "quote_status": "subscribed",
       "subscribed": true,
       "cursor_at": "2026-09-27T22:23:32.661504+09:00",
       "notice": null
      },
      "execution_purpose": "forward_test",
      "paper_only": true,
      "affects_account": false,
      "disclaimer": "시험 원장 전용 — 모의·실거래 계좌의 현금·보유량·손익·성과에 합산되지 않습니다."
     },
     "orders": [
      {
       "order_id": "fto_d596594eb466f49167c7c19f0ea5",
       "test_id": "ft_9a32a6e251c39d816a1f015d",
       "variant_id": "trial",
       "round_id": "ft_9a32a6e251c39d816a1f015d:trial:1",
       "action": "enter",
       "state": "filled",
       "order_type": "market",
       "limit_px": null,
       "qty": "0.00013",
       "filled_qty": "0.00013",
       "reject_code": null,
       "client_order_id": "blog-a2-02-t1",
       "client_tracking_id": "blog-a2-02",
       "memo": "기사용 실측: 현물 롱 60초 자동 완결",
       "tags": [
        "a2-02",
        "evidence"
       ],
       "metadata": {
        "tool": "29B-review.py",
        "external_run_id": "blog-a2-02-run-1"
       },
       "origin": {
        "kind": "api_key",
        "user_id": "u_90e97e1f00826fd7",
        "client_id": "wqk_bb2c3e40a371",
        "api_key_id": "wqk_bb2c3e40a371",
        "received_at": "2026-09-27T13:22:31.442110+00:00",
        "container_id": null,
        "slot_version": null,
        "deployment_id": null,
        "schema_version": 1,
        "execution_purpose": "forward_test"
       },
       "counted": true,
       "accepted_at": "2026-09-27T22:22:31.444496+09:00",
       "placed_at": "2026-09-27T22:22:32.287371+09:00",
       "terminal_at": "2026-09-27T22:22:32.291421+09:00",
       "execution_purpose": "forward_test",
       "affects_account": false,
       "fills": [
        {
         "fill_id": "fto_d596594eb466f49167c7c19f0ea5:f1",
         "qty": "0.00013",
         "px": "50006.50005",
         "fee": "0.00650085",
         "fee_ccy": "USDT",
         "liquidity": "taker",
         "at": "2026-09-27T22:22:32.287298+09:00",
         "expected_px": "50001",
         "quote_source": "binance",
         "quote_scope": "binance-spot",
         "published_at": "2026-09-27T22:22:32.285872+09:00"
        }
       ],
       "notes": [
        {
         "note_id": 1,
         "memo": "기사용 실측: 현물 롱 60초 자동 완결",
         "at": "2026-09-27T22:22:31.444736+09:00"
        }
       ]
      },
      {
       "order_id": "fto_x61e0a4ed4816438e53ad148a84",
       "test_id": "ft_9a32a6e251c39d816a1f015d",
       "variant_id": "trial",
       "round_id": "ft_9a32a6e251c39d816a1f015d:trial:1",
       "action": "exit",
       "state": "filled",
       "order_type": "market",
       "limit_px": null,
       "qty": "0.00013",
       "filled_qty": "0.00013",
       "reject_code": null,
       "client_order_id": "exit-plan:ft_9a32a6e251c39d816a1f015d:trial:1:1",
       "client_tracking_id": null,
       "memo": "등록된 청산 조건에 따른 자동 청산",
       "tags": [],
       "metadata": {},
       "origin": {
        "kind": "exit_plan",
        "reason": "close_after",
        "attempt": 1,
        "user_id": "u_90e97e1f00826fd7",
        "schema_version": 1,
        "execution_purpose": "forward_test"
       },
       "counted": false,
       "accepted_at": "2026-09-27T22:23:32.664539+09:00",
       "placed_at": "2026-09-27T22:23:32.669962+09:00",
       "terminal_at": "2026-09-27T22:23:32.670925+09:00",
       "execution_purpose": "forward_test",
       "affects_account": false,
       "fills": [
        {
         "fill_id": "fto_x61e0a4ed4816438e53ad148a84:f1",
         "qty": "0.00013",
         "px": "49994.49995",
         "fee": "0.00649928",
         "fee_ccy": "USDT",
         "liquidity": "taker",
         "at": "2026-09-27T22:23:32.669799+09:00",
         "expected_px": "50000",
         "quote_source": "binance",
         "quote_scope": "binance-spot",
         "published_at": "2026-09-27T22:23:32.667114+09:00"
        }
       ],
       "notes": []
      }
     ],
     "execution_purpose": "forward_test",
     "notice": "시험 원장 전용 기록입니다. 계좌 성과·완료 거래 수에 합산하지 마세요."
    }
   },
   "at": "2026-09-27T13:23:33.686642+00:00",
   "expected_status": 200,
   "status_matches_expectation": true
  },
  {
   "id": "T8",
   "what": "전부 끝난 뒤 usage + 계좌 원장 스냅샷",
   "request": {
    "method": "GET",
    "path": "/v1/forward-tests/usage",
    "body": null
   },
   "response": {
    "status": 200,
    "json": {
     "limit": 1000,
     "used": 2,
     "remaining": 998,
     "entries_enabled": true,
     "period_start": "2026-09-01T00:00:00+00:00",
     "reset_at": "2026-10-01T00:00:00+00:00",
     "plan": "pro",
     "can_enter": true,
     "counts": "승인된 신규 진입 1건 = 1회 (청산·부분체결·재시도·조회는 0회)",
     "period": "UTC 달력월 · 이월 없음 · 자동 초과 과금 없음"
    }
   },
   "at": "2026-09-27T13:23:33.688157+00:00",
   "expected_status": 200,
   "status_matches_expectation": true,
   "account_snapshot": {
    "account.accounts": [
     {
      "account_id": "acc_u_90e97e1f00826fd7",
      "user_id": "u_90e97e1f00826fd7",
      "portfolio_id": "pf_u_90e97e1f00826fd7",
      "venue": "binance-spot",
      "mode": "paper",
      "base_ccy": "USDT",
      "allocation": 0,
      "broker": null,
      "markets": [],
      "external_account": {},
      "credential_ref": null,
      "created_at": "2026-09-27T22:22:30.889618+09:00"
     }
    ],
    "account.portfolios": [
     {
      "portfolio_id": "pf_u_90e97e1f00826fd7",
      "user_id": "u_90e97e1f00826fd7",
      "name": "default",
      "capital_allocation": 0,
      "risk_budget": {},
      "membership_version": 0,
      "created_at": "2026-09-27T22:22:30.889618+09:00"
     }
    ],
    "account.sleeves": [],
    "account.ledger": [
     {
      "entry_id": 1,
      "txn_id": "blog-a2-02-seed",
      "sleeve_id": null,
      "account_id": "acc_u_90e97e1f00826fd7",
      "book": "cash",
      "amount": 100000,
      "ccy": "USDT",
      "ref_kind": "blog_evidence_fixture",
      "ref_id": null,
      "created_at": "2026-09-27T22:22:30.892197+09:00"
     }
    ],
    "account.direction_leases": [],
    "account.reduce_reservations": [],
    "trading.intents": [],
    "trading.fills": [],
    "trading.order_transitions": []
   },
   "account_unchanged_vs_T0": true,
   "usage_ledger": {
    "forward.usage": [
     {
      "user_id": "u_90e97e1f00826fd7",
      "ym": "2026-09",
      "used": 2,
      "limit_n": 1000
     }
    ],
    "forward.usage_events": [
     {
      "id": 1,
      "order_id": "fto_d596594eb466f49167c7c19f0ea5",
      "user_id": "u_90e97e1f00826fd7",
      "ym": "2026-09",
      "delta": 1,
      "reason": "entry_accepted",
      "at": "2026-09-27T22:22:31.444998+09:00"
     },
     {
      "id": 2,
      "order_id": "fto_3e5910823bc53afa076e12172945",
      "user_id": "u_90e97e1f00826fd7",
      "ym": "2026-09",
      "delta": 1,
      "reason": "entry_accepted",
      "at": "2026-09-27T22:22:31.454876+09:00"
     },
     {
      "id": 3,
      "order_id": "fto_b2b711df924ac75c45499583ef9c",
      "user_id": "u_90e97e1f00826fd7",
      "ym": "2026-09",
      "delta": 1,
      "reason": "entry_accepted",
      "at": "2026-09-27T22:22:31.460839+09:00"
     },
     {
      "id": 4,
      "order_id": "fto_b2b711df924ac75c45499583ef9c",
      "user_id": "u_90e97e1f00826fd7",
      "ym": "2026-09",
      "delta": -1,
      "reason": "placement_rejected:market_closed",
      "at": "2026-09-27T22:22:32.289902+09:00"
     }
    ]
   }
  }
 ],
 "events": [
  {
   "at": "2026-09-27T13:22:31.458064+00:00",
   "what": "WELTIQ_MARKET_OPEN=us-equity 설정 (내부 검증용 강제 개방 — 방향 거절과 라이선스 거절을 분리하기 위해)"
  },
  {
   "at": "2026-09-27T13:22:33.480937+00:00",
   "what": "합성 호가 변경: binance-usdm BTCUSDT 50000/50001 → 48900/48901 (숏 목표가 49000 을 ask 가 통과하게 — 이 한 번의 변경 외에 호가는 고정이다)"
  }
 ]
}