文档索引

每日一言重构计划

发行方式已被取代(2026-11-07):本文所述的「读时惰性选句」已由 reports/product-decisions-2026-11-07.md 的 P03 取代 —— 改为后台每日独立发行、 只补当天、读路径只读发行记录。当前实现与契约见 docs/architecture.md §6.22 的「发行与阅读分离」;本文其余设计(选稿顺序、版本审核、共鸣与收藏)仍有效。

日期:2026-10-30。调研基线:e9974a66。状态:P1–P4 已完成本地实施与验收,P5 待发布。

本计划依据本轮讨论中确认的五项产品规则编写,用户已审查并授权开始实施。正文保留审查时的 设计,实际交付与验证记录见 §12。本文不代表功能已经上线,也不授权执行生产迁移或部署。

现行使用方式见 docs/guide/每日一言使用指南.md,架构见 docs/architecture.md §6.22。 上一轮往期回看、累计一次共鸣的交付记录仍保留在 docs/plan/daily-quote-repair-plan.md。 实施阶段同步修改这些当前行为文档;上一轮修复记录作为历史保留。

1. 重构解决什么问题

目前通过审核的社区稿在展示后仍留在随机池,经过 90 天排除窗口就能再次入选,与首次选登 的新稿竞争。审核状态不能说明是否已经选登;拒稿永久占用正文哈希,修正出处也不能保留 原文重审。共鸣能否表达又与投稿人能否收款绑定,收藏显示的则是系统最近使用内容的日期。

目标是形成可解释的过程:投稿 → 审核 → 首次选登 → 往期阅读、共鸣与收藏。 社区投稿在每日栏目中选登一次;内置经典承担社区候选耗尽时的循环备用。

2. 已确认的产品规则

事项 目标行为
社区稿件 每条最多选登一次,不因经过 90 天或更长时间重新进入候选池
内置经典 仅在没有可选社区稿时补位;允许反复使用
参与范围 core、admin、owner;普通用户不能读取功能数据、投稿、签到或主动共鸣,也不能获得本功能的鱼干收入
博客前置 使用一言相关页面及主动操作前,本人至少有一篇当前未删除的博客;不满足时引导先发表自我介绍
用户可见状态 待审核、已通过未选登、已选登、审核未通过
未通过后修改 可以修改并重新进入审核队列,包括只修正出处、分类或署名;移除“永久拒绝”的说法和规则
共鸣与转账 每人每句累计一次、不能取消;可收款的社区投稿人收到共鸣者的 1 条鱼干,原创和引用同样处理
无法收款 共鸣仍生效,共鸣者不扣鱼干,投稿人不收鱼干;不是扣款后销毁,也不是系统代付
收藏 主要展示收藏时间,选登时间作为辅助信息

继续保留:UTC+8 换日、全站当天同一句、今日入口要求当天签到、往期不要求当天签到、 签到与一言读取独立、自己不能给自己共鸣、匿名保护、私密收藏、软删除及账号归档边界。 管理员下架能力继续保留,作为内容管理措施,不作为上述四个正常流程状态之一。

3. 权限、博客与内容资格

3.1 当前操作者的门槛

⚠️ 2026-11-07 产品决定(P02):一言资格不再要求博客(也不要求当天签到)。本节 「博客判据」为历史设计记录,现行规则见 docs/architecture.md §6.22。

博客判据曾沿用签到的 hasPublishedBlog:本人名下存在 Blog.ignore = false 的记录。 不检查标题、正文体裁或对外可见性;“自我介绍”是引导方向,不新增自我介绍识别规则。 删除全部博客后重新进入引导态,重新发表一篇后恢复资格,不清空原有投稿、共鸣或收藏。

场景 页面与操作
未登录 页面引导登录并保留返回地址;接口 401
普通用户或已归档账号 沿用现有权限 / 归档边界,不能读取业务数据或写入;不把发博客误写成提权途径
core+、没有未删除博客 一言页面显示统一发文引导,不返回正文列表或投稿表单;相应业务接口 403,带可识别的原因码
core+、有博客、未签到 可看往期、一言集、本人投稿,能投稿、共鸣和收藏;今日读取仍返回 403
core+、有博客、已签到 可以使用今日入口及其他功能
禁言中的 core+、有博客 往期、收藏和本人投稿只读;不能投稿、改稿、共鸣、变更收藏或签到;今日读取须已有当天签到
admin+ 审核 另需管理员权限,仍应用博客与禁言门槛,不增加隐含豁免

覆盖签到页中的一言入口、今日弹窗、往期、一言集、本人投稿和审核页。页面守卫与接口分别 判定,写服务在事务内复核当前操作者;不能靠隐藏按钮代替接口校验。收款对象不复用这一整套 操作者守卫,避免把“不能收鱼干”再次变成“别人不能共鸣”。

复用现有签到页的自我介绍浏览落点及发文入口,统一文案。只抽取所需的发文资格判定, 不改变签到奖励、签到即到账事务,也不把博客门槛扩散到所有鱼干功能。

3.2 作者变化后,分别判断三件事

判断 本计划提出的细则
未选登稿件能否成为每日候选 作者当前为 core+、未归档、未禁言且仍有未删除博客;暂时不符合时暂停候选,不自动改成审核未通过
已选登原文是否可读 下架或作者归档时不可读;仅降级、禁言或删光博客不追溯抹掉已选登内容
本次共鸣能否转账 收款人当前为 core+、未归档且未禁言;不要求收款人当天签到,不额外要求其仍保留博客

这里把博客门槛用于当前主动使用和新稿选登,收款资格继续采用账号档位、归档与禁言口径。 这是实施细则,需随本计划审查,不能在实现时因共用一个 guard 而无意扩大或缩小。 作者归档与内容下架的不可读规则优先,不能借“免费共鸣”重新开放其原文或身份。

4. 状态、修改与审核

4.1 四个展示状态,审核与选登分别记录

待审核 ──通过──→ 已通过未选登 ──每日选用──→ 已选登
   │
   └──未通过──→ 审核未通过 ──修改并提交──→ 待审核

建议保留现有审核字段 status 的 pending / approved / rejected / retired,新增社区稿的 firstSelectedDay。面向作者、审核筛选和接口的展示状态统一由两者计算:

条件 展示状态
status = pending 待审核
status = approved 且 firstSelectedDay 为空 已通过未选登
status = approved 且 firstSelectedDay 非空 已选登,并显示选登日期
status = rejected 审核未通过
status = retired 显示下架标记,并保留是否曾选登及其日期

不另存一个容易与审核状态冲突的 selected 状态。经典不进入社区“四状态”的首次选登流程。 下架不清除选登标记,也不恢复再次选登资格;本轮不新增恢复下架、作者撤回或修改已通过稿件 的流程。本人页面和管理页均能分辨等待选登与已选登,候选暂停原因仅向本人及管理员说明。

4.2 未通过后原投稿重新送审

建议沿用同一个 quoteId,以版本记录保留修改历史,不再把每次拒稿修正都变成不相关的新投稿。

  • 首次投稿进入待审核;作者可以编辑待审核稿件,保存后仍为待审核。
  • 审核未通过时保存审核意见;作者修改任一可编辑字段后,用明确的“修改并重新提交”操作进入待审核。
  • 只修正出处、原创 / 引用、分类或署名即可重新送审,不要求改变正文。规范化后完全无变化时提示先修改。
  • 新版本不沿用旧版本的审核结论;旧意见进入历史,当前显示“待审核”,不丢弃原拒稿记录。
  • 已通过未选登、已选登和已下架稿件继续冻结作者编辑,避免审核通过的正文被悄悄替换。
  • 待审编辑不消耗新增投稿次数;未通过稿件重新提交计入现有 24 小时 5 次配额,不增加新的限额。

增加单调递增的稿件版本号,正文或元信息变化、未通过后重新提交都生成新版本。审核请求必须 匹配当前版本与待审核状态,防止旧页面审核新稿,也防止“改了又改回去”后旧摘要重新生效。 提交、改稿、重审及审核结果在同一事务中更新当前稿件并保留对应版本 / 审核记录。

4.3 去重不再承担永久拒稿

保留目前正文规范化算法,继续拦截只换标点、空白等造成的重复收录;不承诺识别语义相近的句子。

  • 待审核、审核通过和下架内容占用正文去重名额;已选登内容即使下架,也不能换编号再来一次。
  • 审核未通过的内容不永久占用名额;同一作者可以修正元信息重审,其他人也不被一条旧拒稿永久封锁。
  • 修改 / 重审与另一条正在审核、已收录或已下架的内容冲突时,返回统一的重复提示,不透露他人的待审稿件或身份。
  • 旧版本快照只供历史核对,不占用当前正文名额。

建议将 contentKey 的全表唯一约束改为普通索引,并用手写 SQL 为上述占用名额的状态建立 条件唯一索引。冲突必须有数据库防线,不能只在插入前查一次。Prisma 模型无法完整表达的 索引须有迁移测试,并显式安装到测试模板库;模板缓存同时计入该 SQL 的变化,避免测试绿了 却没有真正测试索引。

5. 每日选句

5.1 社区稿只选用一次

候选必须审核通过、firstSelectedDay 为空,并满足 §3.2 的作者候选资格。移除社区稿的 90 天冷却逻辑;历史上任何一天选中过的社区稿均不得再次成为候选。

建议按审核通过时间从早到晚取用,同时间以稿件 ID 稳定排序。昨日若是社区稿,且有其他 作者的候选,优先取其他作者中等待最久的一条;没有其他作者时照常取队首。这样等待顺序 可解释,也避免有其他稿件时仍连续选同一个作者。首次版本不承诺具体排期,不展示会被资格 变化打乱的“预计明天选登”。

在选择当天内容的同一事务里,以 approved + firstSelectedDay 为空 为条件认领社区稿, 写入首次选登日期和当天 edition。认领失败重新读取候选;事务失败不能留下“标记用过但 没有选登记录”的半成品。数据库条件写入防止不同日期并发误用同一稿件,日期唯一键继续 防止同一天产生两期;同进程全局在途请求合并继续保留,冲突重试必须有界。

5.2 经典循环备用

没有符合条件的社区候选时才取内置经典。建议采用“从未使用优先,其次最久未使用”,同档 随机选择:可用目录会先完整轮换,再进入下一轮,不再用 90 天窗口阻止备用池发挥作用。 经典可因目录调整或下架改变可用集合;即使只剩一条,也可继续补位。两类池都不可用才返回 现有暂无可用内容提示,不能借用已经选登的社区稿兜底。

5.3 当天稳定性

沿用首次读取今日一言时确定当天内容的方式,不新增定时任务、不补抽历史缺日。 已经生成的当天 edition 优先返回,之后新通过投稿不会替换它。当天内容下架或作者归档 仍显示不可用占位,不重抽;选登标记与原记录保留。签到成功不依赖选句成功,重试只重读一言。

6. 共鸣与鱼干

6.1 共鸣成立与转账分开

内容 / 收款状态 共鸣 共鸣者支出 投稿人收入
社区稿,收款人符合资格 首次生效 1 条 1 条
社区稿,收款人降为普通用户或处于禁言等不能收款状态 首次生效 0 0
内置经典 首次生效 0 0
本人已共鸣 幂等返回已共鸣 0 0
自己的稿件、不可读 / 未选登内容、当前操作者无资格 拒绝 0 0

零余额用户也可以完成本来免费的共鸣;付费条件成立但余额不足时仍整体失败,不能擅自降为 免费。收款人恢复资格后,先前免费完成的共鸣不补扣、不补发、不重置资格。经典重复入选同样 不会重置每人每句一次的资格。

读口返回“现在点击需付多少”和可操作状态。投稿人不能收款时按钮仍可点,显示“共鸣,不扣鱼干”; 已共鸣时显示既有结果。匿名稿只给通用费用说明,不解释能推断真实身份的账号细节。

6.2 事务、金额确认与返回值

共鸣事务依次复核操作者、内容、已有资格和收款资格,确定本次金额,再原子提交累计资格、 明细和必要的两侧流水。零金额明细记录 paidUnits = 0,不调用要求非零金额的 postEntry。 实际付费仍经 postEntry 及现有单位换算。真实数据库故障整体报错,不能伪装成收款人无资格 而改走免费;匿名流水的收款人隐藏规则不变。

建议共鸣请求提交页面所展示的最高可扣金额(0 或 1 条)。服务端复核后金额降低可按实际值 完成;从免费变成需付费时返回状态变化,刷新费用后再由用户点击,不能悄悄扣款。重复共鸣 先命中幂等结果,不因费用或作者资格变化再次收费。

响应增加本次实际扣款金额 charged_fish,重复请求恒为 0;成功反馈依据本次响应,不能再 根据“是社区稿”推测付过钱。原有 already_resonated、resonated、can_resonate、 resonance_count 与余额继续由服务端确认。累计资格表和审计明细表的职责不变,旧流水不重算。

7. 页面、接口与收藏

7.1 页面调整

  • 签到页、往期、一言集、本人投稿、审核页共用博客前置说明;弹窗 / 页面中途发现资格变化时给出相同引导。
  • 本人投稿显示四个状态及选登日期,未通过项展示审核意见与“修改并重新提交”;投稿成功明确告知仍需审核。
  • 审核页提供四个社区状态的筛选,下架单独筛选;内置经典单独标明,不能把可重复的经典说成等待首次选登。
  • 审核操作统一称“通过”“未通过”“下架”;审核未通过和下架需填写原因,移除“永久拒绝”及相关错误提示。
  • 社区已选登内容只在往期等读口中继续使用,不再显示将于冷却后重新候选的说明。
  • 今日、往期和收藏继续共用状态组装器,费用、共鸣资格、匿名处理与收藏状态保持一致。

沿用现有页面地址和导航,不以本轮重构增加排行榜、公开候选池、推荐算法或另建功能主页面。 所需提示和状态遵守 docs/frontend-styles.md,不顺手重做整套样式。

7.2 收藏契约

一言集按收藏时间倒序,同时间以内容 ID 稳定排序。主要显示“收藏于……”,社区可辅助显示 “选登于……”,经典如需日期则明确显示“首次选登于……”。移除作为主日期及普通读口字段的 last_day,不因经典今天重播而泄露今日选择;往期仍按各期实际日期展示,且不含今天。

建议返回 saved_at 和明确含义的选登日期字段。取消再收藏沿用现有行为,收藏时间更新为本次 重新加入的时间;旧用户回填采用数据库已有 createdAt,不推算更早的收藏时间。 下架 / 归档内容仍保留日期占位与移出能力。收藏是私密引用,不承诺内容下架后继续保存原文副本。

7.3 接口范围

出口 调整
今日与往期 GET 增加博客资格;保留今日签到、历史纯读及匿名边界
本人投稿 GET 返回统一展示状态、稿件版本、可编辑性、首次选登信息和本人审核历史
投稿 POST 检查博客资格、新去重规则;创建首个版本
投稿 PATCH 待审编辑 / 未通过重审分支,同 ID 生成新版本;允许只改元信息
共鸣 POST 接收最高可扣金额,返回实际扣款;收款不合格改为免费共鸣
收藏写入及 SSR 读口 博客资格、收藏日期和稳定分页;保持下架条目可移出
管理审核 PATCH 版本与状态复核、版本审核记录;下架能力保留

继续使用现有会话、同源保护和 private, no-store。资格原因与金额变化使用可识别的业务原因码, 不靠前端解析中文错误文案。新增原因字段不替换现有 code / message;审核版本和共鸣金额契约 变化后,旧页面请求应要求刷新,不能按缺失金额或旧版本静默执行。前台不新增普通用户读口。

8. 数据设计与迁移

8.1 最小数据变更

位置 建议变更
DailyQuote 增加 firstSelectedDay、单调递增的稿件版本;contentKey 改为普通索引,并补状态条件唯一索引
稿件版本记录 新表保存每版正文、分类、署名、来源、版本号、提交时间,以及对应审核人、结果、原因和时间;已审核版本不被后续改稿覆盖
DailyQuoteEdition 保留全部原行和日期唯一约束;不加 quoteId 全局唯一,经典与存量重复记录仍合法
共鸣两张表 保留现有主键、资格与明细分层;免费共鸣使用现有零金额明细能力
收藏表 继续以现有 createdAt 表示当前收藏时间,无需新增收藏日期列

当前稿件、版本快照和审核结果同事务写入;审核记录关联明确版本。后台审计日志继续仅内部可见, 匿名隐藏及避免回读不兼容 JSON 列的现有处理继续保留。新增列的具体命名和索引名在实施时定稿。

8.2 存量处理

  1. 在备份副本上先核对:社区首次 / 重复选登数、从未选登的已通过稿数、状态与选登记录冲突、 无效作者与经典数量、正文规范化冲突;记录现有余额、流水和共鸣 / 收藏总量作迁移对照。
  2. 对每条社区稿,从全部 edition 取最早选登日期回填 firstSelectedDay,包括 90 天以前、 作者已归档和内容已下架的记录。不能用默认归档过滤后的网页查询做回填。
  3. 曾选登多次的旧社区稿只回填一个首次日期;全部旧 edition 保留,今后不再选用。当前已生成 的今日 edition 不替换,新的选择规则用于之后尚未生成的日期。
  4. 旧未通过稿仍为未通过,但解开永久拒稿限制,之后可以修改原稿重审。旧规则已产生的不同 quoteId 不猜测合并,保留各自引用和记录。
  5. 为当前每条稿件建立基线版本,保存现有审核元信息;注明是迁移时捕获的基线,不伪造已丢失 的历史版本、修改时间或父子关系。
  6. 既有共鸣资格、明细、鱼干余额及流水原样保留;不自动退款,不回收旧收入,不给历史免费共鸣补发。 收藏时间使用现有值,原取消状态不改变。
  7. 核对标记与原选登记录一致、活动正文无去重冲突、历史行数及账目未变化。发现异常先报告, 不以删行、改余额或清空历史的方式完成迁移。

生产数据量、历史重复规模尚未读取,本计划不把这些数值当成已知事实。

8.3 上线与回退

新增手写迁移,序号在实施时按仓库最新迁移列表分配,不改写已应用迁移,不用 prisma migrate。 数据回填由迁移跟踪表保证只执行一次,不能把再次运行回填作为日常修复手段。新增 schema 需重新生成 Prisma client,时间与日期仍走本站数据库时间约定。

先完成备份副本演练,再按现有部署流程完成迁移、client 更新与应用切换;停写 / 停服边界内 完成切换,不能让旧应用在放松正文唯一约束后继续写入。上线前后执行上述只读对账,确认旧今日 记录稳定、新社区稿只选一次、免费共鸣无流水。

迁移后允许出现多条同正文的未通过记录,旧代码又没有新版本写入逻辑,因此不能承诺直接切回 旧代码就能正常工作。回退须先停止写入并核对新数据,选择兼容新 schema 的回退修复;若必须 恢复备份,要明确备份后的投稿、共鸣和资金变动范围并另行决定,不能自动丢弃真实交易。

9. 实施顺序与文件范围

阶段 工作与完成条件
P0 计划审查 确认 §3 的资格细分、§5 的队列 / 经典顺序、§6 的金额契约及 §8 的数据方案;未审查前不实施
P1 数据与契约 schema、手写迁移、版本记录、状态投影、条件唯一索引及真实迁移 / 模板测试;旧数据回填可核对
P2 服务与权限 统一博客资格;一次选登、拒稿重审、免费共鸣与实际金额;相关服务 / 路由测试通过
P3 页面联动 发文引导、四状态和审核历史、审核筛选、动态费用与收藏时间;桌面及窄屏流程可用
P4 文档与验收 更新现行指南、架构及相关接口说明;相关测试、类型检查、一次全量与构建 / e2e 验证留证
P5 发布核对 获得发布授权后执行备份演练、迁移、切换及对账;计划记录实际交付与剩余问题

主要落点:prisma/schema.prisma 及新增迁移、src/lib/daily-quote.ts、 src/lib/daily-quote-service.ts、签到发文资格的共享判定、一言 HTTP 包装与相关路由, 以及签到页、三个一言页面、审核页和 DailyQuote* / AdminDailyQuoteReview 组件。 测试模板需覆盖手写索引,不能顺便重建整套测试基础设施。鱼干通用账务内核不作无关重构。

本计划获准实施前只更新计划及其索引登记;现行指南和架构继续准确描述当前功能。

10. 验收标准

编号 必须证明的行为
A1 社区稿首次选登后,跨日、第 91 天以及更久之后均不再候选;历史重复稿迁移后同样不回流
A2 有可用社区稿必选社区;审核时间顺序与作者轮换符合规则;暂停资格的稿件不丢失、资格恢复后可候选
A3 没有社区候选时经典正常补位;经典完整轮换后仍能使用,少于 91 条甚至仅 1 条也不会因冷却报错
A4 同日并发、跨日选句竞争、事务失败、刷新 / 重启不产生社区重复选登或标记与 edition 不一致
A5 无博客 core+ 直达所有一言页面得到统一引导;绕过页面调用读写接口仍失败;发文后恢复、删光后重新受限
A6 普通用户不能调用各出口或收取本功能鱼干;未签到只能使用往期等既有入口;禁言写入被拒;管理权限不能被普通 core 越过
A7 四个状态及下架标记一致;未通过只改出处即可原 ID 重审;旧审核意见可查;新版本不继承旧审核结论
A8 旧审核页面、并发改稿与审核、改后再改回原文均不能错误通过新版本;已通过 / 已选登 / 已下架稿不能被作者改写
A9 拒稿正文不永久封锁;与活动稿冲突仍由数据库拒绝;只改标点不能将已选登内容重新收录;快照不占名额
A10 原创 / 引用、署名 / 匿名的可收款社区稿共鸣均为双方 -1 / +1;累计只生效一次,并发及跨入口不重复付费
A11 作者降级 / 禁言后内容仍按既有可见性可读,共鸣免费;零余额可免费共鸣;资格恢复不补扣、不补发、不能再共鸣
A12 余额不足和真实收款故障整体回滚;免费路径没有零金额流水;读后费用从 0 变 1 不会超出用户允许金额扣款
A13 匿名普通读口、版本历史、共鸣提示与付款流水不暴露投稿人;下架 / 归档内容保持占位且不可新增互动
A14 收藏按真实收藏时间稳定排序并正确分页;重新收藏更新时间;经典重播不修改收藏时间或从收藏出口暴露今天的期次
A15 迁移保留全部历史期次、旧稿件、共鸣和收藏记录,余额与流水不变;原已生成的今日一言不变;标记回填覆盖归档与下架稿
A16 条件唯一索引在真实迁移库和测试模板中都存在并生效,版本基线不伪造历史;空库与有历史数据的库均可走既定迁移流程

实施阶段先跑受影响的服务、路由和迁移测试,再 npm run typecheck;提交前全量 vitest 只跑一次, 输出落到临时目录,失败先按 docs/known-red.md 归因。UI 改动先构建,再运行每日一言 e2e, 覆盖 desktop 与 mobile;不同测试进程及构建不并发争用同一仓库。金额路径逐案核对账本一致性。 文档登记、引用与渲染守卫一并验证,不把“方案已经写好”记成实现或上线验收完成。

11. 本次审查重点

五项产品方向按 §2 执行,本次主要审查以下实现细则是否合适:

  1. 博客门槛覆盖主动使用与新稿候选;已选登稿的收款资格不额外绑定作者是否仍保留博客。
  2. 社区按审核通过时间取用,并在有其他作者候选时避免连续两天选同一个投稿人;经典按最久未使用轮换。
  3. 未通过稿同 ID、按版本重审;条件唯一索引只限制待审 / 已收录 / 下架内容,解除旧拒稿对正文的永久占位。
  4. 保留今日签到门槛与既有页面地址;免费转付费时需要刷新费用再点击,绝不意外扣款。
  5. 存量“曾选登”一律视为已用;不整理掉旧重复、不改历史资金,迁移后不直接运行旧写入代码。

审查通过后再按 P1–P4 开始功能重构;具体迁移与发布另按仓库既有授权流程执行。

12. 实施与验证记录

2026-10-30 用户审查通过并授权开工。本轮范围为 P1–P4,P5 迁移发布尚未执行。

  • 数据:新增迁移 38_daily_quote_lifecycle、首次选登标记、稿件版本表和活动正文条件唯一索引。
  • 业务:社区一次选登、按审核顺序兼顾作者轮换、经典循环补位;未通过原 ID 按版本重审。
  • 权限与金额:页面 / 接口博客门槛;收款资格独立,失格免费共鸣;请求限制最高可扣金额,响应返回实际扣款。
  • 界面:统一发文引导、四状态和本人 / 管理员版本历史、动态费用及真实收藏时间;保留既有页面地址。
  • 数据保护:真实 SQL 迁移测试验证最早日期回填、归档 / 下架覆盖、旧重复保留及资金记录不变;没有迁移真实开发或生产库。
  • 功能提交:0b0c83dd。P1–P4 本地交付完成;P5 未执行,未推送、未迁移真实数据库或部署。
验证 结果与范围
相关验证 隔离工作树中8个文件、90项通过,覆盖服务、路由、真实迁移 SQL、时间守卫、文档登记 / 引用 / 渲染
类型检查 npm run typecheck 通过
构建 npm run build 通过,含 Next 类型检查及 realtime 构建
浏览器 desktop / mobile 共30项覆盖通过:首轮实际运行28项通过,另外2项因新增历史正文导致定位不唯一,限定当前正文后定向复验通过
最终全量 只在隔离后的代码上完整运行一次:269文件、5,332项全部通过,170.18秒

隔离基线为 ded34ced 加本次每日一言改动,验证前逐一比对40个文件 / 章节与主工作区一致。 主工作区另有讨论区 WIP 和其他 Vitest 进程,曾在初始化扫描时遇到临时 journal 消失,尚未 进入用例;没有把其他改动的结果当成本功能失败,也没有修改对方代码。

隔离路径下的 schema-engine 建库被环境判为只读。最终复用已有的空测试结构模板:先核对两边 schema 和约束 SQL 一致,再核对空用户表、新列与条件索引,并实测隔离 Prisma 写入成功, 随后完成上述相关、类型与全量验证。真实迁移 SQL 的独立测试照常执行,不以模板替代迁移验证。

构建第一次在受限环境写 .next/types 遇到目录权限错误;以所需权限重新构建后通过,未修改 目录权限配置或清空整个 .next。浏览器初始化已改为通过 Prisma 执行相同约束 SQL,避免 Playwright 模块钩子不能加载 node:sqlite 的兼容问题;生产代码不依赖该测试用模块。

本页内容来自仓库 docs/plan/daily-quote-refactor-plan.md·在 GitHub 上查看

每日一言重构计划 · 聪明山