日期:2026-10-14。分支 feat/home-workbench(集成工作树
.claude/worktrees/home-int),从 develop
拉出;10-14 晚再同步到
origin/develop=72571e78(同步与复跑见 2A
节,此前各节的数字是 ef483c38
基线上的)。依据:技术方案(工作区
docs/plans/2026-10-13-创业平台首页工作台技术方案.md,不在本仓库)、实施计划、改版原型
的 ?ship=1016 视图。工具分档为大档。未推送、未合入
develop。
交付结论:首页范围内的功能、三层测试与变异全部达标——首页场景在全量里
0 失败,首页改动文件三层覆盖无缺口(17 行有书面豁免),变异全部过
80%;整仓
make check/make mutation/make coverage
仍是红的,红项落在 develop
原有问题与依赖首页团团卡的团团场景上(第 3
节逐项写明哪些在基线上实测、哪些是推断)。
两套模板(自由创作者、创业者)、新用户起步布局与老用户常规布局;14
类模块按尺寸取数与呈现(今日行动、我的任务、我能接的单、学习推荐、作品与积分、消息提醒、看看别人在做什么、能力推荐,以及我的项目、我发出的单、项目中心、行业资讯、日程等占位);布局保存新增
preset、added,首读在服务层一次性写入;/me/activity
首页范围补「交付已提交」「尾款到账」;公开任务卡补
published_at;去掉首页团团卡,首页不调用任何团团或项目接口。
出处:会议原件
workbench-app/docs/meetings/2026-10-14-个人工作台原型评审与自定义方向-原件.md
第 549~593 行;解读页
knowledge/wiki/60-会议对谈/2026-10-14-首页工作台10月16日交付范围确认.md(在
master 的
013359fe,本分支没有,所以不写链接;未决问题第 88、89
项)。提交
f6f6a8de、b7d27a6d、535f1ac4、25926f8d、499d78da、2b28365c、3df2ff76。
| 调整 | 怎么做的 | 守护的测试 |
|---|---|---|
| 添加模块不再列「日程 · 即将上线」 | 目录项加 listed 字段,日程、能力推荐标
false;类型与后端契约不动,存过这两张卡的旧布局照常渲染 |
单元 rules/panels.test.ts、catalog
穷举;端到端 AC-101、AC-211 |
| 页面不显示「自由创作者模板」字样 | 浏览态删去模板标签;一次性入口「自己负责项目?换成创业者模板」单独成行;编辑态托盘与模板面板仍显示模板名(两套模板与定名不变) | 端到端 AC-101、198、206、209、210 断言标签原位置没有节点、网格前只剩一次性入口 |
| 创业者模板去掉能力推荐 | 常规布局 actions 2×3 → myprojects 1×4 → orders 1×2 → messages 1×2 → feed 2×1;起步布局 myprojects 2×2 → actions 1×1 → orders 1×1 → feed 2×3 → messages 2×2;四列、两列都无空洞 | 单元 rules/templates.test.ts 逐张落位;端到端
AC-206、210、211 |
| 我的项目与我发出的单同为「敬请期待」、不接接口 | 我的项目由「项目功能即将上线」改为「敬请期待」,说明「以后在这里看到你负责的项目建到哪一步。」;两张卡都不发请求 | 单元 MyProjectsWidget.test.tsx;端到端
AC-210(含不请求项目与团团接口) |
能力推荐卡本身保留,只在旧布局里出现;AC-107
的十三类矩阵仍覆盖它,并补断言说明弹层里不出现「团团」「你的项目里」(3df2ff76)。浏览器回归:首页组
46 条通过,四处调整各注入一次缺陷都变红(台账
task-1014-e2e-report.md)。顺带修了门禁工具:make mutation-changed
原先只按字面量比对变异范围,改了 workbench/rules/*.ts
会静默不跑(9ef345c5,tools/tests/test_affected.py
有用例)。
运行目录都在集成工作树的
.artifacts/testing/home-workbench-1016/ 下。
| 检查 | 运行目录 | 结果 |
|---|---|---|
make check |
20261013T175459.271443Z-…(提交
130cd521) |
退出 2。后端单元 2880、集成 223 全过;前端单元 2837/2839(2 例为
develop 原有);端到端 492 过、21 失败、4
未跑;覆盖与矩阵阶段因前序失败未产出数字;端到端覆盖还因同一轮客户端重生成与浏览器测试并行被拒发布 |
lint-api 余项 |
手工补跑(提交 e3909fe4;日志
.artifacts/evidence-home-closing/lint-api-rest.log) |
ruff check 停在 develop 原有 E501;补跑
ruff format --check 608 文件通过、lint-imports
24 条全守住、mypy app 1 错在
app/executors/tests/test_router.py:216(本分支未改
executors) |
| 最终取证 | 20261013T220149.773478Z-…(提交
835ea85b;脚本存于
.artifacts/evidence-home-closing/home-evidence.sh:后端单元、集成、前端单元排除
ExecutionWorkspace.test.tsx、单跑
make e2e、make coverage、make matrix,各步用
; 串接,所以记录里的退出码 0 不代表通过,各步退出码见
stdout 里的 [evidence] 行:unit-api 2、integration
0、unit-web 1、e2e 2、coverage 2、matrix 2) |
集成全过;后端单元全过、覆盖 98.67% 未达 100%(缺口在 develop
文件);前端单元 2842/2842 通过,整仓覆盖 97.32% 未达 100%(排除了
ExecutionWorkspace.test.tsx,且 develop 的
ProjectPlanTask* 等文件本无单测);端到端 494 过、21
失败(与上行同一批团团场景)、4 未跑;make coverage 被
develop 原有失效标注拦(见第 3
节),按同一流程跳过该条做诊断合并(脚本
.artifacts/evidence-home-closing/diagnostic-merge.py,结果
merged-diagnostic.json 同目录):本分支改动文件只剩 3
行缺端到端层;验收矩阵已重新生成 |
| 剩余 3 行补证 | home-e2e 工作树
.artifacts/evidence-home-cov-20261014T065144/(提交
d1749daa,make e2e-recheck GREP='AC-115|AC-126'
9 过) |
ProfileWidget.tsx:106 由 AC-115
命中;该场景的注入已固定落在保存前的身份确认上并断言走身份恢复态(提交
b7c008ca),连跑 3 次都命中(home-e2e 工作树
.artifacts/evidence-ac115-20261014T070528/);activity/service.py:69-70
由 AC-126 命中(全量里 AC-126
所在的全量统计项目因前序失败整组未执行) |
make mutation |
20261013T190411.026687Z-…(提交
bd83fd53) |
退出 2。后端 82.2%;前端 42 批跑完,末批
lib/tuantuan-conversation.ts 44.12%
低于批门槛,未产出合并报告;手工合并 42 批后跑复核,被前端单元的
develop 原有失败用例拦下(Stryker
初跑有失败用例),没有复核后总分(该次复核日志存于
.artifacts/evidence-home-closing/home-mut-tail.log,未进运行目录) |
首页范围的变异得分(分批结果,复核前,是下界):前端
features/workbench 99.0%(1189/12);后端 workbench
86.6%、activity 98.6%、courses 85.7%、deliveries 89.9%、settlements
83.0%、claims 85.1%、tasks 88.7%。
首页范围的三层覆盖:前端 src/features/workbench 52
个源文件单元层四项 100%(提交
835ea85b);本分支改动的前后端文件在诊断合并里除上述 3
行外无缺口,3 行已补证;书面豁免按缺口行计 17 行(防御性分支
11、整页跳转导致计数丢失 6;按合并工具的可度量行口径是 21 行,差在
retry.ts:14-30 一段),逐行理由见各行
cov: skip 标注。
835ea85b
之后没有改产品代码,改动是:d1749daa、b7c008ca(AC-115
端到端步骤,3 次单跑作证,见上表);2eecbfde(门禁工具
tools/ci/check.py、tools/testing/summarize.py
及其测试,在提交 56380f87 上补跑
make tools-test:运行目录
20261013T231342.041335Z-…,pytest 831 过、18 跳过、tools
覆盖 100%,node 85 过;make lint-tools 日志
.artifacts/evidence-home-closing/lint-tools-56380f87.log);以及本档案、验收矩阵。
develop=72571e78 后的取证(10-14 晚)develop 在 ef483c38 之后合了 17 个提交(PR
#17~#22,执行模块与团团)。工作树
.claude/worktrees/home-sync:c6a1709a
合入,冲突 1 处(widgets/unavailable.test.tsx
保持删除,它测的是已下线的首页团团卡草稿);develop 新占
AC-197(专家执行文字交付),首页场景 AC-197~212 整体平移为
AC-198~213(0e3f5454,按
.claude/rules/gherkin.md 防撞号规则)。基线是工作树
.claude/worktrees/home-polish 检出纯 72571e78
跑同样的集成与全量端到端(运行目录
home-polish/.artifacts/testing/home-workbench-1016/20261014T120404.876141Z-…,日志副本
.artifacts/evidence-home-merge/base-72571e78-stdout.log)。
| 检查 | 合并后(运行目录 20261014T105504.470252Z-…,提交
0e3f5454) |
纯 develop 基线 |
判定 |
|---|---|---|---|
| 前端 lint、type-check | 通过 | — | — |
| knip | 3
个未用导出,e2e/support/tuantuan-plan-maintenance.ts |
同(第 3 节) | develop 原有 |
| styles-gate、lint-api、lint-acceptance、tools-test | 通过(tools 832 过、覆盖 100%) | — | — |
| 后端单元 | 2927 过,覆盖 98.68% | — | 缺口在 develop 文件(第 3 节) |
| 集成 | 25 失败、2 错误、1075 过 | 25 失败、2 错误、1063 过 | 失败集合只差 test_work_walkthrough.py
里两条有状态用例互换(合并后红
test_bad_cover_rolls_back…,基线红
test_unknown_work_media…),本分支未改
works/files,判为该文件不稳定 |
| 前端单元(全量) | 4 失败、2896 过 | 团团 2 例同样失败(单跑核对) | ExecutionWorkspace.test.tsx 2
例、TuantuanAssistant.test.tsx「首页首发创建微任务…」、TuantuanAssistant.recovery-context.test.tsx「普通闲聊第二轮在途收起重开…」,均为
develop 原有 |
| 端到端(全量) | 89 失败、4 未跑、428 过 | 85 失败、4 未跑、417 过 | 合并后多出 4
条:AC-200(已修,见下);「首页想法先闲聊显式立项…」「立项前快捷回答刷新保留…」(AC-146、AC-149,从首页团团卡进入);AC-169/172「同一专家执行多次退回补交…」刷新后等不到「专家对话」页签——基线上同一症状的页签超时有
30 条,本分支未改执行模块,判为 develop 原有不稳定 |
757ef270):全量里共享库多了一单不要求认证的历史任务,紧凑封面优先取「现在就能接」组,场景原先「用户一个认证都没有」的前提被顶掉;改为给场景用户登记推荐单要求的认证。单跑
8 过(运行目录 20261014T120404.642248Z-…)。tools.acceptance.recheck 合并后生成,首页 AC-198~213
两层全部通过。develop 红文件补跑(244 文件 2862
过),与全量的后端、端到端层做诊断合并(.artifacts/evidence-home-merge/diagnostic-merge.py)。首页改动的
87 个文件只剩 3
行缺端到端:activity/service.py:69-70(AC-126,全量里被连带跳过,第
2 节已补证)、components/SignedImage.tsx:52(AC-200
单跑命中,.artifacts/coverage/web-e2e-ac200-recheck/)。72571e78
上 AC-150~157、AC-192~195 本身就是红的(develop
原有),只有 AC-146、AC-149 是去掉首页团团卡后才红。develop 原有。实测:在 ef483c38
上跑同一条命令同样红;核对:本分支没有改动相关文件,未在基线上实跑。
test_all_operations_are_checked:92≠89,develop
新增 3 个接口未改常量(核对:两边接口数都是 92)。ruff
E501:apps/api/tests/contract/test_openapi_contract.py:35(核对)。mypy:app/executors/tests/test_router.py:216(核对)。knip:e2e/support/tuantuan-plan-maintenance.ts
3 个未用导出(核对,文件与 develop 逐字相同)。tuantuan/plan_tasks.py、project_actions.py、router_v2.py、offers.py、executors/service.py、common/config.py(核对)。ExecutionWorkspace.test.tsx 2
例失败(实测,基线日志
.artifacts/evidence-home-closing/baseline-ExecutionWorkspace.log);它也让变异复核无法开始。lib/tuantuan-conversation.ts
44.12%(实测,基线批报告在 home-sync 工作树
.artifacts/mutation/batches/lib-tuantuan-conversation.json)。make coverage 被
apps/web/src/lib/project-idea.ts:54 的 cov
标注拦:其函数在 develop
上已无生产调用方,端到端构建摇树后没有可度量行(推断,依据是
ef483c38 上 git grep
无生产引用;未在基线上实跑合并)。.artifacts/evidence-home-closing/base-e2e.log)。依赖方未就绪(技术方案第五节接口约定):AC-146、AC-149~157(未在基线上实跑;失败点都在首页团团卡入口
support/tuantuan-v2.ts:70 的 homeChat),以及
develop 新增的 AC-192~195(其前置经
support/tuantuan-v2.ts 的 homeChat
从首页团团卡建计划;在 develop
上是绿的)。这些场景改从全站悬浮团团进入后即可恢复,归团团一路。
develop 的前提(白晨 10-14
晚已定:首页范围全绿即合入)21 条端到端失败里,AC-146、AC-149~157、AC-192~195 共 14
条是本分支去掉首页团团卡后才红的:AC-192~195 在 ef483c38
上实测是绿的(.artifacts/evidence-home-closing/base-e2e.log);AC-146、AC-149~157
没有在基线上实跑,是推断(失败点都在首页团团卡入口
homeChat)。技术方案第五节的接口约定是:团团一路先把这些场景的进入方式改到悬浮入口并进
develop,首页分支同步后再合;在那之前首页分支门禁里这几条按「依赖方未就绪」单列。AC-192~195
是方案写完后 develop 才加的,不在方案点名的范围里。白晨
10-14 晚定:首页范围全绿就合入 develop
并推送,develop
原有红项与这组团团场景写进合并说明,入口由团团一路改到悬浮团团。同步到
72571e78 后的实况见 2A 节:这组里只剩 AC-146、AC-149
是本分支带来的,其余在 develop 上已是红的。
终审
Minor:同一行的任务详情与封面签名重复请求、添加模块面板缩略预览真实取数;端到端前置经界面准备、造数辅助重复;tools/msw/gen-handlers.mjs
不处理 anyOf;make check-changed 的选测路径里
client
与端到端子集是否同样并行冲突未查。过程缺陷已固化:make check
的端到端阶段改为等 client
阶段(tools/ci/check.py,测试
test_e2e_waits_for_client_in_the_real_graph,make tools-test
运行目录
20261013T231342.041335Z-…),避免端到端覆盖因源码被重写而作废;测试变更清单认出
it.each
表里带嵌套括号时的标题(tools/testing/summarize.py),仍不支持的写法记在
_web_cases 文档串。「变异范围文件须有直接 import
的测试」已做成 make tools-test
里的秒级检查(tools/tests/test_mutation_web.py 的
test_every_real_mutation_source_has_a_direct_test_importer)。
make check 运行目录 summary.md 相对
develop 分叉点 ef483c38 列了 74 条「-」(场景
6、后端 4、前端 64),逐条对照 git diff ef483c38...e3909fe4
核过,全部有正当理由,没有为求绿而删的。格式:测试名 — 原因 —
接替用例。用例名统计以文件为单位,所以同名搬到新文件的用例也记作一删一增。
起因是组件测试按模块拆文件(提交 6559e4a9
及各模块任务),断言随模块改版补充,用例名不变。
WidgetContent.test.tsx 搬到
widgets/TasksWidget.test.tsx — 同名WidgetContent.test.tsx 搬到
widgets/ProfileWidget.test.tsx — 同名WidgetContent.test.tsx 搬到
widgets/InspirationWidget.test.tsx — 同名验收场景(AC 号不变,标题随新行为改):
后端(首读从「只读、返回默认八卡」改为「按有无承接写入起步或常规布局」,团团不再必留):
test_default_visit_does_not_create_layout_and_returns_exact_eight(integration)
— 首读改为写入 —
test_first_visit_writes_starter_layout_for_user_without_claims、test_first_visit_writes_regular_layout_for_user_with_claimtest_first_visit_returns_eight_default_widgets_without_writing(router)
— 同上 — test_first_visit_returns_initial_layouttest_all_ten_components_and_minimal_assistant_layout_are_valid(schemas)
— 团团不再必留、类型增到十三类 —
test_layout_without_assistant_and_empty_layout_are_valid、test_every_type_once_fits_and_duplicates_are_rejectedtest_default_get_is_read_only_and_each_caller_receives_an_independent_layout(service)
— 首读改为写入 —
test_first_get_writes_initial_layout_once_and_returns_revision_zero、test_initial_layout_returns_independent_copies(test_states.py)前端:
TasksWidget.test.tsx)ProfileWidget.test.tsx)ProfileWidget.test.tsx)InspirationWidget.test.tsx)InspirationWidget.test.tsx);「each
list shows its own read error and retries on its
own」(FeedWidget.test.tsx);「作品全部读不到时保留错误与重试」(ProfileWidget.test.tsx)LearningWidget.test.tsx);「「去学习」有学习链接时新开第一条,否则进认证页,任务专属认证带上任务」(InspirationWidget.test.tsx)b0cfef8c) —
「浏览状态只有滑杆入口;保存期间冻结所有编辑操作;恢复默认与完成各接各的回调」;「撤销、取消在网格下方托盘里,不在顶栏」(WorkbenchPage.test.tsx)rules/templates.test.ts)rules/actions.ts,同截止先比承接时间 —
「同截止先按承接时间,再按承接标识」;「空列表得空行;已完成的承接不出现」(rules/actions.test.ts)InspirationWidget.test.tsx)InspirationWidget.test.tsx)首页不再放团团卡、不调用团团接口(提交
831cd4f7,AssistantWidget.tsx
删除),被测对象不存在。全站悬浮团团的入口与交接由团团自己的测试覆盖(features/tuantuan/),不属本批。
WorkbenchGrid.no-tuantuan.test.tsx)DemoProvider、demo/state.ts
及其示例数据删除(提交
0af93e02、a0d62d14);项目中心、行业资讯、日程改为「即将上线」占位(提交
49e23be0);消息提醒改读真实动态;「任务来源」设置去掉,我的任务只列真实承接(提交
185ae043)。占位的接替用例主要是
widgets/MoreModules.test.tsx 的「%i×%i
用%s版,没有按钮和链接、不发请求、没有示例字样」(下称「占位用例」)。
DemoProvider 删除 — 无demo/state.ts 删除 — 无demo/state.ts 删除;消息读态改为真实、按用户存本机 —
data/messageReadState.test.ts
各例(如「改读态即写本机」「read state is isolated per user」)WidgetContent.test.tsx);占位用例MessagesWidget.test.tsx「三档尺寸」各例;占位用例MessagesWidget.test.tsx)WidgetSettingsDialog.test.tsx)TasksWidget.test.tsx);「我的任务没有设置入口(旧设置%j也一样)」(WidgetSettingsDialog.test.tsx)all 分支);「legacy
source assistant renders the normal task list」alignment.test.tsx)MessagesWidget.test.tsx)另:统计脚本没认出跨行写标题的
it.each(...)(...),有一条改名不在上面 74
条里——WidgetContent.test.tsx「十组件在 %i×%i
尺寸都有核心入口」改为「九类已有组件在 %i×%i
尺寸都有标题,真实模块都有核心入口」(团团卡下线,三类占位没有入口)。
docs/reports/验收矩阵.md 由最终取证的
make matrix
重新生成(场景版本见文件首行)。矩阵列出的缺口是第 3 节的团团场景,外加
AC-028、AC-036、AC-037、AC-126
四条因前序失败「未执行」;首页新增或改写的场景在两层(或仅浏览器层)都是通过。