## 核心原则
- 承诺是活动级属性：所有活动均需生成并持有承诺；抽奖只能在承诺存在的活动上执行
- 不做旧期兼容：不读取/维护期级承诺表；全量切换到活动级承诺

## 数据模型（仅 activities）
- `activities` 新增字段：
  - `commitment_algo` VARCHAR(32) 默认 `commit-v1`
  - `commitment_seed_master` BLOB（活动随机种子，256位）
  - `commitment_seed_hash` BLOB（`SHA256(seed_master)`）
  - `commitment_state_version` INT（递增）
  - `commitment_items_root` BLOB（按玩法需要可填，比如 Ichiban 的 slots 根）
- 期级承诺表不再使用（保留但不访问），所有策略仅访问活动级承诺

## 接口
- 生成承诺（活动级）：`POST /api/admin/activities/:activity_id/commitment/generate`
  - 行为：生成随机种子；计算 `seed_hash`；按玩法（如 Ichiban）计算 `items_root`；版本 +1
- 承诺概览：`GET /api/admin/activities/:activity_id/commitment/summary`
  - 返回：`{ seed_version, algo, has_seed, items_root(optional) }`
- 抽奖前置校验：策略入口统一校验活动承诺存在；缺失则返回 `COMMITMENT_REQUIRED`

## 策略消费
- Ichiban：
  - 读取活动级 `seed_master` 作为随机源
  - 根据期的奖励配置构造 slots（基于 `original_qty`）→ 使用活动种子做确定性洗牌
  - 保持“位置→奖品”稳定，版本变更后整体映射更新
- 其他玩法：
  - 统一读取活动承诺作为随机源或哈希链起点

## 前端改造
- 活动管理：
  - 操作列显示“生成承诺”与“承诺概览”（适用于所有活动，不再区分玩法）
  - 详情/期次页可显示版本号与算法
- 一番赏序号映射：只读查看映射；顶部显示当前活动 `seed_version`

## 抽奖流程
- 即时/定时调用策略前：校验活动承诺
- 抽奖回执携带：`seed_version`、`algo`

## 测试与验收
- 生成承诺版本递增与哈希一致性
- 策略在承诺存在时正常运行、缺失时明确错误
- 一番赏映射稳定性（同版本稳定）

## 上线步骤
- 执行 `activities` 字段迁移
- 接入生成与概览接口
- 改造策略读取活动承诺
- 更新前端活动管理显示与按钮
- 移除前端/后端期级承诺路径（保留表但不访问）