Repository navigation
v1.7.1
引导从"按 user 幂等 + auth-gated"改为按浏览器幂等,文案剔除 AI 模板;连同 v1.7 未发出的版本说明一起补上。
主要变化
H 计分改为纯正向
结算时 H gain 现在以 0 为下限:熬夜仍能抹平当日 H 奖励,但不再从已有余额上再扣。第三步显示的扣减量是被 cap 后的有效值,整页配色保持鼠尾草绿,不出现负值红字。
未保留可负扣减的取舍是:单用户 ADHD 场景下,"罚"的代价(自责、决策回避、第二天的逃避结算)显著高于一次罚分换来的边际行为约束;把丢分换成"今日机会归零"的正向语义更贴系统的整体设计意图。
6 项 H 行为重写
替换为:进行健身 / 完成 50 分钟健身 / 睡足 8 小时 / 0 点前入睡 / 未加餐 / 饮食健康。条目按使用者实际复盘节奏排列,去掉了几条与考研生活接不上的旧项。
第二步替换为「昨日回顾」
原"今日词汇"步骤被取消。此栏在系统层面是冗余的:数学 tag 的 F 增量已在 endSession 中实时记入,结算页再次呈现并不会改变账面,反而把"早晨打开应用"的语义从回看变成了重复操作。
新的回顾步骤把昨日的番茄数做 count-up 动效呈现,并按 5 / 7 / 9 / 11 的数学里程碑阶梯依次点亮(已达成的挡位高亮)。词汇 toggle 仍保留在下方作为补录入口,但默认不再是主动作。
附带新增 yesterdayKey() helper,与 todayKey() 共用 UTC+8 / 4am 切日的语义。
首次使用引导(WelcomeGuideSheet)
新设备打开应用时弹出一份双栏说明:左栏列系统会管的高刺激消遣(外卖 / 熬夜 / 刷手机 / 打游戏 / 看剧),右栏列系统刻意不管的低刺激日常(读书 / 运动 / 线下社交 / 正常聚餐)。Settings 页提供「入门指南」入口可随时重看。
边界讲清楚的目的,是让使用者第一次想"也把读书记一下"时能按设计取舍来理解,而不是当作系统的不完整。引导内容与 README 新增的「系统边界」章节互为镜像。
幂等以 localStorage flag (tokmato:guide-seen) 实现,按浏览器一次,与 auth 解耦。v1.7 首发以 guideSeenUserIds 按 user 幂等并 gate 在 status === "authenticated",导致未登录访客与无痕窗口都看不到引导;本版改回按浏览器,"首次访问"的定义更直观。
README 与 CLAUDE.md 拆分,新增「系统边界」章节
README 此前是 CLAUDE.md 的 symlink,本版拆为独立文件并面向人;CLAUDE.md 保留工程文档定位。README 在「为何不用现有番茄钟」与「代币经济学」之间补入「系统边界」一节,明确正向行为不进系统的两层理由:奖励化会把内驱滑成外驱;记账成本只在收益足够大的高刺激消遣场景才划得来。
持久化 schema v4 → v6
- v4 → v5 引入
guideSeenUserIds(v1.7)。 - v5 → v6 退役该字段,迁移时为已有
welcomeGrantedUserIds或guideSeenUserIds的设备写入 localStorage flag,避免 v1.7 的老用户被回溯打扰。
云端 schema 把 guideSeenUserIds 标为 optional 以兼容 v1.7 客户端遗留的快照,新写入不再 emit 该字段,云端 key 会随时间自然萎缩。
修复
- WelcomeGuideSheet 触发依赖登录(
components/providers.tsx在 v1.7 中 gate 在status === "authenticated"),影响未登录访客与无痕窗口。已改为按tokmato:guide-seenlocalStorage flag 触发,与 auth 解耦;grantWelcomeBonus仍保留 auth gate 于独立 effect。 - WelcomeGuideSheet 文案中三处属于 AI 模板("中心点 · 解释"):description"先看这一页 · 之后从设置可再次打开"、intro"把娱乐换算成今日产出 · 用来约束容易上头的消遣,而不是给所有行为打分"、footer"低刺激的正常生活不需要代币管制 · 让它们留在系统外,避免把好习惯变成「任务」"。已全部删除。两栏卡(系统管 / 系统不管)独立成立,rationalization 留在 README。
工程
lib/store.test.ts新增yesterdayKey单元覆盖;markGuideSeen测试随字段退役一并删除。lib/snapshot-schema.test.ts新增 v1.7 兼容用例:含guideSeenUserIds的快照仍能通过.strict()校验。