个人工作台首批开发拆解:架构分析、待办与排期
2026-10-10。输入:白晨已认可的组件与场景方案(下称「方案」;首批范围以同名讲解稿为准:18 个模块,22 个场景,其中 P0 13 个、P1 9 个),决策页工作文件夹首批只做云端,以及原型演绎与布局重构汇报稿(下称「汇报稿」,白晨 10-10 接受其中约 4 人日的首批增量)。产品范围不再改(「2711 就此为止」),本文只回答「怎么做、谁来做、要多久、缺什么」。 性质:5.2 节列出的各项是白晨已定(10-10、10-11),5.3 节还有 2 项待拍板;其余是本文提案。三条已定边界照用:文件夹首批只做云端;工作台只经宿主 HTTP 接口和渲染器包使用底座;工作台最多两人。 证据写法:本仓库文件写
路径:行号,路径相对仓库根;底座写../workbench-daemon/路径:行号;没核实的标【待验证】。估时单位是「人日」:一个人带 AI 代理,用一个工作日完成实现、测试、评审,并按档收口。 修订:同日两轮:先按评审意见改(必须改 M1~M9、建议改 1~9,评审原文不入库),再按白晨 10-10 的拍板改(两条切片都做、首批只用化名、保持登录即注册、截图模型先跑探针再定、批准三个解析库、向底座提两项需求、10/16 交付版本,以及按推荐定的五个小项),10-11 再按白晨对最后三项的答复改(不接钉钉日程、Agent 直接写用部署开关、海外模型通道已申请),之后按终审并入汇报稿的布局重构增量,新增 5.3 两项待拍板。 读法:正文 5 节;能力对照明细、待办明细、AC 预分配、与方案的出入、风险对策、原型章节与阶段的对应放在附录 A~F。
〇、先读这几条
- 待办数:P0 59 项(含 4 次收口)、85 人日;P1 16 项、21 人日;「真实学生数据入库前」另有 3 项、4 人日,首批不排期。余量 30%,假设 10-12 开工,完整 P0 约 12-31、P1 约 2027-01-21 完成(按 5.3 第 1 项的现排计;选推荐项各晚 1 个工作日)。
- 两条试跑切片都做(白晨 10-10 定,第三节):共用部分只做一次,先上教师、后上青年人,合计 51.5 人日。按现排,教师切片约 11-13 试跑(化名数据),青年人切片约 11-27 试跑。 教师切片要不要带上日程和第一次打开待拍板(5.3 第 1 项),推荐带上,代价是两个日期变成 11-18、11-30。
- 界面结构按汇报稿的重构做(白晨 10-10 接受):桌面即今日、没有左栏、全部模块面板、卡片点开成整页、「+ 收进来」统一入口;视觉基调是 C 柔彩 Bento(白晨 10-11 选定)。
- 架构判断:18
个模块都做成工作台原生模块。依据是底座方向稿早已定好的分工:大模型调用、确认界面归顶层应用,底座不碰业务数据和
AI(
../workbench-daemon/docs/AI工作台/报告/2026-10-04-工作台架构与协议范围-方向稿.md:28-29、97)。外部系统接入继续做成插件,同时向底座提两项需求:宿主执行确认、插件声明触发条件(1.4)。 - 复用与新建:能直接复用的只有登录与会话、调宿主(含 C 端措辞改写)、模型网关客户端、桌面卡片框架;公共对象层、待拍板、写能力封堵、文件存储、抽取管线、后台作业、部署、试跑度量和 18 个模块都要新建。
- 两处现状和直觉相反:
- 登录即注册:任何人输入一个新名字就能进系统(
apps/api/app/identity/service.py:1、78-96)。白晨 10-10 定首批保持这样,但放真实数据之前必须改(K6 清单)。 - 写操作可以绕过确认:已登录用户现在就能直接调写能力,通用调用接口、HTML
卡片桥接口、演示 Agent 都不看
kind。三条路最后都汇到invoke_for_user(apps/api/app/invocation/service.py:109),P0 在这一处统一封堵(WB-60)。
- 登录即注册:任何人输入一个新名字就能进系统(
- 对底座的依赖:白晨 10-11 定首批不接钉钉日程(钉钉待办只写,照常保留),教师用工作台自己的日程,钉钉日程列为后续项,所以 P0 不需要底座新增能力。
- 最没把握的两处:截图用国产还是海外模型、每人每天花多少钱,首周探针(WB-05)实测后定;「每句可溯源」只能保证引用的记录存在,保证不了它真的支撑那句话。
- 待拍板 2 项(5.3):教师切片带不带日程与第一次打开;C 风格与原生卡尺寸。白晨 10-10、10-11 已定的记在 5.2。
一、架构分析
1.1 能力对照(逐项证据见附录 A.1,逐模块见附录 A.2)
- 已有,可直接用:登录与会话(保持登录即注册,白晨
10-10
定);按用户隔离;经宿主读写飞书日历、建钉钉待办(只能写)、读飞书文档;代用户调能力并改写成
C
端措辞(
apps/api/app/invocation/service.py:109、68)。 - 需改造:写能力的三条直接写的路要统一封堵(
apps/api/app/cards/router.py:170-191、apps/api/app/cards/service.py:261-283、apps/api/app/agent/tools.py:70);模型网关客户端缺图片消息、JSON 校验和 429 处理;卡片表要能放原生卡;前端路由、假模型网关、门禁的风险区和覆盖安排也要改。 - 需新建:业务对象存储、待拍板、文件上传与存储、后台作业。宿主对外接口没有应用数据接口,也没有文件接口(
../workbench-daemon/protocol/v0/07-宿主对外接口.md:26-71)。 - 首批不做:主动推送到用户。底座没有事件推送(
../workbench-daemon/protocol/v0/05-事件.md:3)。
1.2 首批模块与数据流
flowchart LR
subgraph WEB[前端 apps/web]
TODAY[桌面即今日:顶部今天简报+卡片网格+右栏等你定(可收起)]; LIB[全部模块面板]; PAGES[模块整页(卡片点开、卡里一条直达)]; CARDS[桌面卡片:插件卡+原生卡]; DROP[+ 收进来(粘贴、上传、截图)]
end
subgraph API[后端 apps/api]
INBOX[inbox 收件箱]; FILES[files 存储·上传·提取(子进程)]; JOBS[jobs 后台作业]
EXTRACT[extract 抽取管线:校验·预算·限流]; MODEL[model 网关客户端]
OBJ[objects 公共对象层]; MODS[各模块域]; METRICS[metrics 试跑度量]
APPROVE[approvals 待拍板+执行器]; INVOKE[invocation.invoke_for_user:写能力只放行执行器]; HOST[host_client(已有)]
end
PG[(工作台 PostgreSQL)]; DISK[(文件存储:服务器磁盘卷)]
GW[模型:公司网关或海外,探针后定]; WBD[底座宿主]; EXT[飞书日历·飞书文档·钉钉待办]
DROP --> INBOX; PAGES --> FILES; FILES --> DISK; FILES --> JOBS; INBOX --> JOBS
JOBS --> EXTRACT --> MODEL --> GW
EXTRACT -->|草稿| APPROVE; MODS --> OBJ --> PG; APPROVE --> PG; JOBS --> PG; METRICS --> PG
APPROVE -->|确认后:本地改动| MODS; APPROVE -->|确认后:kind=write| INVOKE --> HOST --> WBD --> EXT
MODS -->|只读:飞书日程与文档| INVOKE; CARDS -->|只读| INVOKE
TODAY -.现算.-> MODS; TODAY -->|等你定| APPROVE; LIB --> PAGES; LIB --> CARDS
界面结构照汇报稿第三节:顶栏只放日期、全部模块、搜索(首批只按模块名)、「等你定」角标、头像;卡片点开是整页,插件卡沿用现有详情弹窗。约 4 人日增量落在 WB-07、08、28、63、66 和新增的 WB-73~77(附录 B)。
三条主数据流:
- 进来:原件先落库或落盘。后台作业调抽取管线,模型抽字段、代码做校验,生成对象草稿。草稿进待拍板给人核对,确认后才成为正式对象,并在
object_links里记下「由谁生成」。 - 看:桌面顶部的「今天」简报和各模块卡片都在打开时现算。飞书日程打开时经宿主现取,不做后台同步。
- 写出去:所有
kind=write的调用只能由待拍板执行器发出(WB-60)。
分包(按 apps/api/AGENTS.md
的约定):
- 公共层:
objects、jobs、model、extract、files、approvals、metrics。crypto等真实数据入库前再建。 - 通用模块:
inbox、todos、calendar、meetings、projects、documents、notes、tables、contacts、polls、today。 - 教师模块:
roster、timetable、profiles、parents、school_tasks。
前端在 apps/web/src/features/
下建同名目录。每新建一个域,同一任务里写模块说明,并同步
apps/api/AGENTS.md 的「各域」索引。
模型与代码怎么分工:模型只做判断类任务(摘要、拆分、抽字段、打标签、起草),校验、计数、冲突、名字对人的前三层、预算与重试都用代码,逐项见附录 A.3。
1.3 关键选择(每项两种方案,给推荐)
K1 模块放在哪里,底座补什么。
- A:业务模块放工作台,外部系统接入继续做成插件,同时推动底座补「确认点」和「触发」。B:只放工作台,不向底座提需求。
- 共同依据是方向稿的分工:顶层应用管「大模型调用、确认界面」,底座「不碰业务数据、布局、AI」(方向稿:28-29);大模型只在顶层调用(方向稿:97)。插件在自己进程里调模型、写自己的
HOME,底座不禁止(方向稿:98;
host/app/runtime/process.py:132),但这不是底座的职责。 - 不选 B:B 会让 C 端需求在这两个月里一项也到不了底座,和「底座首要服务 C 端」(方向稿:320)不一致。
- 推荐
A:价值决策页写了插件要补触发和确认(
docs/decisions/2026-10-09-工作台的价值.md:96);方向稿把确认校验划给了底座(方向稿:29);协议已给pending_confirmation占位(04-调用与结果.md:22)。 - 工作台内部模块的能力,按协议能力说明的形状定义(
name、kind、confirm、inputSchema),方便以后作为 Agent 工具或插件暴露(方向稿:92)。
K2 数据模型。
- A:统一对象表
objects加按kind校验的 JSONB 载荷,关联表object_links记生成、更新、引用三种关系,行数多的数据单独建表。B:每个模块一张强类型表。 - 推荐
A:待拍板、今日一屏、检索、溯源都只写一份。各模块都要查的字段(
status、due_at、start_at、end_at、project_id)做成真列;学生姓名、家长电话、档案正文现在就集中放、不进检索列,为以后加密留位(K6)。
K3 文件存储。
- A:服务器磁盘卷,代码只经
Storage接口读写。B:S3 兼容对象存储。已定(白晨 10-10)首批用 A(只需加已批准的python-multipart,但只能单实例),公测前换 B。 - 安全要求:落盘文件名用 sha256,只在同一用户范围内去重;文件类型用白名单;解析放在子进程里,设超时和内存上限,防解压炸弹(WB-10)。pypdf 的已知拒绝服务漏洞【待验证】。
K4 上传之后怎么处理。
- 推荐 A:后台作业。任务进 PG
作业表(
FOR UPDATE SKIP LOCKED),worker 跑在后端进程里。 - 不选 B(同步处理):单次模型调用的读超时就有 60
秒(
apps/api/app/agent/gateway.py:24),一次上传几十份文件,同步处理必然超时。
K5 待拍板怎么执行。
- 推荐
A:统一的待拍板表加执行器注册表,只有一处审计、一处防重复执行、一处放行写能力;B
是各模块各自弹窗确认。宿主没有幂等键,外部写不自动重试;以后宿主执行
confirm,执行器改为对接宿主(切换点见 1.4 第 1 项)。
K6 学生数据:已定(白晨 10-10):首批只用化名,不录入真实学生信息;姓名换编号在真实数据入库前做(WB-44)。
- 影响:字段加密(WB-61)、送模型前脱敏与「导出与删除我的数据」(WB-44)、邀请制账号(WB-11)都移出首批,归入「真实数据入库前」组。试跑不签同意书,改为页面常驻提示「请勿录入真实学生信息」、试跑说明写明同样的要求、提供化名示例数据(WB-71)。
- 真实学生数据入库前必须补做(缺一项都不能放真实数据):
- 合规确认:存放位置、能否送模型、能否用海外模型,要有校方或合作方的书面意见。
- 关闭登录即注册,改邀请或白名单,可停用账号、可重置口令(WB-11)。
- 敏感字段加密(WB-61)。名字对人在内存里解密后比对,加密字段不进
pg_trgm和普通索引。 - 送模型前把姓名换成编号、结果回填(WB-44)。脱敏漏网的风险要评估:外号、名册里没登记的名字代码认不出来。
- 导出与删除我的数据(WB-44)。
- 同意书与隐私告知。
- 试跑库里的化名数据清理或隔离,正式数据另起一套环境。
- 按风险区标准再做一次多视角评审,交白晨复核。
pg_trgm对中文是否有效,取决于部署库的LC_CTYPE【待验证,WB-62 核实】。无效就退回ILIKE。
K7 截图与口述。
- 截图:已定(白晨 10-10)先跑探针再定。WB-05 用同一批不含真实个人信息的截图,同时测公司网关里的国产多模态模型和海外模型,按识别准确率与成本选。海外模型通道已申请好(白晨 10-11),密钥按仓库规则放在仓库外。两种都读不好,改走「OCR 加文本模型」。
- 口述:首批不做语音识别,用户用输入法的语音输入转成文字。
1.4 需底座提供(逐项现状与证据见附录 A.4)
- 宿主执行
confirm并提供确认接口;2. 插件声明触发条件、宿主负责触发。白晨 10-10 定首批期间就提,需求说明写在 WB-01 设计稿里一并交出。工作台先用应用内的办法顶着,底座做好后切换:- 确认:先由 WB-60(
invoke_for_user拦截写能力)加 WB-06(待拍板执行器)顶着。切换点是工作台把支持的协议版本升到「宿主执行确认」那一版:在同一个任务里,执行器改为调宿主的确认接口,WB-60 的拦截保留为第二道防线。 - 触发:先由「打开时现算」加工作台自己的后台作业(WB-03)顶着。切换点是宿主能按插件声明推送触发:工作台改为接收推送,WB-03 只留文件处理这类内部作业。
- 两次切换都按大档做,时间看底座排期,不在本文估时内。
- 确认:先由 WB-60(
- 钉钉日程读写插件:白晨 10-11 定首批不接钉钉日程,列为后续项,不进
P0;钉钉待办只写,照常保留(WB-15)。 4~8.
钉钉待办读回、邮件收信插件、
invoke写操作幂等键、飞书日历参会人与全天日程,都排 P1;会议转写来源(飞书妙记等)排第二批。
二、待办拆解
明细见附录 B。每项写明动哪些文件、前置依赖、验收(含端到端由哪个场景覆盖,或按什么理由豁免)、是否命中风险区、估时和负责人。标题里的〔共用〕〔教师〕〔青年〕表示它属于哪条试跑切片。
附录 B 按内容分组(M1~M4 加「后续」组),执行顺序按第四节的阶段走:
| 内容分组 | 内容 | 项数 | 估时 |
|---|---|---|---|
| M1 基座 | 设计稿、界面设计、探针、对象层、作业、抽取、待拍板、写能力封堵、文件、门禁配置、端到端编排、部署、全部模块面板、卡片前后移、卡里直达整页、窄屏、两次切片收口 | 21 | 28.25 人日 |
| M2 通用模块 | 设计稿、界面设计、待办、日程(原生、接飞书)、收件箱、随手记、文档、项目、文件夹、会议、今天简报、表格、联系人、试跑度量、青年人第一次打开、收口 | 22 | 31.75 人日 |
| M3 教师模块 | 设计稿、界面设计、名册、课表、开学向导、档案、口述拆分、一人一页、家长沟通、学校填报、接龙回执、班级日常、化名试跑数据、收口 | 16 | 25 人日 |
| M4(P1) | 设计稿、界面设计,9 个 P1 场景,读飞书文档、公共检索、手机收集入口、Agent 写操作改走待拍板 | 16 | 21 人日 |
| 后续:真实学生数据入库前 | 邀请制账号、字段加密、脱敏与导出删除 | 3 | 4 人日 |
分档:宪章规定跨两个模块或命中风险区即为大档(../workbench-daemon/docs/standards/2026-10-02-AI-Coding工程宪章.md:19-21),本仓库只有前端、后端两个模块(tools-config/gate.toml:86)。因此每个阶段当作一个大档任务,各配一份设计稿(WB-01
覆盖两条切片,WB-64、67、69
分别覆盖阶段三、四、五;都含多视角评审、白晨复核和实现计划),收口跑
make check 加 make mutation。附录 B
每项都是子任务,不单独判档,「风险区」标「是」的按风险区标准评审;WB-05
探针不进产品代码,按小档做。
覆盖门禁:动 apps/api/app 或
apps/web/src
的子任务都写明端到端由哪个场景覆盖;界面细节写成补充用例放
testing/e2e/e2e/specs/,豁免照底座
tools/coverage/README.md 的写法;每个阶段中途就跑一次
make coverage。
两人并行的规矩:
- 迁移号预分配:
0003_objects(WB-02)、0004_jobs(WB-03)、0005_approvals(WB-06)、0006_card_kind(WB-08)、0007_files(WB-09),之后的在各阶段设计稿里分配。 - 生成物不手工合并:
openapi.json和前端生成客户端合并后重新生成。 app/main.py、app/invocation/、testing/e2e/的编排部分要串行改。
分工(合写的项一人算一半;甲偏后端,乙偏前端,两人都写前后端):
| 阶段 | 甲 | 乙 |
|---|---|---|
| 一:共用+教师切片 | 01、05、02、04、06、60、15、19、32(粘贴部分)、36、74、75、77、14(19 人日) | 01、63、08、07、12、13、62、66、16、21、28、73、30、33、71、14(19 人日) |
| 二:青年人切片 | 03、09、10、24、76、72(7 人日) | 17、79、18、25、72(6.5 人日) |
| 三:通用模块补全 | 64、20、26、29、31(6.5 人日) | 64、65、22、23、27、31(7 人日) |
| 四:教师模块补全 | 67、68、32(其余)、35、40、41、38、42、45(10.5 人日) | 67、68、34、37、39、43、45(9.5 人日) |
| 五:P1 | 69、70、58、47、48、53、54、56、59(10.5 人日) | 69、46、49、50、51、52、55、57、59(10.5 人日) |
关键路径:把各阶段的设计稿和收口闸门都算进去,按附录 B 的依赖算,最长的一条到 WB-45 共 33.5 人日:WB-01 → 02 → 06 → 15 → 19 → 28 → 77 → 14(教师切片收口)→ 72(青年人切片收口)→ 64 → 65 → 22 → 26 → 27 → 31 → 67 → 68 → 34 → 37 → 45。每人分到的 P0 约 42~43 个工作日,比这条链长,所以决定工期的是总量,不是依赖链。
三、两条试跑切片(白晨 10-10 定:教师和青年人都做)
切片里的项都取自附录 B,估时按原值或按裁剪后的范围算,余量 30%。共用部分只做一次。
| 块 | 项(编号与估时,人日) | 小计 |
|---|---|---|
| 共用基座 | WB-01 切片设计稿 2;WB-63 两条切片的界面设计 2;WB-05 探针(国产与海外模型对比)1.5;WB-02 对象层 2;WB-04 抽取 2;WB-06 待拍板 2;WB-60 写能力封堵 1;WB-07 待拍板前端 1;WB-08 前端骨架 2;WB-73 全部模块面板 1.25;WB-74 卡片前后移 0.5;WB-75 卡里直达整页 0.5;WB-77 窄屏 0.5;WB-12 门禁 0.5;WB-13 端到端编排 1;WB-62 部署 1.5;WB-66 试跑度量 1.25 | 22.5 |
| 共用模块 | WB-15、16 待办 2.5;WB-19 收件箱 2.5;WB-21 随手记 1.5;WB-28 今天简报 2 | 8.5 |
| 教师专属 | WB-30 联系人 1;WB-32 名册(只做粘贴名单)1.5;WB-33 名册前端 1;WB-36 档案 2;WB-71 化名试跑数据与提示 0.5 | 6 |
| 青年专属 | WB-03 作业 1.5;WB-09 文件 2;WB-10 文本提取 1.5;WB-17、79、18 日程 3.5;WB-24 项目 1;WB-25 文件夹 2.5;WB-76 第一次打开 0.5 | 12.5 |
| 收口与发布 | WB-14 教师切片 1;WB-72 青年人切片 1 | 2 |
| 合计 | 51.5 |
先后与重叠:
阶段一做共用部分和教师专属:
- 时间是 10-12~11-13,两人各约 19 人日,加余量是 25 个工作日。
- 教师切片不需要文件模块,所以先上。日程按现排在阶段二;要不要连同教师第一次打开挪进阶段一,见 5.3 第 1 项。
- 收件箱的截图在这时走一个单独的小上限,不依赖 WB-09。
- 11-13 教师切片收口发布,用化名数据给老师试跑。
阶段二做青年专属:
- 时间是 11-16~11-27,两人约 7 人日、6.5 人日,加余量是 10 个工作日。
- 11-27 青年人切片发布。
- 重叠的办法:阶段一里谁先做完手上的项,就提前拿青年专属里不依赖对方的项。比如乙的 WB-17 只依赖 02、06。这样青年人切片有机会早于 11-27。
能跑的场景:
| 切片 | 完整能跑 | 部分能跑 |
|---|---|---|
| 教师切片 | T13(AC-A23) | T12:私信截图认出家长和学生,生成待回待办 Y02、Y03:没有日程 第一次打开:空桌面加全部模块面板,没有入门清单 |
| 青年人切片 | Y02、Y04 | Y03 主体 |
- 再加 1 人日的 WB-40,教师切片可以跑 T08 的拆任务部分。
- 再加 WB-20(1 人日),Y03 的改期更新也能跑。
- 青年人切片适合网龙内部的设计、运营、策划(
docs/decisions/2026-10-09-工作台的价值.md:98)。
四、排期建议
假设:10-12(周一)开工,两人全职,余量 30%;按工作日算,扣除 2027-01-01 元旦;不含等白晨复核的时间(按 1 天内回复算);各阶段之间串行。
| 阶段 | 每人工作量(取两人中较大的) | 含余量的工作日 | 起止 | 结束时能看到什么 |
|---|---|---|---|---|
| 一:共用+教师切片 | 19 人日 | 25 | 10-12~11-13 | 教师切片试跑(化名数据) |
| 二:青年人切片 | 7 人日 | 10 | 11-16~11-27 | 青年人切片试跑 |
| 三:通用模块补全 | 7 人日 | 10 | 11-30~12-11 | 会议、文档、表格、改期更新;Y01、Y06、T09 |
| 四:教师模块补全 | 10.5 人日 | 14 | 12-14~12-31 | 13 个 P0 场景全部跑通 |
| 五:P1 | 10.5 人日 | 14 | 2027-01-04~01-21 | 9 个 P1 场景,加 Agent 写操作改走待拍板 |
- 「真实学生数据入库前」那一组(4 人日,两人约 3 个工作日)不排期,要放真实数据时再插进来。
- 10/16 交付版本(已定,白晨 10-10):M1 设计稿(WB-01,含两条切片)、截图探针结论(WB-05,含模型对比与成本)、按新风格重做的可点击原型、基座进度。原型由 AIC-2715 负责,是演示用的样板间,讲场景给人看;WB-63 是真产品的界面设计,以 C 柔彩 Bento(白晨 10-11 选定)为视觉基调,开发照它做。
- 上表按 5.3 第 1 项的现排(不挪)计。选推荐项时阶段一 28 个工作日到 11-18,阶段二 8 个工作日到 11-30,之后各阶段顺延 1 个工作日,P0 到 2027-01-04、P1 到 2027-01-22。
五、风险与未决
5.1 技术风险(13 项,对策见附录 E)
影响最大的四项:截图读不准(影响 6 个 P0 场景);模型成本与限流还不知道;开放注册之下任何人都能注册并消耗模型额度;老师在化名环境里录入了真实学生信息。
5.2 已定(白晨 10-10、10-11)
- 试跑人群:教师和青年人两条都做,排法见第三节。
- 学生数据:首批只用化名,不录入真实学生信息;姓名换编号在真实数据入库前做(WB-44)。入库前要补的事项见 K6 清单。
- 开放注册:保持登录即注册,不做邀请制。WB-11 移到「真实数据入库前」组;放真实数据之前必须再处理(附录 E 第 11 项)。
- 截图模型:先跑探针,同时测公司网关里的国产多模态模型和海外模型,按识别准确率与成本定(WB-05 的验收)。
- 批准
pypdf、python-docx、openpyxl:由 WB-10 开工时在底座.claude/approved-packages.txt登记,按该文件:3的格式另起一段注释,出处写「白晨 10-10,AIC-2711 拆解」。这是一次底座仓库的提交,单独提交、不和工作台的改动混在一起。Pillow看探针结果,要加时另行批准。 - 向底座提「宿主执行确认」「插件声明触发」:首批期间就提。工作台先用应用内的拦截顶着,底座做好后切换,切换点见 1.4。
- 10/16 交付版本:M1 设计稿、截图探针结论、按新风格重做的可点击原型、基座进度(AIC-2715)。原型是演示用;WB-63 是真产品的界面设计,视觉 C 柔彩 Bento(白晨 10-11 选定)。
- 按推荐定的五个小项:
- 文件存储先用服务器磁盘卷加存储接口(K3)。
- 公开分享页放 P1(WB-50)。
- 邮件首批不做。
- 界面设计由两人用 AI 做高保真原型,白晨看过再开发(WB-63、65、68、70)。
- 余量 30%。
- 不接钉钉日程,钉钉待办(只写)保留(10-11):钉钉日程优先级低,首批教师用工作台自己的日程,钉钉日程插件列为后续项,不进 P0(附录 A.4 第 3 项);待办同步钉钉(WB-15,经待拍板)照做。
- 演示 Agent 直接写两种都支持(10-11):保留 WB-60 的部署开关,试跑环境默认关、演示环境可以开。AC-A13 在开关打开的环境里继续验;WB-58 做完后,Agent 的写操作也改走待拍板。
- 海外模型通道(10-11):已申请好。WB-05
直接对比国产与海外两类模型;密钥按仓库规则放在仓库外(
~/.config/workbench-app/),不写进文档。 - 布局重构的首批增量约 4 人日接受(10-10,汇报稿第七节第 3 条):逐项落在 WB-07、08、28、63、66 和 WB-73~77。汇报稿第七节第 4 条(青年人第一次打开,0.5 人日)没有单独回复,它本就算在这 4 人日里,随之一并接受(WB-76)。
5.3 待拍板(2 项)
- 教师切片带不带日程与第一次打开。 5.2 第 9
条定了教师用工作台自己的日程,但现排里日程(WB-17、18)在阶段二,教师的第一次打开并在
WB-35(阶段四),所以 11-13 教师试跑时没有日程,第一天是空桌面。
- A(推荐):把原生日程 WB-17、18 挪进阶段一,另加 WB-78「教师第一次打开:两问加入门清单(不含课表)」0.5 人日(WB-35 到阶段四再补课表与开学向导)。教师切片到 11-18,青年人切片到 11-30,P0 完成到 2027-01-04;代价是两条切片分别晚 3 个、1 个工作日,P0 多 0.5 人日。
- B:维持现排,在试跑说明里写明教师切片 11-13 没有日程和入门清单:日程 11-27 之后才有,入门清单要到阶段四(12-31)。日期即第四节的表。
- 推荐 A:今天简报的日程部分和 AC-A16 在教师切片里才跑得通,第一次见面就是空桌面也最伤试跑。
- C 柔彩 Bento 和原生卡尺寸。 C
的观感靠一桌大小不一的色块(风格样张),而首批原生卡只做一种尺寸(汇报稿第五节),真产品里效果会打折。
- 一:接受落差,首批原生卡只做一种尺寸,靠状态色区分,0 人日。
- 二(推荐):待办、日程、随手记三个高频模块首批支持小、中、大三档,约 2 人日(尺寸框架 0.5,每个模块 0.5),排在阶段三,不推迟两条切片的试跑日期,P0 完成日约晚 1~2 个工作日。
- 推荐二:这三个模块每天都会打开,2 人日换到主要的视觉效果;其余模块仍一种尺寸,原定的约 8 人日「三种尺寸」照旧放到以后。本文的数字都没含这 2 人日。
附录 A 能力对照明细
A.1 公共能力
| 能力 | 判定 | 证据与说明 |
|---|---|---|
| 登录与会话 | 已有(白晨 10-10 定首批保持登录即注册) | 新名字直接建号(apps/api/app/identity/service.py:78-96),现有场景「新名字第一次登录即注册」也验了这一点(acceptance/演示账号与登录.feature:21);cli.py:63
只是建演示账号的命令。放真实数据前改为邀请或白名单(WB-11,后续组) |
| 按用户隔离 | 已有 | 调宿主时带
X-On-Behalf-Of:../workbench-daemon/protocol/v0/07-宿主对外接口.md:12 |
| 读写飞书日历 | 已有,经宿主 | list_events 的查询区间必须小于 40
天:../workbench-daemon/plugins/feishu-calendar/plugin.yaml:25-29。create_event
不邀请参会人、不支持全天日程:同文件 :126-132 |
| 建钉钉待办;读飞书文档 | 已有,前者只能写,后者只读 | ../workbench-daemon/plugins/dingtalk-todo/plugin.yaml:21、33;../workbench-daemon/plugins/feishu-docs/plugin.yaml:13、49、86、116 |
| 代用户调能力、改写成 C 端措辞 | 已有 | invoke_for_user:apps/api/app/invocation/service.py:109。user_facing:同文件
:68 |
| 写外部前先确认 | 需新建(待拍板),并且要封堵现有的绕行路径 | 协议的 confirm
只是声明(../workbench-daemon/protocol/v0/02-能力说明.md:15),底座自己也写明
HTML
卡片绑写能力会绕过确认(06-视图.md:130)。工作台现在有三条路能直接写:① 通用调用接口 POST /api/invoke,声明式按钮和首屏取数都走它,任意已装插件的任意能力都能调(apps/api/app/cards/router.py:170-191);② HTML 卡片桥接口,只查能力有没有绑定,不看读写( apps/api/app/cards/service.py:261-283);③ 演示 Agent 不区分读写( apps/api/app/agent/tools.py:70),AC-A13
就是不经确认直接建日程(acceptance/对话框与演示Agent.feature:53-61) |
| 调模型 | 需改造 | 请求的 messages
原样透传(apps/api/app/agent/gateway.py:112-118),解析回复时要求
content 是字符串(同文件
:92-97)。缺的是:拼图片消息的代码、JSON
输出校验、限流(429)处理;模型能不能读图也还不知道。模型是
glm-5.3-flash,白晨 1005
定(docs/specs/2026-10-05-工作台首个可演示版本-design.md:70) |
| 业务对象存储 | 需新建 | 宿主对外接口没有应用数据接口(07-宿主对外接口.md:26-71)。方向稿也规定底座不碰业务数据(方向稿:29) |
| 文件上传与存储 | 需新建 | 能力入参只允许 JSON
子集,没有二进制类型(02-能力说明.md:25-28);插件单次调用
30 秒超时(04-调用与结果.md:84)。工作台全局请求体上限是
512
KiB(apps/api/app/body_limit.py:25)。上传要用表单解析库
python-multipart:已批准,但还没写进
apps/api/pyproject.toml:8-24 |
| 后台作业 | 需新建 | 工作台目前没有。这件事不需要底座:底座缺的是事件推送(05-事件.md:3) |
| 桌面卡片、页面路由 | 需改造 | 卡片必须对应插件视图(apps/api/app/cards/models.py:50-51);前端只有三个路由(apps/web/src/routes/router.tsx:30、54、59) |
| 端到端用的假模型 | 需改造 | 只会按「工具调用 →
回答」的脚本作答(testing/fake-gateway/fake_gateway/engine.py:140) |
| 门禁 | 需改造 | 风险区五项(tools-config/gate.toml:88-94);覆盖规则是后端每行要三层都命中,前端每行要单元和端到端两层都命中(同文件
:43) |
| 主动推送到用户 | 首批不做 | 底座没有事件推送,工作台也没有通知通道 |
A.2 逐模块
| 模块 | 首批核心能力(讲解稿) | 判定 | 能复用的 | 要新建的,或需底座的 |
|---|---|---|---|---|
| 今日一屏(桌面顶部的今天简报) | 汇总新增、到期、状态变化、待决事项 | 需新建 | 无(apps/web/src/features/desktop/DesktopPage.tsx:35
只有卡片网格) |
app/today/;时间安排建议用代码排 |
| 待拍板 | 确认、修改、拒绝、批量 | 需新建 | 外部写走
invoke_for_user(invocation/service.py:109) |
app/approvals/;以后对接宿主确认(1.4 第 1 项) |
| 收件箱 | 拆分、归类、识别更新 | 需新建 | 网关客户端(agent/gateway.py:105) |
抽取管线;读图【待验证】;邮件需底座 |
| 云端文件夹 | 摘要、按项目归组、重新上传时比对 | 需新建 | 无 | 存储、上传、子进程解析、作业;上传路径单独设请求体上限 |
| 待办 | 新建、排期、完成、同步钉钉 | 需新建;写钉钉已有 | create_todo |
读回需底座 |
| 日程 | 读写飞书、查空档、检测冲突 | 读写飞书已有;其余需新建 | feishu-calendar/plugin.yaml:25、88、126、188、254 |
参会人与全天需底座;钉钉日程首批不接(白晨 10-11),列为后续项 |
| 会议 | 会前摘要、纪要、行动项、下次排期 | 需新建 | get_event 带描述(:88) |
首批由用户上传转写稿 |
| 项目 | 模板、步骤、材料缺口 | 需新建 | 对象层 | P0 只做最小项目 |
| 接龙与投票 | 收集、分享页、截图比对 | 需新建 | 名字对人 | 分享页放 P1 |
| 文档 | 生成、导出、逐句溯源 | 需新建;读飞书文档已有 | read_doc(feishu-docs/plugin.yaml:49) |
引用校验 |
| 随手记 | 自动标签、调取、成文 | 需新建 | 抽取管线 | pg_trgm 对中文是否有效【待验证】 |
| 表格 | 截图抽字段、逐格溯源、汇总 | 需新建 | 无(渲染器声明式组件里没有表格,06-视图.md:16) |
table_rows |
| 联系人 | 纪念日、承诺、往来 | 需新建 | 对象层 | 纪念日与承诺放 P1 |
| 课表与校历 | 下一节、抽本人排班、顺延、进度对比 | 需新建 | 日程域 | 课题目录由老师粘贴 |
| 学生名册 | 名字对人、名单比对 | 需新建 | 联系人域 | 首批只放化名数据;字段加密(WB-61)在真实数据入库前做;xlsx 导入要
openpyxl |
| 学生档案 | 一人一页、长期未记录提示 | 需新建 | 随手记、文档 | 同上 |
| 家长沟通 | 待回复与承诺、草稿只复制 | 需新建 | 联系人、待办 | 不代发消息 |
| 学校填报 | 拆任务、预填、比差异、已提交 | 需新建 | 待办、表格 | openpyxl |
| 公共:账号 | 首批保持登录即注册 | 已有 | identity/service.py:78-96 |
真实数据入库前:邀请制、重置口令、停用(WB-11) |
| 公共:写能力 | 只经待拍板写外部 | 需改造 | invoke_for_user 是唯一的汇合点 |
默认拒写、执行器放行、部署开关 |
A.3 模型与代码的分工(用户级规则:模型只做判断类任务,流程控制用代码)
| 交给代码 | 交给模型 |
|---|---|
| 文本提取(子进程里跑,设超时与内存上限)、按 sha256 去重、版本链、改动段落定位 | 摘要、一句话写出「差在哪」、从已有项目里选一个归组 |
| 校验输出是否符合 JSON Schema(不合格纠错重试一次);429 退避重试;每用户与全局每日预算 | 拆分投入物、从截图或文字里抽字段、自动打标签 |
| 日期、计数、冲突、空档、进度对表、名单差集;名字对人的前三层(精确、别名、编辑距离);引用存在性校验 | 起草纪要、一人一页、家长消息、评语;名字对人的兜底只给候选,由人确认 |
| 真实数据入库后:送模型前把姓名换成编号、结果回填;加密字段只在内存里解密后再比对 | — |
A.4 需底座提供
前两项是向底座提的协议需求,不阻塞首批。第 3 项白晨 10-11 定首批不接,列为后续项。
| # | 能力 | 现状 | 谁要用 | 优先级 |
|---|---|---|---|---|
| 1 | 宿主执行 confirm,并提供确认接口 |
只是声明(02-能力说明.md:15),pending_confirmation
占了位(04-调用与结果.md:22) |
工作台的待拍板对接到宿主,共建方的应用也能用 | 首批期间提出(白晨 10-10 定),不阻塞。先由 WB-60、WB-06 顶着;切换点是工作台支持「宿主执行确认」那一版协议时,执行器改调宿主的确认接口 |
| 2 | 插件声明触发条件,宿主负责触发 | 没有(05-事件.md:3) |
「后台·待建设」类场景,以及把事情推到用户眼前 | 首批期间提出(白晨 10-10 定),第二批用。先由「打开时现算」加 WB-03 顶着;切换点是宿主能推送触发时,工作台改为接收推送 |
| 3 | 钉钉日程读写插件 | plugins/ 下没有 |
教师日后接钉钉日程 | 后续项,不进 P0(白晨 10-11 定首批不接) |
| 4 | 钉钉待办读回列表与完成状态 | 只有
create_todo(dingtalk-todo/plugin.yaml:33) |
待办同步后回读状态 | P1 |
| 5 | 邮件收信插件(授权码走填写型凭据) | 没有 | 收件箱的邮件渠道 | P1 |
| 6 | invoke 写操作支持幂等键 |
协议里没有 | 执行失败后安全重试 | P1 |
| 7 | 飞书日历的参会人与全天日程 | 底座计划写明不做(docs/superpowers/plans/2026-10-08-飞书知识库与日程写入.md:89-90) |
「下次会」带参会人;校历全天节点 | P1 |
| 8 | 会议转写来源(飞书妙记等) | 没有 | 会议自动拉转写 | 第二批 |
附录 B 待办明细
列说明:
- 前置:写编号。
- 验收:单=单元,集=集成,端=端到端。AC
和场景名见附录 C;「补充」指
testing/e2e/e2e/specs/里的补充用例。 - 风险区:命中现有风险区或 WB-12 新增的风险区,标「是」。
- 所有项都是所属阶段大档任务的子任务(WB-05 除外)。标题里的〔共用〕〔教师〕〔青年〕表示属于哪条试跑切片,没标的在阶段三及以后做。
M1 基座(P0)
| 编号 | 标题 | 动哪些文件、新建哪些包 | 前置 | 验收(含端到端覆盖) | 风险区 | 估时 | 负责 |
|---|---|---|---|---|---|---|---|
| WB-01 | 首批架构与两条切片设计稿〔共用〕 | 新建
docs/specs/2026-10-1x-个人工作台首批-design.md:模块边界、表、待拍板状态机、敏感字段的集中位置(为以后加密留位)、能力定义形状、迁移号;附一节给底座的需求说明(宿主执行确认、插件声明触发),首批期间交出 |
无 | 多视角评审记录;白晨复核;实现计划 | — | 2 | 甲+乙 |
| WB-63 | 两条切片的界面设计〔共用〕 | 真产品的高保真可点击原型,视觉基调 C 柔彩 Bento(白晨 10-11 选定):桌面即今日(顶部今天简报、右栏等你定、无左栏)、顶栏、全部模块面板、模块整页、「+ 收进来」、待办、收件箱、随手记、名册、档案、日程、文件夹。AIC-2715 的样板间原型只作演示参照 | 01 | 白晨看过 | — | 2 | 乙 |
| WB-05 | 截图识别与成本探针(国产与海外模型对比)〔共用〕 | 脚本放仓库外;结论写进 WB-01 附录 | 无 | 同一批 20 张不含真实个人信息的中文截图(群通知、课表、回执、私信),分别跑公司网关的国产多模态模型与海外模型,比较字段准确率、耗时、token 数与每人每日成本,按准确率与成本给出选型;图片要不要压缩 | —(小档) | 1.5 | 甲 |
| WB-02 | 公共对象层〔共用〕 | 新建 apps/api/app/objects/,迁移
0003_objects |
01 | 单:载荷校验、三种关联、归属校验。集:跨用户返回 404。端:经各模块场景命中;AC-A28 | 否 | 2 | 甲 |
| WB-03 | 后台作业〔青年〕 | 新建 app/jobs/,迁移
0004_jobs;app/main.py 生命周期里起停
worker。宿主能推送触发后,触发类作业改为接收推送(1.4 第 2 项) |
01 | 单:重试、超时。集:不重复领取、关停不丢。端:经 AC-A19 命中 | 否 | 1.5 | 甲 |
| WB-04 | 模型抽取管线〔共用〕 | app/agent/gateway.py 移到
app/model/gateway.py,加图片消息与 429 退避;新建
app/extract/(runner、schemas、budget:每用户与全局每日预算);假网关加抽取脚本 |
01 | 单:Schema 纠错、预算、429。集:经假网关抽取。端:经 AC-A17 命中 | 是(Agent) | 2 | 甲 |
| WB-06 | 待拍板后端〔共用〕 | 新建 app/approvals/,迁移
0005_approvals;执行器以「放行写」的方式调
invoke_for_user。底座执行 confirm
后切换为调宿主的确认接口(1.4 第 1 项) |
02 | 单:状态机,重复确认不会重复执行。集:确认后模拟飞书出现日程;拒绝后外部不变。端:AC-A27 | 是 | 2 | 甲 |
| WB-60 | 写能力封堵〔共用〕 | app/invocation/service.py 默认拒绝
kind=write,只有执行器放行;app/agent/tools.py
过滤写能力;app/cards/service.py
遇到写能力返回明确错误;app/config.py
加部署开关(试跑环境默认关、演示环境可开,白晨 10-11 定)。底座执行
confirm 后保留为第二道防线 |
06 | 单:三条路都拒。集:通用调用、卡片桥、Agent 都写不出去;开关打开时 AC-A13 照旧。端:AC-A27「卡片与对话框调写能力被拒」 | 是 | 1 | 甲 |
| WB-07 | 待拍板前端〔共用〕 | 新建
apps/web/src/features/approvals/:落在桌面右栏「等你定」,可点开整页 |
06、08 | 单:批量确认、改一下再提交。端:AC-A27 | 否 | 1 | 乙 |
| WB-08 | 前端骨架与原生卡片〔共用〕 | router.tsx、AppLayout.tsx:桌面即首页、无左栏,顶栏放日期、全部模块、搜索、等你定角标、头像,右栏「等你定」可收起;新建
src/features/modules/registry.ts;app/cards/models.py
加 kind、module(迁移
0006_card_kind),改 cards/service.py |
01、63 | 单:原生卡与插件卡并存、右栏收起与展开。集。端:补充「桌面加待办卡」 | 是(卡片) | 2 | 乙 |
| WB-73 | 全部模块面板与模块名搜索〔共用〕 | 在 src/features/modules/
下建全部模块面板:平铺、打开、放上桌面、标出来自插件的;顶栏搜索只按模块名过滤;取代空桌面的「去插件页添加」 |
08 | 单:过滤、放上桌面。端:补充「从全部模块把待办放上桌面」 | 否 | 1.25 | 乙 |
| WB-74 | 卡片菜单「往前/往后」〔共用〕 | 卡片菜单加两项,调现有改卡片接口的
position(apps/api/app/cards/router.py:142) |
08 | 单;端:补充「卡片往前一位,刷新后仍在新位置」 | 否 | 0.5 | 甲 |
| WB-75 | 卡里一条直达整页〔共用〕 | 原生卡的每一条带锚点,点开模块整页并定位到该条;插件卡沿用现有详情弹窗(apps/web/src/features/cards/DetailDialog.tsx) |
08、16 | 单:锚点解析。端:补充「点待办卡里一条,整页定位到该条」 | 否 | 0.5 | 甲 |
| WB-77 | 窄屏单列〔共用〕 | 桌面和模块整页在窄屏下单列排布,「今天」在最上、「等你定」紧随其后 | 08、28 | 端:补充(窄屏视口下桌面单列可用) | 否 | 0.5 | 甲 |
| WB-09 | 文件存储与上传〔青年〕 | 新建
app/files/(models、storage、service、router),迁移
0007_files;app/body_limit.py
给上传路径单独设上限;pyproject 加 python-multipart |
02、03 | 单:路径规范化、拒绝穿越、类型白名单、按用户去重、版本链。集:上传整个文件夹、超配额 413、他人文件 404。端:AC-A19;补充(超限) | 是(文件) | 2 | 甲 |
| WB-10 | 安全的文本提取〔青年〕 | 新建
app/files/text.py:在子进程里解析,设超时与内存上限,检查
zip 解压比;支持 txt、md、pdf、docx、xlsx;pyproject 加
pypdf、python-docx、openpyxl。开工时先在底座
.claude/approved-packages.txt 登记这三个包(出处「白晨
10-10,AIC-2711 拆解」),作为一次单独的底座提交 |
09 | 单:每种格式一份样例;解压炸弹、加密 PDF、超时都报看得懂的错。端:经 AC-A19 命中 | 是(文件) | 1.5 | 甲 |
| WB-12 | 门禁配置〔共用〕 | tools-config/gate.toml
的风险区加待拍板、写能力、文件、敏感数据;affected.toml;only_mutate
加入本表末尾列的核心文件 |
02、06、60(文件风险区随 WB-09 补登记) | make tools-test;按 --tier
能判进风险区 |
门禁资产 | 0.5 | 乙 |
| WB-13 | 端到端编排扩展〔共用〕 | testing/e2e/:下发假网关抽取脚本、上传文件夹、隔离文件存储目录、开关环境 |
04(上传部分等 09) | make harness-check;冒烟场景 |
否 | 1 | 乙 |
| WB-62 | 部署与运维〔共用〕 | 部署说明写进
docs/guides/部署/;核实磁盘卷与备份、部署库的
pg_trgm 与 LC_CTYPE、worker
的进程模型、反向代理的上传上限与读超时(参照
app/host_client/deadline.py:13)、发布脚本【放在哪里待验证】 |
02(worker 与上传部分等 03、09) | 阶段一在试跑环境走通登录、抽取、待拍板;阶段二再走通上传 | 否 | 1.5 | 乙 |
| WB-14 | 教师切片收口与发布〔教师〕 | 收口档案
docs/reports/acceptance/2026-11-xx-个人工作台教师切片.md;发布到试跑环境 |
阶段一各项 | make check、make mutation 全绿并留证 |
— | 1 | 甲+乙 |
| WB-72 | 青年人切片收口与发布〔青年〕 | 收口档案;发布到试跑环境 | 14、03、09、10、17、79、18、24、25、76 | make check、make mutation 全绿并留证 |
— | 1 | 甲+乙 |
M2 通用模块(P0)
| 编号 | 标题 | 动哪些文件、新建哪些包 | 前置 | 验收(含端到端覆盖) | 风险区 | 估时 | 负责 |
|---|---|---|---|---|---|---|---|
| WB-64 | 阶段三设计稿(M2 其余) | docs/specs/…-M2-design.md+实现计划 |
72 | 多视角评审;白晨复核 | — | 1.5 | 甲+乙 |
| WB-65 | 阶段三界面设计(会议、文档、表格等) | 阶段三模块的高保真原型 | 64 | 白晨看过 | — | 2 | 乙 |
| WB-15 | 待办后端〔共用〕 | 新建
app/todos/:状态、期限、来源回链、计数、排进日程;同步钉钉时提交待拍板 |
02、06 | 单:按用户时区算逾期。集:确认后模拟钉钉出现待办。端:AC-A16 | 是(外部写提交) | 1.5 | 甲 |
| WB-16 | 待办前端〔共用〕 | 新建 src/features/todos/ |
08、15、63 | 单;端:AC-A16 | 否 | 1 | 乙 |
| WB-17 | 日程后端:原生部分〔青年〕 | 新建
app/calendar/:原生日程项、周期日程项;slots.py
查空档、检测冲突 |
02、06 | 单:冲突与空档。集:只有原生日程项时增改删。端:AC-A16 | 否 | 1.5 | 乙 |
| WB-79 | 日程接飞书〔青年〕 | app/calendar/
加飞书来源:打开时经宿主现取,与原生合并显示;写飞书时提交待拍板 |
06、17 | 集:未连接飞书只显示原生,连接后合并;确认后模拟飞书出现日程。端:AC-A16 | 是(外部写提交) | 0.5 | 乙 |
| WB-18 | 日程前端〔青年〕 | 新建 src/features/calendar/ |
08、17、63 | 单;端:AC-A16 | 否 | 1.5 | 乙 |
| WB-19 | 收件箱:投入与拆分〔共用〕 | 新建
app/inbox/、src/features/inbox/;教师切片里截图走单独的小上限 |
04、05、06、07、08、15、63(收文件另需 09) | 单:拆分结果到草稿的映射。集:假网关拆出三条。端:AC-A17 | 否 | 2.5 | 甲 |
| WB-20 | 收件箱:识别同一件事的更新 | app/inbox/merge.py |
17、19 | 单:候选匹配。端:AC-A17「改期通知进来时原日程改期」 | 否 | 1 | 甲 |
| WB-21 | 随手记〔共用〕 | 新建
app/notes/、src/features/notes/;迁移里启用
pg_trgm(不可用时退回 ILIKE) |
04、08、63 | 单:改过的标签进提示词、调出排序。端:AC-A20 | 否 | 1.5 | 乙 |
| WB-22 | 文档 | 新建
app/documents/、src/features/documents/:句子加引用、引用校验、导出
Markdown |
02、08、65 | 单:引用不存在或不属于本人即拒。集。端:AC-A20 | 否 | 2 | 乙 |
| WB-23 | 随手记整理成文 | app/notes/compile.py |
21、22 | 端:AC-A20 | 否 | 0.5 | 乙 |
| WB-24 | 项目(最小)〔青年〕 | 新建
app/projects/、src/features/projects/ |
02、08、63 | 单;集;端:经 AC-A19「按项目分组」命中 | 否 | 1 | 甲 |
| WB-25 | 云端文件夹〔青年〕 | 新建
src/features/folder/、app/files/{pipeline,diff}.py |
03、04、09、10、24 | 单:改动段落定位、sha 相同不重算。集。端:AC-A19 | 是(文件) | 2.5 | 乙 |
| WB-26 | 会议后端 | 新建
app/meetings/:绑定日程、同系列、会前一页、导入转写、纪要、行动项、下次会提交待拍板 |
04、06、15、17、22 | 单:系列串联、时间点解析。集。端:AC-A14 | 是(外部写提交) | 2 | 甲 |
| WB-27 | 会议前端 | 新建 src/features/meetings/ |
07、26 | 端:AC-A14、AC-A15 | 否 | 1 | 乙 |
| WB-28 | 今天简报(桌面顶部)〔共用〕 | 新建
app/today/(suggest.py);前端做成桌面顶部的「今天」简报条,不另建页面 |
06、08、15、16、19(日程部分等 17、18) | 单:不压会、期限早的优先。端:AC-A16 | 否 | 2 | 乙 |
| WB-29 | 表格 | 新建
app/tables/(table_rows)、src/features/tables/ |
02、04、08、65 | 单:汇总、记录表余额按记录算。集。端:经 AC-A18 和 AC-A26 命中;M2 内先写一个补充用例「截图加一行」 | 否 | 2 | 甲 |
| WB-30 | 联系人(基础)〔教师〕 | 新建
app/contacts/、src/features/contacts/ |
02、08、63 | 单;集;端:补充「加一个联系人并挂上来往记录」 | 否 | 1 | 乙 |
| WB-66 | 试跑度量〔共用〕 | 新建
app/metrics/:打开、录入、纠正、分享、打开模块、放上桌面六种事件,只记计数,不记内容;加一条导出命令 |
02 | 单;集;端:补充(打开桌面计一次);命令行部分照
cli.py:34 的写法豁免 |
否 | 1.25 | 乙 |
| WB-76 | 青年人第一次打开〔青年〕 | 新建
src/features/onboarding/:两问(做什么的、用不用飞书日历)后推荐
5~6 张卡放上桌面,第一天的今天简报条显示入门清单 |
08、28、73 | 单;端:AC-A41 | 否 | 0.5 | 甲 |
| WB-31 | 阶段三收口与发布 | 收口档案;矩阵入库;发布到试跑环境 | 本里程碑全部 | make check、make mutation 全绿 |
— | 1.5 | 甲+乙 |
M3 教师模块(P0)
| 编号 | 标题 | 动哪些文件、新建哪些包 | 前置 | 验收(含端到端覆盖) | 风险区 | 估时 | 负责 |
|---|---|---|---|---|---|---|---|
| WB-67 | 阶段四设计稿(M3 其余) | docs/specs/…-M3-design.md+实现计划 |
31 | 多视角评审;白晨复核 | — | 1.5 | 甲+乙 |
| WB-68 | 阶段四界面设计(教师模块) | 教师模块的高保真原型 | 67 | 白晨看过 | — | 2 | 甲+乙 |
| WB-32 | 学生名册后端〔教师〕(切片只做粘贴名单) | 新建
app/roster/(matching.py),迁移建别名表;支持粘贴、xlsx、截图导入 |
04、30(xlsx 导入另需 10,截图导入另需 05 结论,班务记一笔另需 29) | 单:四层匹配、同名必问(变异核心)。集。端:AC-A21、AC-A23 | 是(敏感数据) | 2 | 甲 |
| WB-33 | 学生名册前端〔教师〕 | 新建 src/features/roster/ |
32、63 | 单;端:AC-A21 | 否 | 1 | 乙 |
| WB-34 | 课表与校历 | 新建
app/timetable/、src/features/timetable/ |
04、17、18、68 | 单:进度对表、下一节。集。端:AC-A21、AC-A22 | 否 | 2.5 | 乙 |
| WB-35 | 开学初始化向导(教师第一次打开) | 在 src/features/onboarding/(WB-76
建)加教师两问、入门清单与课表、名单导入 |
32、34、76 | 端:AC-A21 | 否 | 1 | 甲 |
| WB-36 | 学生档案〔教师〕 | 新建
app/profiles/、src/features/profiles/ |
21、32 | 单:按用户时区算周界。集。端:AC-A23 | 是(敏感数据) | 2 | 甲 |
| WB-37 | 课后口述拆分 | app/timetable/debrief.py |
21、34、36 | 端:AC-A22 | 否 | 1.5 | 乙 |
| WB-38 | 一人一页与会后按人回写 | app/profiles/report.py;app/meetings/
加按人拆分 |
22、26、36 | 单:引用校验、记录不足标出。端:AC-A24 | 是(敏感数据) | 2 | 甲 |
| WB-39 | 家长沟通 | 新建
app/parents/、src/features/parents/ |
19、30、32、36 | 端:AC-A25 | 是(敏感数据) | 2 | 乙 |
| WB-40 | 学校填报:拆任务 | 新建 app/school_tasks/ |
15、19 | 端:AC-A18 | 否 | 1 | 甲 |
| WB-41 | 学校填报:预填与比对 | app/school_tasks/prefill.py |
09、10、29、40 | 单:对照与差异(变异核心)。集。端:AC-A18 | 否 | 2 | 甲 |
| WB-42 | 接龙(基础)与回执比对 | 新建 app/polls/、src/features/polls/ |
04、32 | 单:差集。端:AC-A26 | 否 | 1.5 | 甲 |
| WB-43 | 班级日常 | app/roster/attendance.py;家长版通知改写;未回执名单附私信草稿 |
29、39、42 | 端:AC-A26 | 否 | 1 | 乙 |
| WB-71 | 化名试跑数据与提示〔教师〕 | app/cli.py
加一条命令,载入化名示例数据(名单、随手记样例);名册、档案页面常驻「请勿录入真实学生信息」提示 |
32、36 | 单;端:补充(页面提示可见);命令行部分照 cli.py:34
的写法豁免 |
否 | 0.5 | 乙 |
| WB-45 | 阶段四收口与发布 | 收口档案、矩阵、发布 | 本里程碑全部 | make check、make mutation 全绿 |
— | 1.5 | 甲+乙 |
M4(P1)
| 编号 | 标题 | 动哪些文件、新建哪些包 | 前置 | 验收(含端到端覆盖) | 风险区 | 估时 | 负责 |
|---|---|---|---|---|---|---|---|
| WB-69 | M4 设计稿 | docs/specs/…-M4-design.md+实现计划 |
45 | 多视角评审;白晨复核 | — | 1.5 | 甲+乙 |
| WB-70 | M4 界面设计 | P1 功能的高保真原型 | 69 | 白晨看过 | — | 1 | 甲 |
| WB-46 | 周报(Y05) | app/documents/weekly.py |
15、17、22、26 | 端:AC-A30 | 否 | 1 | 乙 |
| WB-47 | 项目模板、步骤、材料缺口(Y15) | app/projects/templates.py 与前端 |
15、24、29 | 端:AC-A34 | 否 | 1.5 | 甲 |
| WB-48 | 求职看板(Y08) | 截图认出是哪家公司,原地更新那一行 | 19、47 | 端:AC-A31 | 否 | 1.5 | 甲 |
| WB-49 | 联系人的纪念日、承诺、礼物候选(Y13) | app/contacts/ 与前端 |
17、30 | 端:AC-A33 | 否 | 1 | 乙 |
| WB-50 | 公开分享页、用空档投票定时间、AA(Y12) | 新建 app/polls/share.py、免登录页面路由 |
17、42 | 单:令牌、限流。端:AC-A32 | 是(新风险区) | 2.5 | 乙 |
| WB-51 | 抽本人排班与监考,考试周节点成待办(T06) | app/timetable/extract_mine.py |
34 | 端:AC-A35 | 否 | 1.5 | 乙 |
| WB-52 | 调代课与课题顺延(T10) | app/timetable/ |
51 | 端:AC-A36 | 否 | 1 | 乙 |
| WB-53 | 期末评语(T17) | app/profiles/comments.py |
38 | 端:AC-A37 | 是(敏感数据) | 1 | 甲 |
| WB-54 | 机构课后反馈与课时包(T20) | 记录表加扣减、家长反馈草稿 | 29、37、39 | 端:AC-A38 | 是(敏感数据) | 1.5 | 甲 |
| WB-55 | 文档读飞书文档 | app/documents/external.py |
22 | 集:模拟飞书。端:补充 | 否 | 0.5 | 乙 |
| WB-56 | 公共检索 | 新建 app/search/(加密字段不参与检索) |
主要模块 | 单;集;端:补充 | 否 | 1 | 甲 |
| WB-57 | 手机网页收集入口 | 响应式收件箱页、Android PWA 分享目标 | 19 | 端:补充(窄屏) | 否 | 1.5 | 乙 |
| WB-58 | 演示 Agent 写操作改走待拍板 | app/agent/tools.py、loop.py;改 AC-A13
的场景;去掉 WB-60 的开关 |
06、60 | 端:AC-A39 | 是(Agent) | 1.5 | 甲 |
| WB-59 | 阶段五收口与发布 | 收口档案 | 本里程碑全部 | make check、make mutation |
— | 1.5 | 甲+乙 |
后续:真实学生数据入库前(不在首批排期,见 K6 清单)
| 编号 | 标题 | 动哪些文件、新建哪些包 | 前置 | 验收(含端到端覆盖) | 风险区 | 估时 | 负责 |
|---|---|---|---|---|---|---|---|
| WB-11 | 账号准入:邀请制 | app/identity/service.py
加「只允许受邀名字注册」,用部署开关区分试跑与演示;app/cli.py
加
invite、reset-password、disable-user;迁移号届时分配;端到端夹具预先建好用户 |
K6 清单第 1 项 | 单;集:没受邀被拒、停用后会话失效。端:AC-A40。命令行部分照
cli.py:34 的写法豁免端到端 |
是(身份) | 1.5 | 甲 |
| WB-61 | 字段加密 | 新建
apps/api/app/crypto/;apps/api/pyproject.toml
加 cryptography;app/config.py
加密钥配置(repr=False) |
02、K6 清单第 1 项 | 单:加解密、换密钥、坏密文报错。集:库里存的是密文。端:经 AC-A23 命中 | 是(敏感数据) | 1 | 甲 |
| WB-44 | 送模型前脱敏、导出与删除我的数据 | 新建 app/extract/redact.py
并接入名册;新建导出与删除接口 |
32、36、61 | 单:脱敏回填。集:假网关收到的请求里没有学生姓名。端:AC-A29;补充(导出与删除) | 是(敏感数据) | 1.5 | 甲 |
建议纳入变异范围(only_mutate)的核心文件:
app/approvals/service.pyapp/invocation/service.py(已经在范围内,写能力判定要有用例杀掉变异体)app/calendar/slots.pyapp/files/diff.pyapp/files/text.py的限额判定app/roster/matching.pyapp/school_tasks/prefill.pyapp/today/suggest.pyapp/objects/service.py
后续组做的时候,再把 app/extract/redact.py 和
app/crypto/ 加进去。
附录 C AC 预分配与场景名
- AC 编号从现有最大号 AC-A13 往后顺延,下表只是预分配,以实施时实际登记的为准。
- 〔回归 P0〕〔回归 P1〕是场景的回归等级标签(底座
.claude/rules/gherkin.md:24:只决定回归时先跑哪些),和产品优先级 P0/P1 是两回事。比如 Y02 的「时间安排建议」标〔回归 P1〕,它仍属于产品 P0 范围。 - 场景默认集成层和端到端层都跑。
| AC | 验收要求(一句话) | 场景文件:场景名〔回归等级〕 | 实现项 |
|---|---|---|---|
| AC-A14 | 周例会:会前一页列出上次没完成的待办;导入转写后得到纪要,以及带出处的待办草稿 | 会议闭环.feature:上次例会留下的待办出现在本次会前一页〔回归
P0〕;导入转写稿后得到纪要与带出处的待办草稿〔回归 P0〕 |
26、27 |
| AC-A15 | 年级组会:只列与本人有关的遗留;会后布置给本人的事成待办,要交学校的事成填报 | 同上:年级组会只列出与本人有关的遗留事项〔回归 P0〕;会上要交学校的事成为学校填报〔回归 P1〕 | 26、27、40 |
| AC-A16 | 打开桌面,顶部「今天」简报显示今天的日程、到期和逾期的待办,以及放进空档的建议 | 今日一屏.feature:打开桌面看到今天简报里的日程与到期待办〔回归
P0〕;到期待办被建议放进当天空档〔回归 P1〕 |
15~18、28、79 |
| AC-A17 | 投进来的东西拆成草稿,核对后落成对象;改期通知经确认后改掉原日程 | 统一收集.feature:群通知截图拆成待办与日程草稿〔回归
P0〕;改期通知进来时原日程改期〔回归
P1〕;分错的条目改归后按新类型落地〔回归 P1〕 |
19、20 |
| AC-A18 | 学校通知拆成填报待办;表格按底表预填并标出不一致;点「已交」后完成 | 同上:学校通知拆成填报待办〔回归 P0〕;表格按底表预填并标出不一致〔回归 P0〕;点已交后填报待办完成〔回归 P1〕 | 40、41 |
| AC-A19 | 上传整个文件夹后逐份出摘要、按项目分组;重新上传时标出差在哪 | 工作文件夹.feature:上传整个文件夹后逐份出摘要并按项目分组〔回归
P0〕;重新上传改过的文件标出差在哪〔回归 P1〕 |
24、25 |
| AC-A20 | 随手记按主题调出后整理成文档,每句能点回原记录 | 随手记与文档.feature:随手记按主题调出并整理成文档〔回归
P0〕;文档每句能点回原记录〔回归 P0〕 |
21~23 |
| AC-A21 | 导入课表、名单、校历后,建好课节、班级、编号和教学计划 | 开学与课表.feature:导入课表名单校历后建好课节与班级〔回归
P0〕 |
32~35 |
| AC-A22 | 课后口述拆成反思、学生观察、进度标记;落后时标黄 | 同上:课后口述拆成反思观察与进度〔回归 P0〕;进度落后时标黄〔回归 P1〕 | 37 |
| AC-A23 | 随手一句认领进学生档案;每周列出没有记录的学生 | 学生档案.feature:随手一句认领到学生档案〔回归
P0〕;每周列出没有记录的学生〔回归 P1〕 |
36 |
| AC-A24 | 家长会前每人一页,逐句标出来源;会后按人写回档案 | 同上:家长会前每人一页逐句标出来源〔回归 P0〕;会后纪要按人写回档案〔回归 P1〕 | 38 |
| AC-A25 | 私信截图认出家长和学生,进待回;回复里答应的事成待办 | 家长沟通与班级日常.feature:家长私信截图认出家长与学生并进待回〔回归
P0〕;回复里答应的事成为待办〔回归 P1〕 |
39 |
| AC-A26 | 一句话考勤进班务记录;回执截图比出没回执的人 | 同上:一句话考勤记进班务记录〔回归 P0〕;回执截图比出未回执名单〔回归 P0〕 | 42、43 |
| AC-A27 | 写能力只在用户确认后执行;拒绝后外部不变;卡片和对话框不能直接写 | 待拍板.feature:确认后飞书日历出现日程〔回归
P0〕;拒绝后外部系统不变〔回归 P0〕;卡片与对话框调写能力被拒〔回归
P0〕;执行失败显示原因且不自动重试〔回归 P1〕 |
06、07、60 |
| AC-A28 | 别人的对象、文件、待拍板项查不到也改不了 | 数据归属与隐私.feature:他人的对象与文件不可见〔回归
P0〕 |
02、09 |
| AC-A29 | 〔后续组〕送模型的内容里学生姓名已换成编号,结果里换回姓名 | 同上:送模型的内容不含学生姓名〔回归 P0〕;真实学生数据入库前才登记 | 44 |
| AC-A30~A38 | P1 场景各一条:Y05、Y08、Y12、Y13、Y15、T06、T10、T17、T20 | 实施时各建场景 | 46~54 |
| AC-A39 | 演示 Agent 的写操作先进待拍板(AC-A13 的场景跟着改) | 对话框与演示Agent.feature |
58 |
| AC-A40 | 〔后续组〕关闭开放注册后,没受邀的名字登录被拒,停用的账号进不去 | 演示账号与登录.feature;真实学生数据入库前才登记 |
11 |
| AC-A41 | 第一次打开回答两问后,推荐的卡片放上桌面,今天简报条显示入门清单 | 第一次打开.feature:青年人回答两问后桌面放好推荐卡片〔回归
P1〕;教师场景随 WB-35(选 5.3 第 1 项 A 时随 WB-78)补 |
76、35 |
附录 D 与方案不一致或方案没覆盖的地方
- 「后台·待建设」的归因:方案归因于底座没有后台触发。实际上工作台后端可以自己跑后台作业(WB-03)。真正缺的是把事情推到用户眼前的通道,这正是要向底座提的「触发」需求(1.4 第 2 项)。
- 账号:方案没提。现状是登录即注册(
apps/api/app/identity/service.py:78-96)。白晨 10-10 定首批保持不变,放真实数据前必须改(WB-11)。 - 写操作的保证:方案的原则是「写出去先拍板」,现状有三条绕行路径(1.1),要靠 WB-60 封堵。
- 口述与截图:没有语音识别来源,按输入法语音转文字处理。截图依赖多模态模型,用国产还是海外模型由探针对比后定(白晨 10-10)。
- 飞书前提:C 端用户未必用飞书,教师多用钉钉,首批的日程和会议以原生数据为主。
- 溯源强度:工程上只能保证引用存在、属于本人。
- 教材目录预置:这是内容工作,首批由老师自己粘贴课题目录。
- 学校填报格式:首批只支持单张 xlsx、首行表头。
- 公开分享页:方案没提免登录入口的安全问题和家长个人信息的收集,本文放在 P1。
- 本机与云端:方案里「计算在本机做」「名册只存本机」首批都不成立。白晨 10-10 定首批不存真实学生数据,只用化名或模拟数据,见 K6。
- 方案没写到的工作:部署、界面设计、试跑度量、文件安全、模型成本。本文都补成了待办项(WB-62、63、65、68、70、66、10、05)。
- 伟华「先做前端(可以是假的)」:本文按真实实现来拆,假前端用本周的原型代替。
- 界面结构:方案写的是今日一屏做首页、待拍板台单独成页;白晨 10-10 接受汇报稿的重构(桌面即今日、无左栏、全部模块、卡片点开成整页、「+ 收进来」),本文按汇报稿拆(WB-07、08、28、73~77)。原生卡三种尺寸、拖动换位、放大转场、「为你推荐」、手机底部页签按汇报稿第五节放到以后(尺寸的部分提前见 5.3 第 2 项)。
附录 E 技术风险与对策
| # | 风险 | 对策 |
|---|---|---|
| 1 | 截图读不准,6 个 P0 场景受影响 | 首周做探针,国产与海外模型一起比;都不行就改走 OCR,或者首批只收文字和文件 |
| 2 | 模型成本和限流:每个试跑用户每天要花多少钱还不知道,网关可能返回 429 | 探针时实测每次调用的 token 数,算出每人每天的成本;抽取管线做退避重试,加每用户和全局的每日预算 |
| 3 | 抽取不准 | 抽取结果一律先进待拍板;纠正率由 WB-66 采集 |
| 4 | 学校表格五花八门 | 首批只支持单张 xlsx、首行是表头 |
| 5 | 名字对错人 | 低置信度和同名必须由人确认,可以撤销 |
| 6 | 溯源只能证明引用存在 | 界面上并排显示原文,不宣称「已核实」 |
| 7 | 有恶意或畸形的文件 | 类型白名单;解析放在子进程里,设超时和内存上限;限制大小与配额 |
| 8 | 写操作绕过待拍板 | WB-60 在 invoke_for_user
统一封堵,用端到端场景验证三条路都被拒 |
| 9 | 公开分享页滥用 | 放在 P1。令牌不可猜、可撤销,并限流 |
| 10 | 估时偏乐观 | 余量 30%;先做切片拿到真实反馈;裁剪按回归等级
@P0 → @P1 进行,不裁测试层 |
| 11 | 开放注册(白晨 10-10 定首批保持):任何人输入新名字就能注册,消耗模型额度、占用存储 | 全局每日模型预算与每人存储配额(WB-04、WB-09);试跑地址不公开传播;放真实数据前必须改成邀请或白名单(WB-11) |
| 12 | 老师在化名环境里录入了真实学生信息 | 名册、档案页面常驻提示,试跑说明写明要求,提供化名示例数据(WB-71);试跑库在真实数据入库前清理或隔离(K6 清单第 7 项) |
| 13 | 探针选了海外模型,数据会出境 | 首批只有化名和试跑用户自己的数据;真实学生数据入库前,重新确认能否送海外模型(K6 清单第 1 项) |
附录 F 原型章节在首批哪个阶段能用
对照样板间原型的两条故事线(章节见汇报稿第四节)。日期按第四节现排;选 5.3 第 1 项 A 时在括号里注明。
| 线 | 章节 | 首批哪个阶段能用 |
|---|---|---|
| 教师 | 1 考勤 | 完整要到阶段四(WB-43) |
| 教师 | 2 课后说两句 | 阶段四(WB-34、37);「本周还没记过」的计数阶段一就有(WB-36) |
| 教师 | 3 家长私信 | 阶段一能截图认人、生成待回待办;完整要到阶段四(WB-39) |
| 教师 | 4 年级组会 | 阶段三(WB-26、27) |
| 教师 | 5 教务处通知与填报 | 阶段四(WB-40、41) |
| 教师 | 6 接龙比对 | 阶段四(WB-42) |
| 教师 | 7 一人一页、8 家长会后按人写回档案 | 阶段四(WB-38) |
| 教师 | 末章 第一次打开 | 阶段四(WB-35);选 A 时阶段一就有两问与入门清单,不含课表(WB-78) |
| 青年 | 1 日程「就这样排」写飞书 | 阶段二(WB-17、79;选 A 时原生日程阶段一就有) |
| 青年 | 2 转进来自动拆分 | 阶段一(WB-19) |
| 青年 | 3 周会 | 阶段三(WB-26、27) |
| 青年 | 4 文件夹 | 阶段二(WB-25) |
| 青年 | 5 随手记整理成文 | 阶段三(WB-23) |
| 青年 | 6 改期截图 | 阶段三(WB-20) |
| 青年 | 7 一天小结 | 今天简报阶段一(WB-28),日程部分阶段二 |
| 青年 | 末章 第一次打开 | 阶段二(WB-76) |