Files
Hulumath-Web/docs/会议记录/需求评审会议纪要_20260712.md
T
Jacky 1f98f7152d
CI / test (push) Failing after 1m31s
v0.2 Preview: Construction Plan.
2026-08-08 21:25:27 +08:00

408 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数学脑(MathBrain)— 内部需求评审会议纪要
---
## 会议信息
| 项 | 内容 |
|---|---|
| 日期 | 2026年7月12日(周日)14:0014:45 |
| 地点 | 远程 · 腾讯会议 |
| 参会人 | **PM**(产品经理,3年教育产品经验)、**Dev**(全栈开发,5年 Flask/前端经验) |
| 会议目标 | 逐条辩论 P0/P1/P2 需求清单,形成可交付排期 |
| 当前版本 | MVP v8.0(已上线:莫兰迪 UI、剧本广场、立绘系统、葫芦侠行93节点) |
---
## 辩论实录
### P0-1: 数学专业模拟器完整数据填充(8学期120节点)
**PM** 我先讲这个。模拟器现在是半成品——只有60个节点,覆盖大概2年的内容。但这个功能是我们"数学人生"板块的第二引擎,用户点进去玩到一半就断了,体验非常差。我主张把8学期120节点一次性填完。这不是纯内容工作——每个节点的 choice 分支、属性影响、结局判定,这些都有逻辑骨架,我们只是把血肉填进去。
**Dev** 你说的"只是填血肉",我不同意。我先问你:120个节点,每个节点平均3段叙事文本、2-3个选项、effects 数值设计——你用 AI 生成初稿也得人工调,对吧?你算过没有,60节点→120节点,按当前 seed_simulator.json 的密度来看,每个节点需要约15分钟调优,这就是30人时。但这不是纯体力活——你剧情分支树的平衡性要不要测?gpa/interest/skill 三属性的数值曲线要不要调?现在 engine 的节点跳转是硬编码在 JSON 里的 `next` 字段,你在写的时候就容易出现死循环或者无法到达的结局。
**PM** 我认可你说的数值平衡问题。但这恰恰说明我们需要一次性做完——如果分开做,第二期添加的节点必然会打破第一期的数值平衡,回头又要返工。120节点一个版本搞定,后续只做 bugfix。
**Dev** 你说的是一个好理由,但我担心的是另一个问题:当前引擎的限制。你看 `app.js` 里的 `simState`,和葫芦侠行的状态机是两套独立的全局变量,但渲染逻辑共享同一套 `renderVNNode()`。这意味着如果你要在模拟器里加入"学期切换动画""成绩单展示""毕业典礼"这些仪式感节点,现有的 render 逻辑根本撑不住。你不光要填数据,你还得改前端渲染引擎。
**PM** 等等,我说的就是填充数据,我没说要加学期切换动画。那些是 nice-to-have。
**Dev** OK,那我们就说纯数据填充。120节点,我给4个工作日——前提是你给我一份完整的节点树草稿,我做 JSON 编码和数值校对。你自己写不了 JSON 的话,我给你一个 Excel 模板你填,我再转。
**PM** 可以,我出剧情草稿 + 属性曲线设计,你做编码。那你觉得120节点够不够?
**Dev** 120节点8学期,平均每学期15个节点,每个节点2-3个选择,分支深度大概3-4层——够用户玩30-40分钟,可以了。再多就是内容膨胀,边际效用递减。
| 结论 | ⚠️ **有条件通过** |
|---|---|
| 工作量 | PM 3天(剧情草稿+数值设计)+ Dev 4天(JSON编码+前端引擎适配) = **7人天** |
| 风险 | 🟡 中(数值平衡 + 引擎适配可能溢出) |
| 条件 | PM 先出完整草稿,Dev 评估后再开工 |
---
### 多剧本体系(NG架构:主剧本触发衍生剧本)
**PM** 这个是我最近一直在想的大方向。现在我们只有《葫芦侠行》一个主剧本,93个节点8章,很完整。但如果用户玩完第八章某个结局后,系统提示"新篇章已解锁——《三力思外传》",用户就会想继续玩。这就像 Netflix 的互动剧集,一个主剧火了之后出衍生剧。技术上也不复杂吧——就是多套 JSON 之间通过结局节点互相引用。
**Dev** 不复杂?我跟你掰扯一下。当前代码:`storyData` 是一个全局变量,加载后 `vnState.currentNode` 指向一个节点,rendering 逻辑假设你在单一剧本里。你加了多个剧本,我需要:第一,剧本间状态转移——用户在剧本A里积累的 shuli/xiayi/xinzhi/favorability 要不要带到剧本B?带的话,怎么映射?不带的话,多剧本之间就是完全割裂的,用户感受不到"同一个世界观"。
**PM** 这个确实要讨论。我的直觉是"部分继承"——像《巫师3》那样,前作存档影响续作开局,但不是1:1映射。比如葫芦侠行主剧本通关后,厚朴侠好感度超过30的玩家,在《厚朴侠前传》里解锁特殊对话线。
**Dev** 行,就算我们解决了状态继承,第二个问题:存档系统。现在5个槽位只存 `currentNode` + `stats` + `favorability`。多剧本的话,每个槽位要不要存"哪个剧本的哪个节点"?存档面板要不要按剧本分组显示?这些全是前端改动。
**PM** 等等,你说的这些都是必须改的吗?如果第一期我们只做最简单的方案:主剧本结局节点里加一个 `next_story` 字段指向另一个 JSON 的 start_node,然后系统弹一个提示"新剧本已解锁",用户手动回剧本广场选择。不做状态继承,不做跨剧本存档。
**Dev** 这个可以。改动量小很多:只是在结局渲染时读 `next_story` 字段,弹 toast。存档不用改。但你这样做完之后,用户期望就被拉高了——他们看到"新剧本解锁",就以为是一个连续的体验,结果进去发现数据全清零。这个体验落差你能接受吗?
**PM** 能接受。先给用户"发现惊喜"的感觉,后续版本再完善继承逻辑。MVP 只要解锁+跳转就行。
**Dev** 那就这样。但我有一个技术债提醒:如果将来要做状态继承,现在的数据模型就需要预留 `cross_story_state` 字段,否则回头要重构存档表。
| 结论 | ⚠️ **有条件通过(MVP版本)** |
|---|---|
| 范围 | 仅做"结局节点→解锁新剧本提示→手动跳转",不做状态继承 |
| 工作量 | **4人天**(Dev 3天引擎改造 + PM 1天新剧本草稿) |
| 风险 | 🟡 中(用户期望落差;数据模型需预留扩展) |
| 技术债 | 存档表需预留 `story_id` 字段 |
---
### 葫芦侠行2.0Phaser.js 星露谷级互动
**PM** 好,到我最想推的 feature 了。现在的葫芦侠行是纯文字+静态立绘,交互就是点按钮。我调研过 Phaser.js,它是 HTML5 2D 游戏框架,能做角色在场景里走动、对话气泡弹出、迷你游戏(比如射箭小游戏代替掷骰子判定)。你一个月装好 Phaser,做出第一幕——角色可在秉公习武堂地图上行走,和 NPC 对话,战斗用回合制数学题——绝对爆。
**Dev** (吸一口气)我要泼冷水了。第一,你对 Phaser.js 调研到什么程度了?你跑过 demo 没有?
**PM** 看了一些教程,API 看起来不复杂,scene-preload-create-update 的生命周期。
**Dev** 好,那我问你几个问题。第一,我们现在的架构是 Flask 渲染 HTMLJS 接管 SPA 切换。Phaser.js 是一个独立的渲染引擎,它自己管理 canvas。你要把 Phaser 的 canvas 嵌到我们的 MathLife 面板里,CSS 怎么接管?safe-area 适配怎么做?390px 宽度的 canvas 上做地图行走,体验怎么样?
**PM** Canvas 可以响应式缩放,Phaser 有 Scale Manager。
**Dev** Scale Manager 是为游戏设计的,不是为嵌在 WebView 里的 SPA panel 设计的。我真的做过。你 Phaser 跑起来之后,`switchModule()` 切换到"发现"tabPhaser 场景是 pause 还是 destroy?如果你 destroy 再 recreate,加载时间可能3-5秒。你让用户每次切换 tab 都等?
**PM** 那就 pause,保持内存。
**Dev** 移动端内存是个大问题。Phaser 跑一个 tilemap + 8个 sprite + 对话系统,大概占 80-120MB。加上我们现有的 DOM 渲染,低端 iPhone 可能直接闪退。这不是我说做不到,是移动端 WebView 的限制。
**PM** 那你觉得时间线呢?不要只说不行,给一个你认为可行的方案。
**Dev** 如果你真的要做互动地图,我的建议:不用 Phaser,用纯 CSS + DOM 做。就用 `position: absolute` 的图片+按钮放在一个有背景图的地图容器里,角色走动用 CSS transition。不需要 Phaser 的重型渲染。星露谷的感觉可以用像素风 CSS 背景图 + 莫兰迪调色来模拟。这叫"低配星露谷"——开发2周,用户体验能达到你期望的60%。
**PM** 60% 不够,我要的是真正的沉浸感。纯 DOM 做不出来角色在场景里连续走动的感觉,只能做 warp(瞬移)。
**Dev** 你要连续走动,Phaser 确实能给你。但我认真评估:Phaser 迁移 = 6周(学习1+搭建1+场景1+对话系统1+移动适配1+测试1),风险高。而且做完之后,以后所有人改剧情都得学 Phaser,不是改 JSON 那么简单。这是架构级变更。
**PM** 好吧。我承认之前的1人月估计太乐观了。那我们先做你提的"低配星露谷"方案——CSS DOM 地图 + 瞬移交互,2周交付。如果用户反馈很好,再评估 Phaser 迁移。
**Dev** 同意。但我建议我们在 CSS 方案里预留一个接口——地图走动的渲染抽象成一个 `renderMap()` 函数,将来如果要切 Phaser,只需要替换这个函数的实现。
| 结论 | ⚠️ **有条件通过(降级为CSS低配版)** |
|---|---|
| 方案 | CSS DOM 地图 + 像素风背景 + 瞬移交互(非 Phaser) |
| 工作量 | **10人天**Dev 8天 + UI素材 2天) |
| 风险 | 🟡 中(像素风美术资源需设计;Phaser 作为 V3 选项保留) |
| 备注 | Phaser.js 完整迁移 → 至少6周,移入长期规划 |
---
### P1-1: 用户登录(邀请码+密码方案C)
**PM** 这个我们拖太久了。老板定了方案C——邀请码+密码登录,未来接微信。现在的用户体验是 localStorage 生成一个 random userId,换设备数据全丢。收藏、历史、存档全没。这是核心竞争力问题:用户为什么要在我们的 App 里投入时间?他们需要"这是我的账号"的归属感。
**Dev** 技术上我不反对,登录系统在 Flask 里很简单:一个 `users` 表加 username/password_hash/invite_code 三个字段,`/api/login` `/api/register` 两个接口,前端一个登录弹窗。核心工作量在:邀请码的生成和管理。谁生成?手动在数据库里插?还是做一个简单的管理页面?
**PM** 第一期手动管理。我们一共也就几百个用户,运营同学在后台数据库里插邀请码就行。不需要管理页面。
**Dev** 那还有个问题:登录后,用户现有的 localStorage 数据怎么迁移?如果用户已经玩了2小时葫芦侠行,有5个存档——一登录,存档要 merge 到服务器。merge 逻辑你想清楚了吗?
**PM** 简单策略:注册时检测 localStorage 有没有存档,有的话自动上传到服务器端 `/api/simulator/save` 接口。之后服务器端为准。冲突不做合并且,提示用户选择保留本地还是服务器。
**Dev** 可以。那大概:后端 `users` 表 + 登录/注册 API + session/cookie 管理 = 2天;前端登录弹窗 + localStorage 迁移 + 所有 API 加 `user_id` 鉴权 = 2天。总共4天,但我必须在每个现有 API 上加鉴权,这个测试覆盖面要大。
**PM** 我觉得值。做了登录之后,收藏和历史才有真正的持久性。而且有了 user_id,我们后续的家长周报、学习数据统计才能做。
**Dev** 同意。但我有一个建议:密码不要存明文,用 bcrypt hash。Flask 有 `werkzeug.security`,不需要额外依赖。
| 结论 | ✅ **通过** |
|---|---|
| 工作量 | **4人天** |
| 风险 | 🟢 低 |
| 依赖 | 无 |
---
### P1-2: 交互剧情章节选择器
**PM** 这个需求非常明确:用户通关第八章某个结局后,回到剧本广场,每个已通关的章节可以自由重玩。比如我想重玩第四章的"论道大会"那段,不需要从头开始。这是互动小说类产品的标配——你看《隐形守护者》有章节选择,《Late Shift》有。
**Dev** 技术上不复杂:首先需要一个"通关标记"——用户到达过哪些节点。我们在 localStorage 或服务器端记录一个 `reached_nodes: []` 数组。然后前端渲染章节选择器:8个章节卡片,已到达过的章节可点击,点击后直接 `vnState.currentNode = 章节入口节点ID`。问题是:用户的 statsshuli/xiayi/xinzhi)怎么办?直接用当时的存档值?还是给默认值?
**PM** 给"当时的存档值"。用户第一次通关时我们自动存一个"章节快照"stats + favorability)。重玩时用快照。如果用户多次通关同一章,保留最近一次的快照。
**Dev** 那存档表要扩展了。现在5个手动槽位之外,再加一个"系统自动快照"机制。这个改动量不大,但存储逻辑需要仔细设计:每个章节一个快照,8章 = 8条记录。
**PM** 这个改动会影响现有存档面板吗?
**Dev** 不影响,系统快照不显示在用户手动存档面板里。它只是一个"读取时用"的隐藏数据。
| 结论 | ✅ **通过** |
|---|---|
| 工作量 | **3人天**(Dev 2天快照机制 + 1天UI |
| 风险 | 🟢 低 |
---
### P1-3: 知识卡片扩充 + 周更机制
**PM** 目前只有8张知识卡片。8张。用户点"知识"tab,翻三下就到底了。"知识"是我们四大核心模块之一,8张卡片完全撑不起来。我主张用 AI 生成初稿 + 人工审核,每周3张,一个月到20张。周更需要建一个运营流程。
**Dev** 内容生产我不反对,但我有几点要确认。第一,AI 出稿用的是 DeepSeek API 对吧?那这个生成是一次性脚本还是做成后台功能?
**PM** 一次性脚本。每周跑一次,生成3张,人工改,然后插入 `knowledge_cards` 表。
**Dev** 那第二点:现在的知识卡片渲染有没有问题?8张卡片的时候没问题,到了50张、100张的时候,前端是一次性加载所有卡片吗?
**PM** 让我想想……现在应该是全量加载。
**Dev** 对,`/api/knowledge` 不分页。到100张卡片的时候每次请求都要加载100条,每条卡片都有长文本内容。这要做分页。而且卡片的去重和质量控制——AI 生成的内容可能和已有的重复,也可能有事实错误。人工审核需要时间,运营同学懂不懂数学?
**PM** 运营同学是数学专业出身,审核没问题。分页我们第一期不做,50张以内全量加载性能 OK。到100张再做分页。
**Dev** 行。那我只需要写一个 `generate_knowledge.py` 脚本,调用 DeepSeek 批量生成,输出 JSON,人工审核后导入。前端暂不改。
**PM** 等一下,我觉得周更应该做成自动化的——不是每次手动跑脚本。能不能在 Flask 里加一个定时任务?每周一自动生成3张草稿,状态为 `draft`,运营同学在后台审核通过后上线?
**Dev** 定时任务需要 APScheduler 或者 celery。Flask 本身不支持。你确定要为了一个每周3张的内容生产引入新的依赖和调度框架?我觉得过度设计了。
**PM** 好吧,手动脚本先跑着。
| 结论 | ✅ **通过(MVP用脚本)** |
|---|---|
| 工作量 | **3人天**Dev 2天脚本 + PM 1天prompt优化) |
| 风险 | 🟢 低(纯内容生产,无架构变更) |
| 后续 | 卡片超过50张时前端加分页(另估1天) |
---
### P1-4: 视频数据真实化(54条占位→真实链接)
**PM** 现在 seed_videos.json 里的54条视频,大部分是 YouTube/Bilibili 的占位 ID——点进去 404 或者根本不存在。这个必须改。我需要运营同学配合,从 B 站/YouTube 找真实的、高质量的数学科普视频,每个视频给真实 URL + 封面图 + 时长。
**Dev** 这个完全不是开发工作。你让我改什么代码?数据替换而已。你给新的 seed_videos.json,我导入。一个 `DELETE FROM videos` + 重新 `load_seed_videos()`5分钟。
**PM** 我就是确认一下工作量,确实很小。但我想问:现在是每次重新导入都会 DELETE 全部对吧?如果将来用户在视频上有行为数据(收藏了某条视频),重新导入不会丢吗?
**Dev** 好问题。现在的逻辑是 `INSERT OR REPLACE`,基于 `bvid``video_id` 唯一键。所以如果新数据的 ID 和旧数据不同,旧收藏就悬空了。解决办法:真实化的时候保持 video_id 不动,只替换 url、cover、duration 字段。需要我加一个 upsert 逻辑。
**PM** 好,那就这样。
| 结论 | ✅ **通过** |
|---|---|
| 工作量 | Dev **0.5人天**upsert逻辑),运营 **2人天**54条视频筛选+校对) |
| 风险 | 🟢 低 |
| 备注 | 纯运营驱动,PM 负责对接 |
---
### P1-5: 工具箱 — 概率模拟器
**PM** 这个是我最兴奋的 feature 之一。三个交互实验:蒙提霍尔三门问题、生日悖论、骰子实验。每个实验都是纯前端 Canvas 动画 + 跑1000次模拟显示概率收敛。用户玩三门问题,自己选一扇门,系统展示"换门vs不换门"的概率差异。这是知识模块里最出彩的内容——"动手做数学"。
**Dev** 我先说我喜欢的:这三个实验确实适合用前端做,逻辑不复杂,每个实验核心代码不超过200行。Canvas 动画也不难。但我担心的是——你把这5个实验放在哪个模块?
**PM** "知识"模块的子tab——现在只有"精选"和"话题",加一个"工具箱"。
**Dev** 那前端 Tab 切换逻辑要改。另外这三个实验的交互设计你有原型吗?蒙提霍尔——选门→主持人开一扇羊→你决定换不换→结果展示。这个交互流程要用 Canvas 还是 DOM
**PM** 我觉得混合最好:门用 Canvas 画(有开关门动画),按钮和文字用 DOM。生日悖论更简单,一个输入框 + Canvas 散点图。骰子实验用 Canvas 画骰子。
**Dev** 可以。但我给你一个现实时间估计:三个实验,每个需要 Canvas 绘制 + 动画 + 概率计算 + 移动端适配。每个实验至少1.5天。总计4.5天,加上"工具箱"子tab的前端改造,**5人天**。不算多但也不少。
**PM** 可以接受。但我还想加两个实验——贝叶斯更新可视化和随机游走。
**Dev** 先做这三个,上线看用户反馈。如果数据好再扩。
| 结论 | ✅ **通过** |
|---|---|
| 工作量 | **5人天** |
| 风险 | 🟡 中(Canvas 动画移动端性能需验证) |
| 范围 | 先做3个,后续根据数据决定是否扩 |
---
### P2-1: PWA + 小程序壳
**PM** PWA 可以让用户在 iOS/Android 上"添加到主屏幕",离线也能用。小程序壳是老板提的方向——微信小程序用户量大。
**Dev** PWA 技术上很简单:一个 `manifest.json` + 一个 `service-worker.js`,半天搞定。但 PWA 的离线体验需要你把所有静态资源(CSS/JS/图片/立绘/JSON)缓存——你现在立绘图片多大?
**PM** 8个角色立绘 + 4个场景背景,大概……我没算过。
**Dev** 如果超过10MBiOS Safari 的 Service Worker 缓存就超限了。而且 PWA 在 iOS 上的体验远不如 Android——没有推送通知、没有后台同步。小程序壳完全是另一套技术栈——要么用 Taro 重写前端,要么做 WebView 套壳。无论哪种都是大工程。
**PM** PWA 先做了,半天值得。小程序壳……我们先放放?
**Dev** 同意。
| 结论 | ⚠️ PWA **有条件通过**(仅 manifest + SW,不做离线全量缓存);小程序壳 **⏸ 延后** |
|---|---|
| 工作量 | PWA 0.5人天;小程序壳 ∞ |
| 风险 | PWA 🟢 低;小程序壳 🔴 高 |
---
### P2-2: 家长模式 + 周报
**PM** 家长模式:在"我的"页面设置一个家长密码,进入后可以看到用户的学习数据——看了多少视频、答了多少题、知识卡片阅读量。周报每周自动生成一份摘要推送。
**Dev** 先说家长模式——你说的"学习数据"我们现在根本没有。视频播放没有记录时长,知识卡片没有"已读"标记,工具箱的实验也没有统计。你要我先埋点,再做数据汇总,再做家长面板。埋点改所有模块,2天;数据汇总 API,1天;周报生成,1天。总共4天。而且周报"推送"——推送到哪?我们没有 WebSocket,没有邮件系统,没有公众号模板消息。你只能在 App 内做一个"周报信箱"。
**PM** App 内周报信箱可以。但你说的对——数据基础太薄了。那我换个思路:第一期只做数据埋点,不展示。让行为日志记录更完整。第二期再做面板。
**Dev** 这个我支持。埋点做好,后续家长面板、周报都能基于这些数据。但目前我们连用户登录都没做,埋点都是匿名数据,家长绑定不了孩子。
**PM** 所以这个依赖 P1-1。
| 结论 | ⏸ **延后至登录完成后** |
|---|---|
| 工作量 | 预估4人天(分两期:埋点2天 + 面板2天) |
| 风险 | 🟡 中 |
| 依赖 | P1-1 登录 |
---
### P2-3: 好感度可视化面板
**PM** 现在葫芦侠行有好感度系统(欧阳侠、Eddie侠、厚朴侠等8个角色),但用户完全看不到当前好感度数值——只能在节点选择时凭感觉。我想在"数学人生"页加一个好感度面板,用进度条或心形图标展示。
**Dev** 技术上极简单:`vnState.favorability` 已经在全局状态里了,渲染8个进度条就是30行代码。但你确定要暴露数值?一旦用户看到"欧阳侠好感度 45/100",沉浸感就被打破了。现在的设计是让用户凭感觉选对话,更接近真实社交。你加一个数字面板,用户就会"刷好感度"。
**PM** …你说得有道理。那我退一步:不做数字面板,而是做"关系描述"。比如好感度 0-20 显示"萍水相逢"20-40 显示"略有交情"40-60 显示"惺惺相惜"60-80 显示"生死之交"80+ 显示"莫逆于心"。用文字而不是数字。
**Dev** 这个好。而且文字描述可以随剧情进展动态变化,比数字更有情感。工作量很小:一个关系描述映射表 + 5行渲染代码。
| 结论 | ✅ **通过(文字关系描述版)** |
|---|---|
| 工作量 | **0.5人天** |
| 风险 | 🟢 低 |
---
### P2-4: 双语支持(i18n
**PM** 中英文切换。我们的内容——视频标题、知识卡片、剧情文本——都只有中文。但如果将来要出海或者给国际学校用,双语是刚需。
**Dev** i18n 是架构级改动。前端所有硬编码的中文字符串都要抽出来变成 key-value 映射;后端 API 返回内容要加语言参数;最头疼的是剧情文本——93个节点,每个节点的叙事文本都要翻译。这怎么可能在 P2 阶段做?这不是技术问题,是翻译资源问题。
**PM** 你说得对。那我们先不做双语,但代码层面预留 i18n 的可能性——前端字符串能不能从现在开始用变量引用而不是硬编码?
**Dev** 可以。我可以定义一个 `I18N` 对象,现在里面只有 `zh`,未来加 `en`。新代码用 `I18N['key']` 取值。但历史代码全部重构不现实——只对新功能做。
| 结论 | ⏸ **延后(代码预留机制即可)** |
|---|---|
| 工作量 | 代码预留 1人天;完整双语 20+人天(含翻译) |
| 风险 | 🔴 高(翻译资源 + 全量重构) |
---
### P2-5: AI 助教多轮对话记忆
**PM** 现在 AI 对话每次都是独立的——用户问"什么是导数",AI 回答了;然后问"它和积分有什么关系"AI 没有上文。DeepSeek API 支持多轮对话对吧?
**Dev** 支持。API 层面传 `messages` 数组就行——`[{role: "user", content: "..."}, {role: "assistant", content: "..."}]`。前端维护一个对话历史数组,每次请求把整个 history 传给 API。改动量:后端 `/api/chat` 接口改一下接收 `history` 参数,前端维护 `chatHistory` 数组 + 渲染。1天。
**Dev(自己接话):** 但是有一个隐性问题——token 消耗。每轮对话带全量 history,token 累积很快。如果用户聊了10轮,每轮回答500字,那就是约3000 token 的 history,加上新问题,请求成本翻3-5倍。DeepSeek 虽然便宜(¥1/百万token),但量大了也要注意。
**PM** 做 token 截断——只保留最近5轮对话。超出就丢弃最早的历史。
**Dev** 可以。还有一个体验问题:长对话历史会让 AI 回答越来越偏向历史语境,偏离当前问题。5轮是一个合理截断。
| 结论 | ✅ **通过** |
|---|---|
| 工作量 | **1人天** |
| 风险 | 🟢 低 |
| 备注 | 限制历史5轮,控制 token 成本 |
---
## 最终决策汇总表
| 编号 | 需求 | 结论 | 优先级 | 工作量(人天) | 风险 |
|------|------|------|--------|:--------:|:----:|
| P0-1 | 模拟器数据填充(120节点) | ⚠️ 有条件通过 | P0 | 7 | 🟡 中 |
| P0-2 | 葫芦侠行立绘+背景 | ✅ 已上线 | P0 | — | — |
| P0-3 | 存档面板+结局画廊 | ✅ 已上线 | P0 | — | — |
| — | 多剧本体系(MVP) | ⚠️ 有条件通过 | P0 | 4 | 🟡 中 |
| — | 葫芦侠行2.0(CSS低配) | ⚠️ 有条件通过 | P0 | 10 | 🟡 中 |
| P1-1 | 用户登录 | ✅ 通过 | P1 | 4 | 🟢 低 |
| P1-2 | 章节选择器 | ✅ 通过 | P1 | 3 | 🟢 低 |
| P1-3 | 知识卡片扩充+周更 | ✅ 通过 | P1 | 3 | 🟢 低 |
| P1-4 | 视频真实化 | ✅ 通过 | P1 | 0.5 + 运营2天 | 🟢 低 |
| P1-5 | 工具箱(概率模拟器) | ✅ 通过 | P1 | 5 | 🟡 中 |
| P2-1 | PWA | ⚠️ 通过(缩减) | P2 | 0.5 | 🟢 低 |
| P2-1b | 小程序壳 | ⏸ 延后 | — | ∞ | 🔴 高 |
| P2-2 | 家长模式+周报 | ⏸ 延后 | — | 4 | 🟡 中 |
| P2-3 | 好感度可视化 | ✅ 通过 | P2 | 0.5 | 🟢 低 |
| P2-4 | 双语支持 | ⏸ 延后 | — | 20+ | 🔴 高 |
| P2-5 | AI 多轮记忆 | ✅ 通过 | P2 | 1 | 🟢 低 |
---
## 建议排期(按迭代划分)
### 迭代1(第1-2周):基础体验闭环
- P1-1 用户登录(4天)
- P1-2 章节选择器(3天)
- P1-4 视频真实化(0.5天 + 运营并行)
- P2-3 好感度文字描述(0.5天)
- P2-5 AI多轮记忆(1天)
- **合计:Dev 9人天(≈2周)**
### 迭代2(第3-4周):内容厚度 + 知识模块
- P1-3 知识卡片扩充(3天)
- P1-5 工具箱概率模拟器(5天)
- P2-1 PWA manifest + SW0.5天)
- **合计:Dev 8.5人天(≈2周)**
### 迭代3(第5-6周):剧情体验升级
- P0-1 模拟器数据填充(7天,PM在第4周前交付草稿)
- 多剧本体系 MVP4天)
- **合计:Dev 11人天(≈2.5周)**
### 迭代4(第7-8周):视觉升级
- 葫芦侠行2.0 CSS低配版(10天)
- **合计:Dev 10人天(≈2周)**
### 后续(无固定排期)
- 家长模式+周报(依赖登录完成 + 数据埋点)
- 双语支持(仅代码预留)
- 小程序壳(需单独技术评审)
- Phaser.js 完整迁移(作为 V3 独立规划)
---
## 需要老板拍板的开放问题
1. **模拟器填充是 P0 还是 P1?** PM 和 Dev 一致认为120节点是内容工作而非产品创新,建议降为 P1 但仍排在合理优先级。如果老板坚持 P0,需在迭代1/2插队。
2. **用户登录之后,要不要做"账号找回"** 方案C是邀请码+密码,没有邮箱/手机绑定。如果用户忘记密码,目前没有找回机制。老板是否接受"联系运营手工重置"?
3. **多剧本"状态继承"要不要做?** Dev 建议本期只做解锁+跳转,状态继承留到 V2。这会带来用户期望落差。如果老板认为继承是刚需,工作量需翻倍至8人天。
4. **小程序壳的方向确认。** 如果老板短期内要推微信小程序,前端架构可能需要提前往 Taro/uni-app 方向规划,不能继续在原生 JS 上堆功能。这会改变整个迭代计划。
5. **预算确认:DeepSeek API 的 token 成本。** AI 多轮记忆上线后,每次对话的 token 消耗量将增加数倍。需确认月度预算上限。
---
## 一句话执行摘要
> **本次评审共通过12项(含5项有条件通过)、延后3项、驳回0项;核心结论是用登录+章节选择器"闭环体验",用模拟器填充+低配星露谷"囤厚度",小程序壳和双语作为长期战略暂不启动——2个月内可交付4个迭代,总工作量约38.5人天。**
---
*会议记录:PM & Dev 联合纪要 | 下次评审:迭代1完成后(≈第3周)*