# 07 — ①时间倍速反向输入

**What to build:** 让用户在新增活动时按「耗时」而非「倍速」思考。表单把裸的「时间倍速」输入换成「窗口长度（预设 6/12/24/48/72h）」+「希望加速后多久跑完」两项，系统实时派生并只读展示倍速与「加速后约 X 完成」；提交时前端把派生出的 `time_scale` 放进现有 payload（**后端 API 契约与 `time_scale` 语义完全不变**）。「实时」开关一键设为真实墙钟（倍速 ×1、禁用目标耗时输入）。目标耗时若 > 窗口（倍速 <1）表单校验拦截。活动列表/详情处也改用「加速后约 X 完成」展示，取代裸 `×N`。

**Blocked by:** 无 —— 可立即开始（不依赖后端改动）。

**Status:** ready-for-agent

- [ ] 新增纯 util（如 `campaignTime.ts`）：`deriveTimeScale(windowSeconds, targetSeconds)` 与 `acceleratedDuration(windowSeconds, timeScale)`，作为唯一口径。
- [ ] 新增表单：窗口长度下拉 + 目标加速耗时（数值+单位，默认分钟）+「实时」开关；只读展示派生倍速与「加速后约 X 完成」。
- [ ] 校验：目标耗时 ≤ 窗口长度（倍速 ≥1），违反时拦截并给出提示（US-4）。
- [ ] 提交仍发 `time_scale`，`POST /campaigns` 契约不变。
- [ ] 活动列表与详情用 `acceleratedDuration` 展示「加速后约 X 完成」，替换裸倍速列。
- [ ] `npx tsc --noEmit` + `npm run build` 通过；浏览器实操验证派生/实时开关/校验/列表展示。
