# QA-123 WASD 이동 중 키 입력 무효 — 자체 측 진단 (2026-05-27)

**협업자 발행**: 2026-05-27 r131 (v0.1.440 QC 전수 검토 결과)
**긴급도**: 🟡 중 (UX 거슬림, 동작 가능)
**자체 측 진단 cycle**: 본 cap (자율 ~35 cycle)
**관련 작업**: STD-0005 입력 격리 정책 부작용 추정 1순위

## 협업자 보고 본문

> WASD 이동 중 키 입력 무효 구간 (전 모드 — v0.1.440 발견, ORDER-004 spot-check 중)
> Player.log focus-dummy 중복 등록 (child[1] 정상 + child[5] NaN) → STD-0005 입력 격리 정책 부작용 추정 1순위 + v0.1.389~440 3 빌드 비교로 회기 도입 시점 v0.1.389 이전 확정

## 자체 측 root cause 진단 후보

### 1. `Factory00Bootstrap.cs` L4552-4556 — focus-dummy polling Update 코드

```csharp
// 24oo — 사용자가 명시적 search click 안 한 상태에서 search focus 회귀하면 매 frame 강제 blur + dummy 재focus.
//   stepping #1·#2·#3·#4 root cause: Unity UI Toolkit이 매 frame 첫 focusable에 자동 focus 줘서 BindUI 1회 Blur 무력화.
if (!_userClickedSearch && _focusDummy != null && IsAnyTextFieldFocused())
{
    _searchHost?.Blur();
    _focusDummy.Focus();
}
```

### 영향 path

- WASD 이동 중 우연히 TextField focus 들어간 상태 (예: ESC 1회 안 닫힘 + 다른 영역 click)
- `_userClickedSearch = false` (사용자가 search 직접 click 안 함)
- 매 frame `IsAnyTextFieldFocused()` true → `_focusDummy.Focus()` 호출
- focus 교체 매 frame 반복 → 키보드 입력 dispatch 무효 (UI Toolkit focus 변동 시 KeyDown event 소실)

### 회기 도입 시점 확정

- 본 코드 = **24oo (v0.1.024 추정, 24nn 시점)** — v0.1.389 이전 영역 일치 (협업자 보고와 정합)
- 이후 사이클에 `IsAnyUIFocused` 헬퍼 신설 (v0.1.420, 57th seal 포커스 기조) — 본 polling 코드는 옛 path 잔존

## 2. root child 등록 순서 (QA-124 관련, child[5] NaN)

| index | element | name | width/height |
|---|---|---|---|
| 0 | (Unity 기본) | — | 정상 |
| 1 | (Unity 기본) | — | 정상 (or focus-dummy 후 NaN 가능) |
| 2 | axisIndicator (L1167) | AxisIndicatorElement | NaN 추정 (QA-124) |
| 3 | _helpOverlay (L1180) | HelpOverlayElement | NaN 추정 (QA-124) |
| 4 | _focusDummy (L3918) | focus-dummy | width=1 height=1 명시 |
| 5 | _subWindowOverlay / _dragOverlay (L8340/L8683 동적) | 빈 이름 | NaN 추정 (동적 생성/제거, 비활성 시 NaN) |

→ child[5] NaN = _subWindowOverlay 또는 _dragOverlay (동적 생성 + 비활성 상태) 가능성 1순위

## fix path 검토 (사용자 명시 후 진입 의무)

### 옵션 A — L4552-4556 polling 코드 제거 (영구 fix)

- 옛 24oo polling 코드 = 사용자 명시 BlurEvent + 3D click blur 패턴 (v0.1.421+) 으로 충분 가능
- 변경: L4550-4556 제거 (~7 라인)
- 위험: 24oo 옛 stepping 회기 가능성 (검색 자동 focus) — 사용자 14 시나리오 PC 검증 의무

### 옵션 B — IsAnyUIFocused 가드 추가 (보수적)

- 본 코드 안에 `IsAnyUIFocused()` 추가 가드 = 사용자가 UI element 명시 click 한 상태면 polling skip
- 변경: 1 라인 추가
- 위험 낮음

### 옵션 C — focus-dummy element 자체 폐기 (큰 구조 변경)

- v0.1.420+ 포커스 기조 + IsAnyUIFocused 헬퍼 = focus-dummy 더 이상 필요 없음 추정
- 변경: focus-dummy 관련 코드 모두 제거 (~30 라인)
- 위험: 옛 stepping 회기 가능성 + 사용자 검증 의무

## 권장

**옵션 B 권장** (보수적, 1 라인 추가) — IsAnyUIFocused 가드 추가로 WASD 이동 중 polling skip + 옛 stepping 회기 영역 보존.

옵션 A/C = 사용자 14 시나리오 PASS 후 + 추가 자율 검증 path 권장.

## 진입 의존

| 조건 | 상태 |
|---|---|
| 사용자 14 시나리오 PC 검증 PASS | 대기 중 |
| Player.log child[5] 실제 element 식별 | **PASS** (본 진단 후보 1순위 = _subWindowOverlay / _dragOverlay) |
| STD-0005 입력 격리 정책 본문 확인 | **대기** (협업자 standards 본문 fetch 후 정합 점검) |
| 옵션 B (가드 1 라인) 위험 평가 | **낮음** — 자율 진입 가능 |

## References

- [`Factory00Bootstrap.cs`](../../Assets/Scripts/Game/Factory00Bootstrap.cs) L4552-4556 (focus-dummy polling)
- [`Factory00Bootstrap.cs`](../../Assets/Scripts/Game/Factory00Bootstrap.cs) L3910-3920 (focus-dummy element 생성)
- [`focus-key-isolation.md`](../../../.claude/rules/focus-key-isolation.md) (포커스 기조 v0.1.420+ 영역)
- 협업자 STD-0005 = 입력 격리 정책 (자체 측 정합 점검 의무)
