Files
KArtSell.Aegis/docs/Design/kbx-foundation-v60-status-canonical-contract-hardening/docs/golden-screen-t02-t03-v27.md
T
kjh2064 3f293d8aa8
deploy / deploy (push) Successful in 1m52s
deploy / notify (push) Successful in 1s
V13-FE-006: consolidate approved UI and contract hardening
2026-08-13 02:41:00 +09:00

2.4 KiB

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

KbxCommandBarallowedStatuses, 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를 선언만 하고 무시하지 않는다.