日期:2026-10-16。工作树:.claude/worktrees/home-todo,分支
feat/home-todo-learning。起点:origin/develop
d4af33fe。需求来自白晨 10-16 在 debug
环境看完首页工作台后提的三条(经主控转达),同日追加第四条:「我的」页认证区列出还没拿到的官方认证(见文末「追加:「我的」页」)。
| 项 | 改动 | 提交 |
|---|---|---|
| 1 「今日行动」改名「待办」 | 卡片、目录(标题与说明)、模板缩影、编辑态、设置弹层、放大按钮与提示等用户可见处一律改「待办」,内部类型名
actions
不变;数据、分组、排序不动。主数字旁那句话不再以今天为中心(rules/actions.ts::actionSummary);卡头不再写今天日期(删
todayLabel);空态改为「还没有待办」 |
bf4a2558 |
| 2 空态「去「X」」点了没反应 | WorkbenchPage.tsx::focusTile
只在卡不在视口时滚(nearest,并让出吸顶顶栏),卡片亮一圈品牌黄描边约
1 秒后淡出(借原型 .tile 已有的 box-shadow
过渡,减弱动效时原型已关过渡、静态亮灭),落点补画焦点环、失焦即摘。所有空态入口(待办、消息提醒、我的任务、作品与积分、我能接的单)都经同一个
focus,一并生效 |
df0aaf18、6c4533ed、999df6c2 |
| 3 学习推荐补「可以先学的认证」 | 没有推荐但还差官方认证时,同一位置改列「可以先学这些」(认证名、说明截一行、「去学习」),各尺寸按推荐同一套排法;官方认证芯片可点进认证页;弹层里未获得的官方认证也给「去学习」;目录为空写「平台还没有开放认证」,拿齐写「认证已齐」。规则在
rules/learning.ts,learnLink 改为只读
id/task_id/learning_links,官方定义与任务要求里的认证直接共用 |
ab017772 |
文案最终写法:
AC.md 来源列注明「10-16
界面名改为「待办」,标题保留作对账主键」。工作台-布局保存(3
句)、浏览器-今日行动跨页承接(功能名与 1
句;文件名不改)、浏览器-工作台组件(2
句)、浏览器-首页工作台模块(AC-201、AC-209 共 5
句),集成层 test_工作台.py 与端到端步骤定义同步。@P1,文件级
@e2e-only):浏览器时刻拨到全部公开任务截止之后(页面上一单都接不了,服务端数据不改),核对卡上「可以先学这些」按目录顺序、每行去学习去处、弹层里本场景建的两门认证(带课程新开、无材料进认证页)、1×1/横条/宽
1 高 2 三种尺寸、芯片点进认证页。分档:tools.ci.affected --tier --base origin/develop --business-rule
判大档(改了
e2e/support/*,共享基座),应跑 make check +
make mutation,本轮都没跑完,见下节。留证目录
.artifacts/testing/home-todo-learning/。
| 范围 | 结果 | 证据 |
|---|---|---|
| 工作台单测(47 个文件) | 643 通过 | 20261016T082225.950812Z-2dd0e98c3e1347578fcf9dc1954b7231 |
| 本任务改动文件的单元覆盖 | 全部 100%(行、分支、函数、语句);同目录未达 100%
的只有另一子代理在改的
widgets/variants/*、FeedWidget、InspirationWidget
与未改动的 FitList |
同上(--coverage.include
限定工作台目录,全局阈值因而报红,不作门禁数字) |
| 前端全量单测 | 3080 通过、3
失败,失败都在已知基准红名单内(ProjectConversationRead、ProjectLegacyRoute、TuantuanAssistant.recovery-context;TuantuanAssistant.test.tsx
本次通过) |
20261016T081811.196654Z-02c0192ea4254449a476d8b3f8d30800 |
变异(make mutation-changed) |
分批:actions.ts 97.75、learning.ts
100、opportunities.ts 96、templates.ts
98.43、time.ts 100,均 ≥ 80;8
个存活都在本任务没改的行(GROUP_ORDER、shownCount、groupRows、templates.ts
网格计算)。存活复核那步跑全量用例,被基准红名单里的
ProjectLegacyRoute.test.tsx 卡住,未出复核分 |
20261016T080610.921302Z-8385f8249f6b429a9fc80acbacd4d674 |
| ESLint、TypeScript(三份 tsconfig) | 通过;knip 报 3 个
e2e/support/tuantuan-plan-maintenance.ts
未用导出,origin/develop 上已存在,不归本任务 |
20261016T082521.242906Z-104e23a0c56742b8a56d3acde503e425 |
| 契约 | 通过 | 20261016T082547.548450Z-7701a6ed471e408bbbdcdb045d063912 |
| 场景 lint、专属用户、映射表 | 通过 | 20261016T082728.538122Z-42f8e4ec0d234b03b850cec0567c69cb;tools.acceptance.users、affected --lint
当场输出 |
| 工具测试 | 命令本身退出 0;run.py
因运行期间源码指纹变了(同工作树另一子代理在改文件)判 1 |
20261016T082604.889277Z-8635310976084b1eb2b8cf83762eaaf9 |
集成层(test_工作台.py、test_schemas.py) |
100 通过(改名后的步骤绑定) | 当场输出,未留证 |
| 样式门禁 | 通过 | 当场输出,未留证 |
| 本机预览实测 | 1440×900 与 390 宽、亮暗两色:待办改名与句子、无卡头日期;空态跳转后描边亮约 1 秒淡出、焦点环可见,手机宽度从下方点能滚回并让出顶栏;学习推荐「可以先学这些」六种尺寸、弹层「去学习」 | 截图在 /tmp/vos-preview/shots-a/(不入库) |
dev-preview
工作树的 8000 后端)占着端到端写死的 fake 服务端口
9800/9801/9810,playwright.config.ts 的
reuseExistingServer:false,一启动就报端口已用;按要求没停预览,已报主控。因此
AC-225、改过的 AC-209
与改名步骤都没在浏览器层实跑,新断言的缺陷注入也没做,三层覆盖与验收矩阵没有更新(make matrix
需要两层结果输入)。make check、make mutation
全量未跑(大档要求),原因同上。主控定(10-16):端到端与全量未跑,留待收口,在白晨选定方案、合并后的最终代码上统一跑一次。make e2e-recheck GREP=,按场景标题或功能名匹配;本工作树要带
COMPOSE_PROJECT_NAME=venture-os 复用已在跑的库):
首页工作台各模块|第一百零一条最早截止任务|拒绝重复组件或越界的布局|存过只有团团卡的旧布局|占位模块隔离键盘触发|十三类组件在十六种尺寸下。
前五个是本任务改过步骤或新增的场景(含 AC-201、AC-209、AC-225,以及
AC-104、AC-199、AC-114、AC-122);最后一个十六尺寸遍历没改步骤,但它用十三类组件的标题定位,标题改名后要确认。m-enter
动画,另写 animation
被它压住、摘掉时还会让它重放,改借原型已有的 box-shadow 过渡。features/identity/MeCertificationsToLearn.tsx,由
MeCard.tsx 放进新的 .me-aside
列):只列官方认证(无
task_id),按目录顺序;每项是认证名(进认证页)、说明(截两行)和「去学习」(有学习材料新开第一条,没有进认证页)。标题旁写「还差
N
项」;官方都拿齐写「官方认证已齐」;目录里没有官方认证时整块不出;目录或本人记录读失败显示原因与「重新读取认证列表」,不当成「已齐」。src/lib/certification-learning.ts:certificationHref、learnLink、officialChips、OfficialChip(两个业务域不能互相
import)。features/workbench/rules/learning.ts、opportunities.ts
原地转出,首页的调用方不动;对应单测随函数搬到
src/lib/certification-learning.test.ts。新文件加进变异范围(stryker.config.mjs
与 tools/ci/mutation_web.py 两处)。coursesQuery(目录)与
myCertificationsQuery(本人记录),routes/me.tsx
的 loader 补预取目录;本人记录原本就预取。styles/bridge/me.css 加 .me-aside
与 .me-learnable-*,沿用原型
.card.me-section/.me-section-title/.me-account-note/.me-balance-error
与既有颜色变量,没有新颜色;窄屏「去学习」点击区 40px 高。@e2e-only @P1),放在
前台浏览与课程认证.feature(「切换账号」那条之后):管理员另建一门带课程链接、一门没有学习材料的官方认证;创作者认证第一门课程后打开「我的」页;期望从页面这次读到的目录与本人记录算(只列官方、去掉已拿到、目录顺序),核对条数、「还差
N
项」、不含刚认证的课程;认证名链接、带课程的「去学习」新开课程地址(target=_blank、rel=noopener noreferrer)、无材料的进认证页。只断链接地址,不点开外网。apps/api/pyproject.toml 的 markers;集成层收集 19
条、此条按 @e2e-only 取消选择(当场
--collect-only 确认)。tools/ci/affected.toml
的前端 identity 域挂上这个文件。端到端步骤在
e2e/steps/courses.ts,前置动作在
e2e/support/courses.ts::prepareMeLearnableCertifications,场景状态
world.meLearnable;npx bddgen
生成无缺步骤。courses.ts「当前账号的我的页不显示上一账号的认证」等步骤按标题名断言动态里有无某门认证,若新清单也用
h3,换账号后那门认证出现在「还没拿到」里,原断言会误红。单测里加了「这一块没有
h3」的断言,先改回 h3 确认它红。分档仍是大档(MeCard.tsx
属权限风险区、pyproject.toml
共享基座、stryker.config.mjs 门禁资产、跨
identity/workbench 两域)。留证目录同上。
| 范围 | 结果 | 证据 |
|---|---|---|
新增单测(MeCertificationsToLearn.test.tsx 5 例) |
先红后绿:实现前 5 例全红;认证名去标题那条断言改回 h3 时红 | 当场输出 |
| 前端全量单测 | 3087 通过、3
失败,均在基准红名单(ProjectConversationRead、ProjectLegacyRoute、TuantuanAssistant.recovery-context);覆盖阈值因此未出数 |
20261016T092957.842719Z-87fc3814a523408dadc9573da2703766 |
| 本次改动文件的单元覆盖 | lib/certification-learning.ts、MeCertificationsToLearn.tsx、MeCard.tsx、routes/me.tsx、rules/learning.ts、rules/opportunities.ts
行、分支、函数、语句全部 100% |
31 个相关测试文件 339
例通过:20261016T093504.025057Z-48dfa903cdbc4d7499dd1cda601bbe53(命令退出
0,运行期间另一子代理改了源码,记录判 1);逐文件百分比为当场
json-summary 输出 |
| ESLint、TypeScript(三份 tsconfig) | 通过;knip 报 4 个未用导出:3 个
e2e/support/tuantuan-plan-maintenance.ts(origin/develop
已有),1 个
widgets/variants/feedParts.tsx::Reward(另一子代理在改的文件),都不归本任务 |
20261016T093712.035744Z-14d338c945e147ce913510b0adfcf151 |
| 样式门禁 | 通过 | 20261016T093710.190490Z-297e6e695815413ebc14fbd65c39d977 |
工具测试(改了
mutation_web.py、affected.toml) |
通过,100% 覆盖 | 20261016T093741.907779Z-df2fb3e1eaa34abc9d771ab20d4c5c95 |
场景
lint(--base origin/develop)、专属用户、映射表 |
通过 | 20261016T093841.467451Z-c3f7ca22dbaf4ae7bf127081a59a9bab;tools.acceptance.users、affected --lint
当场输出 |
变异(make mutation-changed) |
分批:certification-learning.ts 100(30
个变异体全杀)、learning.ts 100、time.ts
100、actions.ts 97.75、templates.ts
98.43、opportunities.ts 94.29(函数搬走后分母变小,2
个存活在本任务没改的行),均 ≥ 80。存活复核那步跑全量用例,这次被
tuantuan/ProjectNudge.test.tsx「可见性回调排队期间切后台……」(observe is not a function,团团域,非本任务)卡住,未出复核分 |
20261016T093855.300051Z-84dfeebae1aa4ec0be303cf853ee79f8 |
| 本机预览实测 | 4210 uc-demo-worker(2 项认证)列出另 2
项;uc-demo-newbie(0 项)列出 4
项,含一门无说明的认证(不留空段落);4211
uc-variant-full(4 项全齐)写「官方认证已齐」。1440 与 390
宽、亮暗两色都看过,桌面在右栏顶部、手机在个人动态之后账户卡之前 |
/tmp/vos-preview/shots-a/me/(不入库) |
make e2e-recheck GREP=:我的页在已获得的认证之外|切换账号不展示前一账号的课程认证|提交后锁定并在刷新与我的页保持认证|身份与课程读取失败后可在原页面恢复(新场景,加上同文件里会打开「我的」页的三条,确认新块不干扰它们的断言)。与前文那串合起来一次跑即可。docs/reports/验收矩阵.md
没重生成:make matrix
要两层的运行结果作输入(.artifacts/acceptance/api.json、web.json),本轮
AC-225 与 AC-226 两个新场景都要等收口全量后再生成提交。me.html
没有这一块,视觉对照(qa/formal-ui 的 account
状态)里属新增内容;那份夹具若没配
/api/certifications,会截到读取失败态,收口跑对照时留意。<a>:认证页链接与首页学习推荐、个人动态里的写法一致,整页跳转。白晨 10-16 在预览里定了两张卡:「我能接的单」平台上没有开放的单时用方案 A「学习引导」(有开放的单时不变);「看看别人在做什么」全部尺寸换成方案 B「主次」。照定稿接受:主图是最新一条带封面的动态(可能比清单第一条旧)、三步里写死「上传认证截图」、3×4 与 4×4 卡底约 90~140px 留白。设计与文案不改。
widgets/variants/
下
FeedCards、FeedSplit、FeedSpotlight、InspirationEmptyGuide、SizeGallery、VariantSwitcher、feedParts、store),routes/home.tsx
回到 develop 写法,variants/ 目录不再存在。widgets/FeedWidget.tsx
整体换成「主次」版式;widgets/InspirationLearn.tsx(学习引导)由
InspirationWidget
在「读到任务且没有开放的单」时接管;示意块搬到
widgets/FuturePreview.tsx。尺寸与内容怎么排的判断全部收进
rules/feed.ts(feedShape、pickHero、feedRowCap、stripGroups、segmentOrder、feedQuietPlan)与
rules/opportunities.ts(learnGuide、learnCopy、learnShape、learnStripPlan、learnRowMode、learnSinglePlan、learnListPlan、learnQuietPlan、learnSplitRows),都在变异范围
rules/*.ts 内。旧
feedRowCap(width, height, phone) 与 stripCells
已无调用方,删除。useFeedCover 去掉只剩 true
一种取值的 visible 参数。home-variants.css 去掉死规则后并入
styles/bridge/home.css 第 28~30
段(共用根、主次、学习引导与两段都空),原文件删除;旧的第 25
段(看看别人在做什么 1×1 封面小卡)与第 12
段里旧清单的规则随旧版式一起删,后面各段顺次改号(原 26~28 →
25~27),WorkbenchPage.tsx 里的段号引用同步改。FeedWidget.test
重写、InspirationLearn.test
新建,规则层表驱动断言;InspirationWidget、WidgetContent
的旧空态断言改为学习引导的文案;FitList 补「浏览器没有
ResizeObserver」一例(补第 164 行分支)。| 编号 | 场景 | 所在文件/项目 |
|---|---|---|
| AC-227(新) | 平台上没有开放的单且只差一项官方认证时我能接的单把这一项做成主角卡并给出去学习与拿到它的三步,拿到后写认证已齐 | 首页工作台模块,@global-count(全量统计之后串行) |
| AC-228(新) | 平台上没有开放的单且还差几项官方认证时我能接的单按目录顺序列出还没拿到的官方认证并给出学习入口,认证目录读取失败时可在卡内重新读取 | 首页工作台模块,业务并行 |
| AC-229(新) | 平台上的需求都已截止时看看别人在做什么以作品做主图并写最近没有新发布的需求,作品读取失败时可在卡内重新读取 | 首页工作台模块,业务并行 |
| AC-230(新) | 全新平台发布第一条任务后看看别人在做什么以它做主图,作品段写最近没有新完成的作品 | 初始空状态(屏障,串行) |
| AC-207(改步骤) | 有新发布的需求与公开作品时看看别人在做什么分需求与作品两段按时间排并给出入口(标题不变) | 首页工作台模块 |
| AC-212(改步骤) | 全新平台上新用户打开首页时找活、公开动态与作品积分都显示空态并给出去处(标题不变,加缩放到小卡、窄卡、大卡一步) | 初始空状态 |
期望值都由页面这次读到的数据推出(主图挑选、两段顺序、官方认证缺几项),不写死;读取失败用
page.route 注入一次 422(4xx
不自动重试)。没有新增行内覆盖豁免。
| 检查 | 结果 |
|---|---|
npm run lint、npm run type-check、npm run build |
通过 |
npx knip |
只剩 develop 上已知的 tuantuan-plan-maintenance.ts 3
个未用导出 |
npm run test:coverage |
3180 例里 3 例失败,都在 develop
已知红名单(ProjectConversationRead、ProjectLegacyRoute、TuantuanAssistant.recovery-context);本分支相对
develop 改过的源码文件全部
100%(行/分支/函数/语句),features/workbench 全目录
100%;全量合计 96.62% 行,低于 100% 的 29 个文件都不在本分支改动里 |
make styles-gate |
通过(死规则 0、令牌 10 条断言、加载态 0 处) |
npx bddgen |
通过 |
make lint-acceptance BASE=develop、python -m tools.ci.affected --lint、python -m tools.acceptance.users、git diff --check |
通过 |
| 本机预览 4211(样式并入后) | 两张卡各尺寸与并入前一致,截图
/tmp/vos-check/4211.png(不入库) |
make e2e/make e2e-recheck/make check/make mutation:AC-227~AC-230
与改过的 AC-207、AC-212
都没在浏览器层实跑,缺陷注入没做,三层覆盖与变异得分没有更新;docs/reports/验收矩阵.md
仍待收口后 make matrix 生成(要两层运行结果作输入)。make e2e-recheck GREP=(取代前文两串,一次跑完):
首页工作台各模块|第一百零一条最早截止任务|拒绝重复组件或越界的布局|存过只有团团卡的旧布局|占位模块隔离键盘触发|十三类组件在十六种尺寸下|我的页在已获得的认证之外|切换账号不展示前一账号的课程认证|提交后锁定并在刷新与我的页保持认证|身份与课程读取失败后可在原页面恢复|我能接的单封面签名失败后可在紧凑卡片内恢复。
「首页工作台各模块」按功能名匹配整个首页工作台模块文件(含
AC-207、AC-227~AC-229);「十三类组件在十六种尺寸下」要确认两张卡换版式后逐尺寸遍历仍过;最后一条是我能接的单有开放任务时的封面签名场景,确认学习引导的分流没碰到有单时的版式。AC-212、AC-230(初始空状态)与
AC-227(全量统计)不受 GREP 过滤,recheck 每次都跑。@global-count:「只差一项」与「拿到后认证已齐」要求整个官方认证目录在场景期间不变,业务并行里别的场景随时新建官方认证,放到并发写入结束后串行才确定。@global-count
保证)。全量跑完若这两行只有单层命中,按行补场景,不加豁免。bodyClass(有动态时 1×1
封面卡、高 1 横条),读取中与空态不加。合并 develop(PR #29 AI 助手全流程升级)时,对方已用掉 AC-223、AC-224。本分支六个编号整体顺延两位:原 AC-223~AC-228 依次改为 AC-225~AC-230(AC.md、场景标签、步骤注释、pytest 标记、本档案与 log 同步改)。上文各节里的编号已一并替换,读到的就是新编号。