# A축 반사실 측정 — 「주문하지 않기로 한 결정」을 실제로 내서 재기

## 환경 고지 (먼저 읽어 주세요)

| | |
|---|---|
| 무엇을 쟀나 | 도구가 `WAIT`·`HOLD`·`관망`·`NEUTRAL`·`BUY(게이트에 막힘)` 를 낸 그 종목·그 시점에 대해 **반사실 시험 주문을 실제로 내고** 체결·청산까지 추적했다 |
| DB | **격리 임시 PostgreSQL** (`/tmp/weltiq-cfa-*` 소켓 · 포트 55551 · DB `weltiq_cfa`). 운영 DB·운영 `.env`·실계좌·외부 거래소·배포를 쓰지 않았다. 돌고 있는 로컬 엔진(8722~8724)·DB `weltiq_r1_claude` 는 건드리지 않았다 |
| 시세 | **합성 호가**(`feed_source=cfa-counterfactual-fixture`). 각 값은 그 도구 기록에 적힌 가격대에서 가져왔고 근거를 값마다 적었다(`axis-a-evidence.json` → `setup.synthetic_quotes` · `setup.wave_quotes_btcusdt`) |
| 커밋 | `0431b2a966f5a2d1766f71f9ca74147d7076737d` |
| 실행 시각 | **2026-09-28 13:27 KST** 시작 (UTC 04:27:53) |
| API | `http://127.0.0.1:8911` · 월 한도 200 · 계정 `cfa@example.invalid` (pro) |
| 라이선스 | `krx`·`us-equity` = **open** (운영 실측 반영). `cme` = `license_pending` **그대로 두고 통제군으로만 썼다** |
| **손익은 시장 사실이 아니다** | 합성 호가에서 나온 숫자다. **재는 것은 배선과 판정 틀**이지 그 도구가 옳았다는 증거가 아니다. 이 문장은 아래 편마다 다시 붙는다 |

산출물: `run_axis_a.py`(하네스 — `--rescore` 로 저장된 원문에서 판정 칸만 다시 계산한다) · `axis-a-evidence.json`(케이스별 요청·응답·추적 원문) · 이 문서.

접수 16건(크립토 7 · 미국 주식 9) + 통제군 1건. 종료 2026-09-28 **14:08 KST**(UTC 05:08:00). 치명 오류 없음(`fatal: null`).

---

## 0. 판정 기준 — 재기 전에 먼저 적는다

합성 호가를 **그 도구가 기록한 가격에 고정**해 두고 600초 뒤 순손익을 본다. 고정 시장에서 순손익은 왕복 비용(스프레드 + 수수료 + 세금)과 정확히 같다. 따라서

- **순손익 < 0 → 그 관망은 옳았다.** 단 **「가격이 그 600초 동안 손익분기 거리보다 크게 움직이지 않았다면」이라는 조건부로만.**
- **손익분기 거리 = |순손익| ÷ 진입 금액.** 이 값이 이 반사실이 내놓는 **측정값**이다 — *"그 도구가 틀리려면 10분 안에 최소 X% 움직였어야 한다."*
- 순손익 ≥ 0 → 관망이 틀렸다. 고정 시장에서는 나오지 않는다(나오면 배선 오류다).

왜 이 기준인가: 관망은 "지금 들어갈 만한 우위가 없다"는 주장이다. 고정 시장에서 재면 **우위가 0일 때 얼마를 잃는지**가 나오고, 그게 곧 **그 도구가 틀리기 위해 필요했던 최소 움직임**이다. 방향으로 표류시키면 답을 내가 고르는 것이 되므로 호가를 흔들지 않았다.

### 0.1 이 회차의 큰 제약 — 미국 주식은 폐장이었다

실행 시각의 세션 실측(`setup.us_equity_session_at_start`):

```
venue=us-equity  local_time=2026-09-28T00:27-04:00  is_open=False  state=closed
next_open=2026-09-28T09:30-04:00   (= 22:30 KST)
```

**us-equity 케이스는 전부 `201` 로 접수됐지만 배치 단계에서 `close_reason = "rejected:market_closed"` 로 되돌아왔다.** 체결이 없으니 손익이 없고, 그 편들의 「관망이 옳았나」는 이 회차에서 **미판정**이다. 시각을 속여 돌리지 않았다 — 그렇게 얻은 체결은 실전 규칙을 통과한 체결이 아니다. 다시 재려면 22:30~05:00 KST 에 같은 하네스를 그대로 돌리면 된다.

24/7 인 `binance-spot` 케이스는 **체결·청산까지 실제로 갔다.** 다행히 이 회차에서 가장 값어치 큰 표본들(29A 의 확신도 네 값, 34 의 p_up 0.55, 31 의 HOLD, 12 의 Hold)이 전부 크립토 쪽에 있었다.

### 0.2 회차를 넷으로 나눈 이유

같은 BTC 인데 네 도구가 적어 둔 가격대가 다르다(85,465 / 84,940 / 81,527 / 84,138). 한 호가로 뭉개면 "그 도구 기록의 가격대 근처"라는 규칙이 깨진다. 그래서 **순차 회차**로 돌리고 회차 사이에만 호가를 바꿨다(회차 안에서는 고정). 변경은 `axis-a-evidence.json` → `events` 에 근거와 함께 남아 있다.

---

## 1. 29A MAHORAGA — 확신도가 붙은 관망 네 건

### 원 판정

| 종목 | 판정 | 확신도 | entry_quality | 출처 |
|---|---|---|---|---|
| BTC/USD | **WAIT** | 0.88 | poor | `reports/a/29-account-walls/RUN-LOG.md:148` |
| BTC/USD | **WAIT** | 0.90 | poor | `RUN-LOG.md:149` |
| BTC/USD | **WAIT** | 0.89 | poor | `RUN-LOG.md:150` |
| BTC/USD | **SKIP** | **0.20** | — | `RUN-LOG.md:158` (모델만 `openai/gpt-4o-mini` 로 바꾼 대조군) |
| GME | **WAIT** | 0.88 | poor | `raw/status_run1.json` `signalResearch.GME` · `RUN-LOG.md:170` |
| BB | **WAIT** | 0.89 | poor | `raw/status_run1.json` `signalResearch.BB` |
| BONK.X | **WAIT** | **0.95** | poor | `raw/status_run1.json` — **돌리지 못했다(아래)** |

원문 한 줄: *"At the supplied $23.49 price, there is insufficient evidence of an attractive entry. … Confidence reflects the case for waiting, **not a prediction of a price decline**."*

### 반사실 본문

이 도구는 **레벨을 내지 않는다**(`RUN-LOG.md:142` — 손절 5%·익절 10% 는 설정 상수이고 판단이 아니다). 그래서 규칙대로 **`exit_plan` 에 시한만** 줬다. 가격 조건을 지어내지 않았다.

```json
{"venue": "binance-spot", "symbol": "BTCUSDT", "side": "long",
 "exit_plan": {"close_after_seconds": 600},
 "tags": ["counterfactual", "part-29A"],
 "metadata": {"verdict": "WAIT", "confidence": "0.88",
              "source": "reports/a/29-account-walls/RUN-LOG.md:148", …}}
```

**방향을 왜 롱으로 골랐나** — `WAIT`·`SKIP` 은 둘 다 "사지 마라"이므로 그 반대는 사는 것이다. **숏은 내지 않았다**: 도구가 원문으로 못 박았다 — *"not a prediction of a price decline"*. 하락을 시사하지 않은 판정에 숏을 붙이면 그건 반사실이 아니라 창작이다.

### 응답·추적 결과

BTC/USD 네 건 전부 `201` → 체결 → 600초 시한 청산.

| 케이스 | 확신도 | 진입가 | 청산가 | close_reason | 수수료 | 순손익 | 손익분기 |
|---|---|---|---|---|---|---|---|
| WAIT | 0.88 | 85474.04645 | 85454.95355 | `close_after` | 0.01367432 | **−0.0152017520** | **0.2223%** |
| WAIT | 0.90 | 85474.04645 | 85454.95355 | `close_after` | 0.01367432 | −0.0152017520 | 0.2223% |
| WAIT | 0.89 | 85474.04645 | 85454.95355 | `close_after` | 0.01367432 | −0.0152017520 | 0.2223% |
| **SKIP** | **0.20** | 85474.04645 | 85454.95355 | `close_after` | 0.01367432 | **−0.0152017520** | **0.2223%** |

(진입 금액 6.8379237160 USDT · 수량 0.00008 BTC. `exit_trigger = close_after` · `exit_trigger_px = null` — 시한 청산은 발동가가 없다.)

GME·BB 는 `201` 접수 후 `rejected:market_closed`. **미판정.**

### 「관망이 옳았나」

**옳았다 — 조건부로.** 기준대로: 순손익이 음수이므로, **BTC 가 그 10분 동안 0.2223% 넘게 오르지 않았다면** 그 관망은 옳았다. 뒤집어 말하면 *이 도구가 틀리려면 10분 안에 최소 0.2223% 올랐어야 한다.*

**합성 호가라 이 손익은 시장 사실이 아니다** — 재는 것은 배선과 판정 틀이지 그 도구가 옳았다는 증거가 아니다.

### 돌리지 못한 것

- **BONK.X (확신도 0.95, 이 회차 최고값).** 반사실을 가격에 붙일 수 없었다. 도구 원문이 *"A displayed price of $0 is likely rounded or invalid and cannot establish an entry valuation"* 라고 적었다 — 기록에 쓸 가격이 없다. 임의 가격을 넣으면 반사실이 아니라 창작이다. **가장 확신했던 관망이 표본에서 빠지는 것**이 이 회차의 한계다.

---

## 2. 25 daily_stock_analysis — 판정 `관망`

### 원 판정

`reports/a/25-daily-stock-analysis/raw/levels-verbatim.txt` (일괄 분석 1회차, 2026-09-22 12:15:36 KST):

```
symbol: NVDA
decision_type: hold      operation_advice: 관망     confidence_level: 중간
ideal_buy: 219.01   secondary_buy: 219.16   stop_loss: 218.9   take_profit: 230.0
```

근거 숫자(`RUN-LOG.md:123`): 종가 **227.38** · MA5 219.01 · MA20 219.36 · 이격 **+3.82%** · MACD DIF 1.4828 **<** DEA 1.5377 · 저항 234.50. **5회 독립 판단이 전부 hold/관망**(`RUN-LOG.md:125`).

### 반사실 본문 — 두 건

**롱** — 도구는 "219.01 까지 내려오면 사라, 지금(227.38)은 아니다"라고 했다. 그 반대로 **지금 시장가로 산다.** 청산 조건은 도구의 전용 DB 칸 값 그대로:

```json
{"symbol": "NVDA", "side": "long",
 "exit_plan": {"stop_loss": "218.90", "take_profit": "230.00", "close_after_seconds": 600}}
```

**숏** — 이 도구는 **명시적으로 하락을 시사했다**(MACD 데드크로스 · 역배열 · MA5 대비 +3.82% 이격 · "추격 금지: 5일선 대비 +5% 초과 시 매수 안 함"). 29A 와 달리 "하락 예측이 아니다"라는 유보가 없다. 그래서 숏을 따로 한 건 냈다. 목표·손절 둘 다 도구가 낸 숫자이고 **역할만 뒤집었다**:

```json
{"symbol": "NVDA", "side": "short",
 "exit_plan": {"take_profit": "219.01", "stop_loss": "234.50", "close_after_seconds": 600}}
```

(`219.01` = 도구의 `ideal_buy`/MA5 = 도구가 지목한 눌림 도착점. `234.50` = 도구의 저항, 채팅 3/3 동일.)

### 응답·추적 결과

둘 다 `201`. 그 뒤 **`rejected:market_closed`** — 체결 없음, 수수료 0, 순손익 없음.

### 「관망이 옳았나」

**미판정.** 미국 주식 폐장이라 반사실이 체결되지 않았다. 22:30 KST 이후 같은 하네스를 다시 돌리면 같은 기준으로 판정된다.

**합성 호가라 이 손익은 시장 사실이 아니다** — 재는 것은 배선과 판정 틀이다.

### 이 회차에서 드러난 것 하나

25 의 레벨은 **진입가로 옮기면 주문 세트가 성립하지 않는다** — `ideal_buy` 219.01 과 `stop_loss` 218.90 이 0.05% 떨어져 있고, 2회차에서는 손절(219.36)이 매수가(219.01)보다 **위**로 올라왔다(`docs/tutorials/a/25-daily-stock-analysis.md:184`). 그런데 **반사실로 쓰면 성립한다** — 진입을 현재가(227.30)로 잡는 순간 218.90 은 손절로, 230.00 은 목표로 제자리를 찾는다. **같은 숫자가 이관에서는 못 쓰이고 반사실에서는 쓰인다.**

---

## 3. 31 AlpacaTradingAgent — HOLD 인데 레벨은 다 낸다

### 원 판정

`raw/nvda-2.json` `final_trade_intent` (3판 전부 동일, `RUN-LOG.md:124-126`):

```
action: HOLD    target_position: NEUTRAL    order_intent.order_type: none
advisory_rating: Hold    confidence: medium
risk_controls.stop_loss_price: 220.92    risk_controls.take_profit_price: 234.75
```

`raw/btc-2.json` (BTC/USD, 같은 형식):

```
action: HOLD    target_position: NEUTRAL    order_type: none
risk_controls.stop_loss_price: 84800.0    take_profit_price: 88500.0
entry guidance: "no immediate entry. Consider a small staged entry only after a confirmed
                 4-hour reclaim and retest above $86,000, or a validated pivot hold above $84,940"
```

### 반사실 본문

**이 편이 여섯 중 가장 깔끔하다.** 도구가 "주문 없음(`order_type: none`)"이라고 하면서 손절·목표를 **절대값으로 다 냈다.** 그 레벨을 그대로 쓰고 방향만 채우면 반사실이 완성된다 — **변환도 지어낸 값도 없다.**

```json
{"venue": "binance-spot", "symbol": "BTCUSDT", "side": "long",
 "exit_plan": {"stop_loss": "84800", "take_profit": "88500", "close_after_seconds": 600}}
```

**방향 근거**: 레벨 배치 자체가 롱이다(손절 220.92 < 종가 227.30 < 목표 234.75 / 84,800 < 84,940 < 88,500). 숏으로 뒤집으면 도구가 낸 배치가 깨진다. 하락을 시사한 문장도 없다 — nvda-3 의 *"the proposed pullback setup offers only about 1.7:1 reward-to-risk, below the required minimum"* 은 **보상이 작다**는 말이지 떨어진다는 말이 아니다. **그래서 숏을 내지 않았다.**

### 응답·추적 결과

| 케이스 | 응답 | 진입가 | 청산가 | close_reason | 수수료 | 순손익 | 손익분기 |
|---|---|---|---|---|---|---|---|
| BTC (btc-2 HOLD) | `201` | 84949.99405 | 84931.00595 | `close_after` | 0.01359048 | **−0.0151095280** | **0.2223%** |
| NVDA (nvda-2 HOLD) | `201` | — | — | `rejected:market_closed` | 0 | — | 미판정 |

도구의 손절 84,800·목표 88,500 은 **10분 창에서 한 번도 닿지 않았다**(호가 84,940 고정, 손절까지 −0.165% · 목표까지 +4.2%).

### 「관망이 옳았나」

**BTC 쪽은 옳았다 — 조건부로.** BTC 가 10분 동안 0.2223% 넘게 오르지 않았다면 그 HOLD 는 옳았다. **NVDA 쪽은 미판정**(폐장).

**합성 호가라 이 손익은 시장 사실이 아니다** — 재는 것은 배선과 판정 틀이다.

---

## 4. 12 TradingAgents — 「계속 들고 있을까」를 재판정하는 유일한 편

### 원 판정

`reports/b/01/21-tradingagents-decision.json:10` → `"decision": "Hold"`.
`reports/b/01/21-tradingagents-reports/reports/BTC-USD_20260921_165229/5_portfolio/decision.md`:

```
**Rating**: Hold
"…do not add at the current 81,526.82 level beneath the 82,253.84–83,000 resistance zone."
"Treat a sustained close below 78,473.91 as a reason to reduce risk…"
**Price Target**: not provided        **Time Horizon**: 3-6 months
```

(같은 설정 13판 재실행에서는 **Hold 0/13** · Sell 7 · Underweight 6 — `reports/a/12-tradingagents/RUN-LOG.md:39`.)

### 반사실 본문

Hold 는 "팔지도 사지도 마라"이고, 이 도구가 **구체적으로 금지한 행동은 "지금 추가하는 것"**이다. 그 금지된 행동을 그대로 한다 — 81,526.82 에 추가 매수.

```json
{"venue": "binance-spot", "symbol": "BTCUSDT", "side": "long",
 "exit_plan": {"stop_loss": "78473.91", "take_profit": "83000", "close_after_seconds": 600}}
```

**레벨 처리를 정직하게 적는다**: 도구는 이 둘을 stop/target 이라고 **부르지 않았다**(`Price Target: not provided`). 도구가 이름 붙인 두 수준 — "reason to reduce risk" 78,473.91 과 저항대 상단(돌파 확인선) 83,000 — 을 exit_plan 으로 옮긴 것이고, **역할 배정은 하네스 판단**이다. 숫자 자체는 원문 그대로다.

**숏을 내지 않은 이유**: 이 도구의 중기 방향은 *"constructive medium-term trend"* 로 상승이다. 78,473.91 아래는 "위험 축소" 신호이지 하락 주장이 아니다.

### 응답·추적 결과

| 케이스 | 응답 | 진입가 | 청산가 | close_reason | 수수료 | 순손익 | 손익분기 |
|---|---|---|---|---|---|---|---|
| BTC Hold → 추가 매수 | `201` | 81535.65265 | 81517.34735 | `close_after` | 0.01304424 | **−0.0145086640** | **0.2224%** |

### 「관망이 옳았나」

**옳았다 — 조건부로.** BTC 가 10분 동안 0.2224% 넘게 오르지 않았다면 "지금 추가하지 마라"는 옳았다. 이 편의 값어치는 숫자가 아니라 **"보유 유지" 판정이 반사실로 번역된다는 것**이다 — Hold 를 "지금 추가"와 "지금 청산" 두 반사실로 쪼개면, 지금은 평가되지 않는 판정이 측정 대상이 된다. (이 회차는 "지금 추가" 쪽만 냈다. 청산 쪽은 보유 포지션이 있어야 성립한다.)

**합성 호가라 이 손익은 시장 사실이 아니다** — 재는 것은 배선과 판정 틀이다.

---

## 5. 27 AI Trading Analyst — 여기엔 진짜 `AVOID` 가 없다

### 원 판정 — 먼저 정정한다

과제가 지목한 `LONG`/`SHORT`/**`AVOID`** 삼분 중 AVOID 기록을 찾았는데, **이 도구가 실제로 낸 AVOID 판단은 없다.** 원자료에서 `AVOID` 가 나오는 곳은 두 군데뿐이다:

1. `raw/13-slash-dispatch-stream.jsonl` 등 — SKILL.md 의 **서식 자리표시자** `DIRECTION: <LONG / SHORT / AVOID>`. 판단이 아니다.
2. `RUN-LOG.md:88` — *"AAPL · Trade Score 0/100 · Grade F · Signal AVOID"*. 이건 **스키마 버그의 산물**이다. SKILL.md 가 시키는 대로 만든 페이로드를 PDF 스크립트에 넣으면 스크립트가 못 찾은 키를 조용히 기본값으로 바꾼다(`data.get("ticker","AAPL")`, `data.get("overall_score", 0)`). 즉 티커도 점수도 **도구의 판단이 아니라 기본값**이다.

**그래서 AVOID 로 반사실을 만들지 않았다.** 대신 이 도구가 실제로 낸 「주문하지 않기로 한 결정」을 썼다 — **3/3 회 모두 "지금 사라"가 아니었다**(`RUN-LOG.md:232`):

| | 방향 | 진입 | 손절 | T1 | 주수 | 기간 |
|---|---|---|---|---|---|---|
| r1 | LONG | **222.60** | 211.00 | 235.75 | 22 | 3–6개월 |
| r2 | LONG | **217.65** | 204.40 | 233.00 | 22 | 3–6개월 |
| r3 | LONG | **217.65** | 208.00 | 233.00 | 22 | 2–4개월 |

진입가가 **셋 다 마지막 종가 227.30 아래**다. 눌림 대기 주문 = **지금은 주문하지 않기로 한 결정**이다.

### 반사실 본문 — 두 건

**롱** — "지금 말고 222.60 까지 눌리면 사라"의 반대. 종가에 지금 산다. 손절·목표는 r1 기록 그대로:

```json
{"symbol": "NVDA", "side": "long",
 "exit_plan": {"stop_loss": "211.00", "take_profit": "235.75", "close_after_seconds": 600}}
```

**숏** — 도구가 기다린 그 눌림(227.30 → 222.60)을 숏으로 산다. 목표는 도구의 진입가, 손절은 도구의 T1:

```json
{"symbol": "NVDA", "side": "short",
 "exit_plan": {"take_profit": "222.60", "stop_loss": "235.75", "close_after_seconds": 600}}
```

**방향 근거**: 3/3 회 종가보다 낮은 진입가를 냈다 = **단기 하락을 명시적으로 기대**했다. 다만 이 도구의 중기 방향은 LONG 이므로, 이 숏은 도구의 **방향 판정이 아니라 타이밍 판정**을 재는 것이다. 그 구분을 케이스 `why_side` 에 적어 뒀다.

### 응답·추적 결과

둘 다 `201` → **`rejected:market_closed`**. 체결 없음.

### 「관망이 옳았나」

**미판정**(폐장). 다만 이 편에서 **틀이 하나 새로 섰다**: 레벨형 도구는 방향만이 아니라 **진입가**로도 "지금은 아니다"를 말한다. 그 진입가와 현재가 사이의 거리가 그 도구의 **대기 폭**이고, 반사실은 그 폭이 실제로 벌렸어야 할 값인지를 잰다. 27 의 대기 폭은 −2.07%(227.30→222.60)이고, 왕복 비용(us-equity 는 수수료 0 + 매도세 0.00206%)은 그보다 두 자릿수 작다 — **비용이 대기 폭보다 훨씬 작으므로, 이 도구의 "기다림"은 비용으로 정당화되지 않는다. 눌림이 실제로 왔는지로만 정당화된다.**

**합성 호가라 이 손익은 시장 사실이 아니다** — 재는 것은 배선과 판정 틀이다.

---

## 6. 34 orallexa — 확률이 붙은 관망, 그리고 게이트가 막은 주문

### 원 판정

`raw/probe-basket.json` 16종 일괄(2026-09-24). 판정 분포 **BUY 5 · SELL 1 · WAIT 10**.

| 종목 | 판정 | `probabilities.up` | down | 화면 확신도 |
|---|---|---|---|---|
| NVDA | **WAIT** | **0.40** | 0.25 | 42.6 |
| AAPL | WAIT | 0.45 | 0.25 | 42.6 |
| QQQ | WAIT | 0.35 | 0.35 | 42.6 |
| META | WAIT | 0.25 | **0.45** | 42.6 |
| MSFT | **BUY** | **0.55** | 0.17 | 50.8 |
| BTC-USD | **BUY** | **0.55** | 0.20 | 50.8 |

그리고 **게이트가 주문을 막은 기록**(`raw/pilot-gate60.txt`):

```
DECISION MSFT decision=BUY confidence=50.8% risk=MEDIUM elapsed=4.1s
SKIP MSFT — confidence 50.8% below gate 60.0%
PILOT_DONE trades=0 decisions=1
```

BTC-USD 쪽은 레벨까지 있다(`raw/btc-decision.json`): `yf_entry_price` 84138.4609375 · `risk_module.stop_loss_price` 82034.9994 · `take_profit_price` 88345.384 · `approved: true`.

### 반사실 본문 — 세 건

1. **NVDA WAIT p_up 0.40** — 레벨이 없으니 시한만. `{"close_after_seconds": 600}`
2. **MSFT BUY p_up 0.55, 게이트에 막힘** — **「주문하지 않기로 한 결정」의 가장 순수한 표본**이다. 판단은 BUY 인데 확신도 게이트가 막았다. 재는 것은 도구의 판단이 아니라 **게이트가 옳았는지**다. 레벨 없음(실주문 로그가 `stop=$0.00, target=$0.00`).
3. **BTC-USD BUY p_up 0.55, 게이트에 막힘 + 도구 레벨** — 도구 자신의 손절·목표를 그대로 건다.

레벨 원값은 틱을 통과하지 못한다(통제군으로 그대로 보냈다):

| 케이스 | 본문 | 응답 |
|---|---|---|
| `P34-BTC-RAW` | `stop 82034.9994 / target 88345.384` (원값) | **422** (틱 0.01) |
| `P34-BTC` | `stop 82035.00 / target 88345.38` | `201` |

반올림 방향을 적는다: 손절은 **올림**(82034.9994→82035.00), 목표는 **버림**(88345.384→88345.38). 롱 기준으로 손절을 올리면 더 가깝고 목표를 내리면 더 가깝다 — **양쪽 다 보수적**이다.

**숏을 내지 않은 이유**: 세 건 다 `p_up > p_down` 이다. 하락을 시사한 WAIT 은 따로 있다(META 0.25/0.45 · AMD 0.25/0.45 · PLTR 0.30/0.42) — **그런데 34 의 기록 어디에도 그 세 종목의 가격이 없다.** "그 도구 기록의 가격대 근처"라는 규칙을 지킬 수 없어 **돌리지 않았다**(`axis-a-evidence.json` → `not_run`).

### 응답·추적 결과

| 케이스 | p_up | 응답 | 진입가 | 청산가 | close_reason | 수수료 | 순손익 | 손익분기 |
|---|---|---|---|---|---|---|---|---|
| BTC (BUY, 게이트에 막힘) | 0.55 | `201` | 84147.91385 | 84129.08615 | `close_after` | 0.01346216 | **−0.0149683760** | **0.2224%** |
| NVDA (WAIT) | 0.40 | `201` | — | — | `rejected:market_closed` | 0 | — | 미판정 |
| MSFT (BUY, 게이트에 막힘) | 0.55 | `201` | — | — | `rejected:market_closed` | 0 | — | 미판정 |

### 「관망이 옳았나」

**BTC 쪽은 옳았다 — 조건부로.** 기준대로: 순손익이 음수이므로, **BTC 가 그 10분 동안 0.2224% 넘게 오르지 않았다면** 그 게이트(그리고 그 게이트가 막은 BUY)는 옳았다. 뒤집어 말하면 *이 판단이 값어치를 내려면 10분 안에 최소 0.2224% 올랐어야 한다.* 도구의 손절 82,035·목표 88,345.38 은 10분 창에서 닿지 않았다(진입 84,147.91 기준 −2.51% / +4.99%). **NVDA·MSFT 쪽은 미판정**(폐장).

여기서 한 가지 더 나온다 — 도구가 `risk_reward_ratio: 2.0` 으로 잡은 그 폭(손절 −2.5% · 목표 +5.0%)은 **10분 창에 전혀 맞지 않는다.** 이 도구의 레벨은 일 단위 지평선을 전제로 하고, 관망의 「지금」을 재는 10분 창과는 시간 척도가 다르다. 반사실 시한을 도구의 지평선에 맞춰 따로 한 벌 더 내는 것이 다음 회차의 과제다.

**합성 호가라 이 손익은 시장 사실이 아니다** — 재는 것은 배선과 판정 틀이다.

---

## 7. 꼭 답할 것 세 가지

### 7.1 확신도별로 갈리나?

**이 회차에서는 갈리지 않았고, 갈릴 수가 없었다.** 29A 의 네 건(WAIT 0.88·0.90·0.89 + SKIP 0.20)은 순손익이 **소수점 끝까지 같다**: `−0.0152017520`, 손익분기 `0.2223%`.

이유는 명백하다 — **네 건을 같은 시각에 같은 호가로 냈기 때문**이다. 고정 시장에서 손익은 확신도가 아니라 **왕복 비용**이 결정한다. 이건 실패가 아니라 **틀이 서면서 드러난 제약**이고, 다음 회차 설계를 결정한다:

> **확신도-결과 상관을 재려면 반사실을 「판정이 난 그 시각·그 가격」에 내야 한다. 나중에 한 회차로 몰아 내면 확신도는 사라지고 비용만 남는다.**

즉 이 기능이 값어치를 내려면 **도구가 관망을 낸 순간에 자동으로 반사실 주문이 나가야 한다**(사후 배치 재현이 아니라). 4건짜리 표본으로 통계는 못 내지만, **틀이 요구하는 조건은 이번에 정확히 드러났다.**

덧붙여, 29A 의 확신도는 애초에 상관을 재기 어려운 값이다 — `RUN-LOG.md:162` 가 이미 적었다: 같은 시장·같은 프롬프트에서 같은 결론("사지 마라")을 내면서 확신도가 0.88~0.90 대 0.20 으로 갈렸다. **그 차이는 도구가 아니라 모델의 성질이다.** 반사실로 재도 이 오염은 그대로 넘어온다. 회차마다 모델을 고정·기록해야 한다.

### 7.2 34 의 p_up 0.55 는 Brier 채점에 들어가는가 — 계약상 가능한가

**세 층으로 나뉜다.**

**(ㄱ) 게이트에 막힌 BUY 는 이미 채점 대상이다.** 34 는 `decision_log` 에 판단을 남기고 Brier 감사는 그 로그를 읽는다 — 주문이 나갔는지는 보지 않는다. `raw/brier-scored.json` 의 9개 BUY 행 중 8개가 `"scored": null` 인데, 이유는 게이트가 아니라 **하루가 안 지나서**다. 그래서 **MSFT·BTC 의 p_up 0.55 는 계약상 이미 들어간다.** 반사실 시험 주문은 여기서 `actual` 을 **더 빨리·더 싸게** 주는 경로다(10분 창 + 실물 비용 포함).

**(ㄴ) WAIT 행은 지금은 못 들어간다. 반사실이 그 문을 연다.** `RUN-LOG.md:214` — 20행 중 **WAIT 11행은 "방향 주장이 없어 채점 대상 아님"**이다. 그런데 그 행들도 `probabilities.up` 을 **가지고 있다**(NVDA 0.40 · AAPL 0.45 · QQQ 0.35 …). 즉 **빠진 것은 확률이 아니라 방향뿐**이고, 반사실 시험 주문이 정확히 그 방향을 공급한다. `forecast_p = probabilities.up`(`brier_audit.py:301`)은 그대로 쓰고, `actual` 은 반사실의 순손익 부호로 채우면 된다. **표본이 20행에서 31행으로, 즉 55% 늘어난다.**

**(ㄷ) 그런데 계약이 두 군데서 막는다 — 둘 다 이번에 실측했다.**

1. **weltiq 쪽**: `metadata` 에 **float 을 넣으면 500 이다.** `canonical_json` 이 결정론 규칙으로 float 을 거부한다(`weltiq/core/canonical.py:18` — *"float 금지 — Decimal 또는 str을 사용 (결정론)"*). 1차 시도에서 확신도 `0.88` 을 숫자로 실었다가 8건이 전부 500 이 났고, 문자열로 바꿔 통과시켰다. **확률을 1급 수치로 싣고 Brier 를 서버에서 계산하려면 `metadata` 가 아닌 전용 칸(Decimal)이 필요하다.** `metadata` 는 해시되는 계약 본문이라 여기에 숫자를 넣는 설계 자체가 부딪힌다.
2. **34 쪽**: 신뢰도 구간 표의 **최저 버킷이 `50-60%`** 다(`brier_audit.py:390`). WAIT 행의 p_up 0.40·0.45·0.35 는 **떨어질 칸이 없다.** 그리고 Platt 보정은 **30관측 이상**을 요구한다(*"Need at least 30 observations, got 1"*). 반사실로 표본을 늘리는 것이 바로 이 30 을 채우는 길이지만, **버킷 하한을 0 까지 내리는 수정이 선행**해야 한다.

**결론: 계약상 가능하다. 단 weltiq 쪽에 확률 전용 수치 칸이 있어야 하고, 34 쪽 버킷 하한을 내려야 한다.** 둘 다 작은 수정이고, 그 전까지는 문자열 `metadata` + 바깥 채점으로 우회할 수 있다.

### 7.3 관망이 옳았던 것으로 나온 편

**측정된 세 편(29A·31·12)은 전부 「옳았다 — 조건부로」로 나왔다.** 이건 도구를 띄우는 결과가 아니다. 고정 시장에서는 **구조적으로 그렇게 나오게 되어 있다** — 우위가 0이면 왕복 비용만큼 진다. 그래서 이 결과에서 읽어야 할 것은 "도구가 옳았다"가 아니라 **문턱**이다:

| 거래소 | 왕복 비용(실측) | 그 도구가 틀리려면 필요했던 10분 움직임 |
|---|---|---|
| `binance-spot` (taker 0.1% × 2) | 0.2223~0.2224% | **약 0.222%** |
| `us-equity` (수수료 0 · 매도세 0.00206%) | 이 회차 미측정(폐장) | 크립토보다 **두 자릿수 작다** |

읽는 법: **크립토에서 10분짜리 관망은 0.22% 만 움직이면 틀린다.** 비트코인 10분 변동으로 0.22% 는 드물지 않다 — 즉 이 도구들의 관망은 **비용으로 보호받는 폭이 매우 얇다**. 반대로 미국 주식은 왕복 비용이 거의 0이라, **거기서의 "기다림"은 비용으로 정당화되지 않고 오직 가격이 실제로 눌렸는지로만 정당화된다**(§5 참조). **거래소가 바뀌면 관망의 값어치가 바뀐다**는 것이 이 회차의 가장 실용적인 발견이다.

---

## 8. 부수 실측 — 계약·안전

| 확인 | 결과 |
|---|---|
| 계좌 원장 무영향 | `T8.account_unchanged_vs_T0` = `true` (`account.*` 9개 표 전수 비교) |
| `cme` 라이선스 | `license_pending` **그대로**. 통제군 `X-CME` 는 `422` (`market_license_effective.cme`) |
| 월 한도 | 접수 16건인데 `used` 는 **7** (`remaining` 193). 7 = 실제로 체결된 크립토 진입 수와 정확히 같다 — **`rejected:market_closed` 9건은 전부 환불됐다** |
| 접수 거절 감사 | `T9-rejections` 에 `422` 건이 남는다 |
| `metadata` float | **500** — `canonical_json` 이 거부(§7.2) |
| 500 이 나도 시험은 남는다 | 1차 시도(같은 하네스, `metadata` 에 float)에서 500 이 난 8건이 DB 에 `status=running` 으로 **남아 있는 것을 `psql` 로 직접 확인했다.** `POST /v1/trial-buys` 독스트링은 *"실패하면 고아 시험도 중복 차감도 남지 않는다"*(`weltiq/api/forward_tests.py:203`)고 적혀 있다 — **해시 단계 예외에는 그 보장이 안 걸리는 것으로 보인다.** 그 임시 DB 는 정리됐으므로 **이 회차 `axis-a-evidence.json` 에는 그 8행이 없다.** 재현해서 별건으로 볼 것 |

---

## 9. 레시피 표 — 관망을 반사실로 바꾸는 법

| 편 | 무엇을 관망했나 | 어떻게 반사실을 정의했나 | 무엇이 측정되나 | 이 도구에 왜 값어치 있나 |
|---|---|---|---|---|
| **29A MAHORAGA** | BTC/USD `WAIT` ×3 (0.88·0.90·0.89) · `SKIP` (0.20) · GME/BB `WAIT` | 롱 진입 + **시한만**(레벨을 안 내는 도구라 가격 조건을 지어내지 않음). 숏 없음 — 원문이 *"not a prediction of a price decline"* | 관망의 **문턱**: 0.2223% (이 도구가 틀리려면 10분 안에 필요했던 움직임) | 이 도구의 유일한 정량 산출이 **확신도**인데 지금은 채점 대상이 아니다. 반사실이 그 확신도에 결과를 붙인다 — **단 판정 시각에 내야 한다**(§7.1) |
| **25 daily_stock_analysis** | NVDA `관망`(hold), 5/5 일관. 레벨 네 칸 전부 있음 | 롱 = "219.01 기다리지 말고 지금 227.38 에 사고 도구의 stop 218.9 / tp 230.0 을 건다". 숏 = 도구가 지목한 눌림(227.38→219.01)을 사고 도구의 저항 234.50 을 손절로 | 대기의 값어치 + **도구 레벨 배치가 주문으로 성립하는지** | 이관에서는 못 쓰는 숫자다(ideal_buy 219.01 과 stop 218.90 이 0.05% 차, 2회차엔 역전). **반사실로 쓰면 성립한다** — 진입을 현재가로 옮기는 순간 제자리를 찾는다 |
| **31 AlpacaTradingAgent** | NVDA ×3 · BTC ×2 `HOLD`/`NEUTRAL`, `order_type: none` — **그런데 손절·목표를 절대값으로 낸다** | 도구 레벨을 **그대로** 쓰고 방향만 채움. 변환 0 · 창작 0 | 도구가 낸 레벨 배치가 **실물 비용 위에서 살아남는지** | **여섯 중 가장 깔끔한 반사실.** "주문 없음"과 "완전한 레벨"이 한 객체에 같이 있다 — 이 도구는 반사실을 내려고 만들어진 것처럼 생겼다 |
| **12 TradingAgents** | BTC-USD `Hold` — *"do not add at the current 81,526.82 level"* | **금지된 행동을 그대로 한다**(지금 추가 매수). 도구가 이름 붙인 두 수준을 exit_plan 으로(역할 배정은 하네스 판단, 원문 `Price Target: not provided`) | "보유 유지" 판정의 값어치 | **유일하게 「계속 들고 있을까」를 재판정하는 편.** Hold 를 "지금 추가"/"지금 청산" 두 반사실로 쪼개면 평가되지 않던 판정이 측정 대상이 된다 |
| **27 AI Trading Analyst** | **AVOID 는 진짜 기록이 없다**(자리표시자 + 스키마 버그). 실제 관망은 **진입가가 3/3 회 종가 아래** = 눌림 대기 | 롱 = 기다리지 않고 종가에 지금 산다(도구 stop/T1 그대로). 숏 = 도구가 기다린 눌림 구간(227.30→222.60)을 산다 | **대기 폭**(−2.07%)이 실제로 벌렸어야 할 값인지 | 레벨형 도구는 **진입가로도 "지금은 아니다"를 말한다.** 방향만 보면 이 관망은 안 보인다 |
| **34 orallexa** | `WAIT` 10건(p_up 0.35~0.45) + **게이트가 막은 `BUY`** 2건(p_up 0.55) | 롱 + 도구 레벨(BTC) 또는 시한만(NVDA·MSFT). 하락 시사 WAIT 3종은 **가격 기록이 없어 미실행** | 게이트가 옳았는지 · p_up 의 Brier 적격성 | **Brier 표본을 20행 → 31행으로 늘리는 유일한 길.** WAIT 행에 빠진 것은 확률이 아니라 **방향**이고, 반사실이 그것만 공급한다(§7.2) |

---

## 10. 종전 이관 검증에서 뒤집히는 판정

먼저 확신도 표기를 하나 정정한다. part4 는 29A 의 WAIT 3건을 **0.88·0.89·0.95** 로 적었는데, 그 셋은 `signalResearch` 의 **주식 경로**(GME 0.88 · BB 0.89 · BONK.X 0.95)다. **크립토 경로(BTC/USD)의 3회 일관성 표는 0.88·0.90·0.89** 이고(`RUN-LOG.md:148-150`), SKIP 0.20 도 크립토 경로다. 이 회차는 둘을 나눠 다뤘다 — 크립토는 24/7 이라 측정됐고 주식은 폐장이라 미판정이다.

`reports/a2/03-tool-transfer/part4.md:37,54-62` 는 29A 를 **FAIL** 로 적었다 — 근거는 "방향·레벨·시한 어느 것도 기록에 없어서 side=long 을 하네스가 지어내야 했다"였다.

**그 판정을 이 회차가 뒤집는다.** 이관 관점에서는 없는 값을 채우는 것이 맞았다. **반사실 관점에서는 방향을 넣는 것이 지어내는 것이 아니라 반사실을 정의하는 것**이고, 그게 이 기능의 용도다. 29A 는 `WAIT` 에 **확신도가 붙어 있어** 오히려 반사실 표본으로서 여섯 편 중 가장 값어치가 크다(§7.1 이 요구하는 조건만 갖추면).

같은 이유로 part4 가 "보강(synthesized)"으로 깎아 적은 것들 중 다음이 **보강이 아니라 정의**로 승격된다:

| part4 의 표기 | 이 회차의 표기 |
|---|---|
| 29A `side=long` — "지어냈다" | **반사실 정의** — `WAIT` 의 반대는 사는 것이다 |
| 31 `side=long` — "기록 action 은 HOLD 라 방향이 아니다" | **반사실 정의** — 레벨 배치(stop < 현재가 < target)가 방향을 이미 말하고 있다 |
| 34 INTC `side=short` — "decision SELL → short (기록)" | 유지. 다만 **INTC 가격이 기록에 없다**는 part4 의 지적은 이 회차에서도 그대로여서 34 의 하락 쪽 반사실은 **여전히 못 냈다** |

**뒤집히지 않는 것**: part4 가 적은 "us-equity 는 폐장이라 접수까지만 확인됐다"는 이 회차에서도 **그대로다.** 여섯 편 중 네 편(25·27·31-NVDA·34-NVDA/MSFT)의 「관망이 옳았나」는 **미판정**이고, 22:30~05:00 KST 재실행이 필요하다.
