# KBX v27 — T02 / T03 Golden Record Lifecycle

## 목표

T02/T03의 완성 기준을 단순 Form 렌더링이 아니라 **레코드의 생성·수정·상태전이·동시성·감사·복구가 하나의 예측 가능한 UX 계약으로 닫히는 것**으로 정의한다.

## 공통 Record Lifecycle

`KbxRecordLifecycle`은 다음을 동일 위치/순서로 표현한다.

1. Version
2. Optimistic Concurrency Conflict
3. Workflow / 현재 상태 / 다음 가능 Action
4. Audit Trail

`KbxCommandBar`는 `allowedStatuses`, `requiresDirty`, `requiresClean`, `permissionByStatus`, `confirm`을 해석한다. 상태가 허용되지 않는 Action은 임의 실행되지 않고 비활성 사유를 제공한다.

## T02 — ERP-MST-ITEM-001

- 신규 상태: 입력 가능, 저장은 `erp.item.create`
- 사용 상태: 입력 가능, 저장/사용중지는 `erp.item.write`
- 사용중지 상태: Read-only
- Update/Deactivate는 `version`을 비교한다.
- stale write는 409 conflict로 거부하고 사용자 입력을 보존한다.
- 최신값 재조회는 사용자의 명시적 Action으로만 수행한다.
- Write Model은 `catalog.items` + `catalog.item_details`; Grid 조회는 `erp_item_search_projection`을 사용한다.
- Write transaction 안에서 Audit + Outbox + Projection을 함께 갱신한다.

## T03 — OMS-ORD-002

- 신규: 아직 DB 레코드가 없음
- 작성: 저장 가능, 주문확정 가능(단 Dirty이면 먼저 저장)
- 확정 이후: 일반 입력 Read-only
- 기존 주문은 `/oms/orders/:orderId/edit`에서 동일 Template으로 다시 연다.
- 저장 충돌 시 내 화면과 최신 주요 필드 값을 비교한다.
- 주문확정은 `Idempotency-Key=order-confirm:{orderId}:{version}`으로 안전하게 재시도한다.
- 확정 Transaction은 상태 + Version + Audit + Outbox + command receipt를 원자적으로 반영한다.

## 보안 경계

- 화면에서 Disabled/Readonly는 UX 표현이다.
- 신규 주문 등록: `oms.order.create`
- 작성 주문 수정: `oms.order.write`
- 주문 확정: `oms.order.confirm`
- Backend Permission과 Domain 상태 검증이 최종 방어선이다.

## 기술부채 방지

- 상태별 버튼 if/switch를 각 Page에 복제하지 않는다.
- Conflict UI를 화면별로 만들지 않는다.
- Audit을 JSON dump로 노출하지 않는다.
- Projection을 Write Source of Truth로 사용하지 않는다.
- 위험 Workflow의 `confirm:true`를 선언만 하고 무시하지 않는다.
