# KBX FE QA Hardening v47

## 1. 판단

v46까지 Workspace Resume, Theme, Empty/Error Recovery는 많이 안정화되었지만 실제 Golden Screen을 다시 추적하면 **Query 실패와 Command 실패의 UX가 동일한 수준으로 닫혀 있지 않았다.**

- 조회 실패: `KbxTemplateStateBoundary`로 복구 가능
- Validation: Field/Cell + Summary 존재
- Conflict: `KbxConflictResolver` 존재
- 그러나 `business-rule / permission / not-found / integration / system`은 실제 T01/T02/T03의 저장·출고·상태변경 경로에서 공통 표현이 없고 일부는 throw로 빠질 수 있었다.

업무시스템에서는 이 차이가 중요하다. 조회 API가 실패한 것과 사용자의 출고지시가 업무규칙 때문에 거부된 것은 같은 `Error`가 아니다.

## 2. v47 원칙

```text
Query state
→ Loading / Empty / Error / Retry

Field validation
→ Field / Cell / Validation Summary

Concurrency
→ 내 값 vs 최신 값 / Reload

Command problem
→ 업무규칙 / 권한 / 데이터 / 외부연계 / 시스템
→ 현재 Context 유지
→ 가능한 다음 행동
```

Problem text나 Action ID는 신뢰 경계가 아니다. Server가 내려준 `actions`를 그대로 `executeCommand(action.id)`에 연결하지 않는다. `KbxProblemFeedback`은 기본적으로 action allow-list가 비어 있으며 화면이 명시적으로 허용한 ID만 렌더링한다.

## 3. 구현

### `KbxProblemFeedback 1.0.0`

지원:

- business-rule
- permission
- not-found
- integration
- system
- correlationId
- retryable retry
- dismiss
- 명시적 action allow-list

Validation과 Conflict는 이미 더 구체적인 UX가 있으므로 기존 전용 컴포넌트를 유지한다.

### Template

- `KbxListPage 1.8.0`
- `KbxMasterPage 1.7.0`
- `KbxTransactionPage 1.7.0`

세 Template 모두 `problem / problemActionAllowlist / retryProblem / dismissProblem` 계약을 가진다.

### Golden Screens

`OMS-ORD-001`
- Bulk 출고 실패 시 Selection과 조회 Context 유지
- retryable Problem이면 같은 Bulk 대상 재시도 가능
- dismiss 후 현재 화면 유지

`OMS-ORD-002`
- Save/Confirm Problem을 Form 위에서 설명
- Validation/Conflict와 중복 표현하지 않음
- retryable Save/Confirm 재시도

`ERP-MST-ITEM-001`
- 목록 상세 로드 실패 시 현재 편집 데이터를 덮어쓰지 않음
- Save/Deactivate Problem을 공통 Surface로 표현
- 재시도 시 마지막 실패 operation만 재실행

## 4. Reference HTML/JavaScript

실제 예외 주문을 선택하고 출고지시하면 `업무 규칙` Problem을 보여준다. `문제 N건만 선택`은 실패대상만 다시 선택하며 현재 주문조회 화면을 떠나지 않는다.

Dark Theme에서도 warning/danger/info semantic surface를 사용하고 상태는 색상 외 `업무 규칙` 텍스트로 함께 표시한다.

## 5. QA

Reference Browser QA: **12/12 PASS**

- Home render
- Dark Theme
- T01 open
- 예외 Row 선택
- Business Problem 표시
- 복구 Action 존재
- 색상 외 유형 Label
- 실패건 재선택
- Problem dismiss
- 1280px horizontal overflow 0
- runtime page error 0

증적: `docs/evidence/v47-browser-problem-theme.json`

## 6. 완료로 계산하지 않는 것

이 실행환경은 package registry 제한 때문에 실제 Vite + Vue + PrimeVue + AG Grid live runtime을 설치해 Playwright로 실행하지 못한다. 따라서 v47 실제 Vue 변경은 syntax/static/governance Gate로, 브라우저 상호작용은 동일 Reference HTML/CSS/JavaScript로 분리하여 증적한다.

또한 Client Problem UI는 보안 경계가 아니다. Permission, Domain rule, Concurrency, Idempotency, Integration state의 최종 truth는 Server에 남는다.

## 7. 다음 우선순위

1. 실제 Vue origin에서 T01 bulk business-rule / permission E2E
2. T03 save integration/system retry E2E
3. T02 stale-version conflict + command problem 병행 검증
4. Full-query XLSX / Hangfire 결과 Problem 연결
5. WMS scan command의 server-rejected / integration-degraded UX

새 Template/Metadata Engine 확장은 이 항목보다 우선하지 않는다.
