# Fricle 권한 / 라이선스 / Operator UX

> pipeline/04-PERMISSION_LICENSE 의 판정 3층 ↔ uxui 정합 영역.
> 권한 (= 워크스페이스 역할) / 라이선스 (= Operate 자격) / Operator (= 인스턴스별 지정) UI 표현.

> 출처 = [pipeline/04-PERMISSION_LICENSE.md](../../pipeline/04-PERMISSION_LICENSE.md) + [License & Seat](../../architecture/01-license-seat.html)

---

## 1. 판정 3층 (= 04 정합 / V2 흡수안 — 세부 논의 중)

Fricle 의 권한 ↔ 라이선스 분리 원칙 = **결정됨**. 다만 = View / Operate 구분 / Operator 지정 방식 / Operator UI 위치 / 라이선스 회수 후 세부 결과 모드 = pipeline `DECISIONS.md` 기준 = **세부 논의 중**.

Fricle 의 "뭘 해도 되냐" (권한) ↔ "그 수준까지 써도 되냐" (라이선스) = **분리 판정**. 04 정합:

```
1층. 워크스페이스 멤버십 + 역할
     (Owner / Admin / Editor / Viewer)
        ↓ 역할이 Editor 이상이어야 Operate 후보
2층. Operate 자격 (라이선스)
     (본인 구매 OR 다른 사람으로부터 할당 받음)
        ↓ 자격 있어야 Operate 자격 획득
3층. Operator 지정 (인스턴스별)
     (기본 = 배치자 / 옵션 = 특정 멤버/역할)
        ↓ 이 인스턴스의 Operator여야 실제 Operate
     → 최종 모드 결정
```

### 1.1 1층 = 워크스페이스 역할 (4단계)

| 역할 | 권한 |
|------|------|
| **Owner** | 워크스페이스 소유권. 삭제 / 양도 가능. 모든 Admin 권한 포함 |
| **Admin** | 워크스페이스 기본 설정 변경, 개인 설정 허용 관리, 멤버 초대/제거/역할 변경 |
| **Editor** | 앱 생성/수정/삭제, 배치 조작. 멤버 관리 불가 |
| **Viewer** | 읽기 전용. 태그/반응은 가능 (추가 기능 구현 후) |

> 세부 권한 범위 = 논의 중 (4단계 역할별 액션 범위 정의 필요)

### 1.2 2층 = Operate 자격 (= 라이선스)

**라이선스 = 항상 개인 단위 (= account)**.
본인 구매 또는 다른 사람으로부터 할당 받음. 워크스페이스 무관.

- 본인이 N개 구매 = 본인이 그 앱의 라이선스 owner
- 본인 사용 분 = 어느 WS 에서든 사용 가능
- 다른 사람에게 할당된 라이선스 = 할당 받은 사람의 개인 라이선스처럼 인정됨
- 할당 받은 사람도 어느 WS 에서든 사용 가능 (= LICENSE-MODEL §3.2 정합 = "어디서든 사용 / WS 무관")

단, 특정 WS / 특정 앱 인스턴스에서 실제 Operate 가능 여부는 아래 3층 판정을 모두 통과해야 함.

1. 워크스페이스 역할
2. Operate 자격 (= 라이선스 보유 여부)
3. Operator 지정 여부

> 마켓플레이스 앱 구매 / 할당 / 회수 UI = [07-BILLING.md](../07-billing/00-BILLING.md) (= C 동선)
> 라이선스 본질 = [License & Seat](../../architecture/01-license-seat.html)

### 1.3 3층 = Operator 지정 (인스턴스별)

각 앱 인스턴스마다 누가 조작 권한 가지는가:
- 기본 = **배치자** (= 인스턴스를 캔버스에 배치한 사람)
- 옵션 = 특정 멤버 / 역할 지정

> Operator 지정 UI 위치 = 논의 중 (예: 오브젝트 컨텍스트 메뉴 / 앱 설정)

---

## 2. 결과 모드 UI 차별 표현

판정 결과 모드 = `full edit / view only / blocked` (= 04 정합). 그러나 **차단된 층마다 사용자 체감 / UI 표현 다름**.

### 2.1 모드별 UI 표현

| 결과 모드 | 차단 층 | 사용자 체감 | UI 표현 |
|----------|--------|-----------|---------|
| **full edit** | — | 정상 사용 | 일반 캔버스 UI (모든 액션 가능) |
| **view only** | 1층 차단 (= Viewer 역할) | "내 권한이 viewer 다" | 편집 버튼 비활성화 + "viewer 모드" 라벨 (앱 헤더 또는 메뉴바) |
| **view only** | 2층 차단 (= 라이선스 없음) | "이 앱 라이선스가 없다" | "라이선스 필요" 오버레이 + 구매 / 할당 받기 유도 (= 07-BILLING C 동선 진입) |
| **view only** | 3층 차단 (= Operator 아님) | "이 인스턴스 Operator 가 아니다" | "보기 전용" 라벨 + 누가 Operator 인지 표시 (예: "Operator: @user") |
| **blocked** | 비멤버 (= 0층 진입 X) | "워크스페이스 자체 진입 불가" | 404 / 권한 없음 페이지 |
| **blocked** | 인스턴스별 (= 라이선스 회수 후 등) | "이 인스턴스 자체 안 보임" | 캔버스에서 placeholder / blur / 숨김 |

### 2.2 차단 층 사용자 체감 핵심

- **2층 차단 = 라이선스 회수 시점** = 가장 강한 UX 충격. 작업 중이던 앱 = 갑자기 "라이선스 필요" 전락 = **사전 알림** + **grace 기간** 필수 (= [07-BILLING §3](../07-billing/00-BILLING.md) 만료/재구독 흐름 정합)
- **3층 차단 = Operator 변경 시점** = 동시 편집자 인지 영역. "방금까지 편집 가능하다가 보기 전용 됨" = Operator 변경 알림 필수
- **blocked = 인스턴스 숨김 시점** = 워크스페이스 안 다른 사람 작업물 = 라이선스 없으면 안 보임. 이 경우 = "라이선스 필요한 앱" placeholder 권장 (= 0층 차단 외 인스턴스 단위)

### 2.3 블라인드 (= 라이선스 회수 후 view 도 안 되는 상태)

LICENSE-MODEL §6 별도 결정 영역. 04 결과 모드 (`full edit / view only / blocked`) 외 = "블라인드" = view 도 차단 = 인스턴스 placeholder 만 표시 = 본 영역 04 정밀화 필요.

---

## 3. 액션 분류 (= 04 정합)

판정 결과 모드 안에서 앱이 실제로 수행하는 액션:

| 모드 | 허용 액션 |
|------|-----------|
| `full edit` | view / run / edit / share / export / manage (앱이 제공하는 전부) |
| `view only` | view (열람) / 반응 / 태그/멘션 (협업 기본만) |
| `blocked` | 접근 자체 불가 |

> 액션 분류 = 판정 층이 아니라 **판정 결과로 도출되는 허용 범위**

---

## 4. 판정 실행 시점

- **진입 시점**: [02-APP_RUNTIME](../../pipeline/02-APP_RUNTIME.md) 마운트 흐름 판정 단계 (4~5단)
- **런타임 중**: 구독 만료 / 역할 변경 / Operator 교체 시 재판정

---

## 결정됨

- **권한 4단계**: Owner / Admin / Editor / Viewer (= 04 1층)
- **라이선스 = 항상 개인 + 할당 (= 04 2층 = LICENSE-MODEL 정합)** — 본인 구매 = 본인 owner / WS 무관
- **권한 ↔ 라이선스 ↔ Operator = 분리 판정 원칙** (= 04 정합)
- **결과 모드 = `full edit / view only / blocked`** (= 04 정합. trial / run only 등 = 앱별 entitlement 파생)

---

## 논의 중

- **권한 4단계 세부** — 역할별 액션 범위 (= 04 정합)
- **Operator 지정 UI 위치** — 오브젝트 컨텍스트 메뉴? 앱 설정? (= 04 결정 필요 영역)
- **결과 모드 차별 UI** — 차단 층별 표현 정밀화 (= 본 §2 영역)
- **블라인드 표현** — view 도 차단 시 placeholder UI (= LICENSE-MODEL §6 별도 결정 후 04 정밀화)
- **라이선스 회수 시 사전 알림** — UX 충격 완화 영역 (= 07-BILLING §3 정합)
