# Experiment System Spec

## 目標

定義銷售實驗主線的最小可上線系統範圍（MVP）：

- Experiment
- Variant
- Change Set
- Release
- Runtime delivery

## 這輪規格調整（2026-03-22）

1. 實驗匹配規則必須同時支援：
- URL 規則（contains / equals / starts_with / regex）
- 裝置限制（mobile / tablet / desktop）

2. 建立 Experiment 時，自動建立一個「原始版本 Variant」：
- 系統自動建立，不讓使用者手動調整該原始版本內容

3. 移除 `is_control`：
- 不再讓使用者手動指定對照組

4. 移除 `variant_changes.enabled`：
- 每筆 change 預設生效，不提供啟用/停用欄位

5. key 全改為系統生成：
- `experiment_key`：`EX+timestamp`
- `variant_key`：`VA+timestamp`
- 使用者不輸入 key

6. Variant 簡化：
- 不再有 `status`
- 使用者建立/編輯 variant 只可調整 `name` 與 `traffic_weight`

## 核心流程

1. 建立 Experiment
2. 系統自動建立原始版本 Variant（不可編輯內容）
3. 建立其他 Variant（只編輯 name / traffic_weight）
4. 在 Editor 編輯 Variant changes
5. Build Release（產生 runtime payload）
6. Publish / Rollback
7. Runtime assign + payload 套用 + event 回傳

## Experiment 管理

- 列表、建立、編輯、狀態流轉（schedule / pause / resume / archive）
- 支援 module_type 與 targeting_config
- targeting_config 最少要包含 `url_rules` 與 `device_targets`

## Variant 管理

- 列表、建立、編輯、刪除
- 使用者可調整：`name`、`traffic_weight`
- 系統管理欄位：`variant_key`
- 不提供 `status`、`is_control`
- change set 可讀可寫（不含 enabled 開關）

## Release 管理

- build：由 variant_changes 聚合 payload
- publish：將 release 生效
- rollback：回到前一可用 release

## Assignment 規則

- 以 stable seed 決定 bucket
- bucket 對映 variant weight
- assignment 結果需可追蹤

## 第一版成功標準

- 後台可完成「建立實驗 -> 建立變體 -> 編輯 -> build -> publish」
- runtime 可正確回傳 assignment 與 payload
- rollback 可恢復上一版本
