# 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` 通过;浏览器实操验证派生/实时开关/校验/列表展示。