测试期的「官方代付」是个敞口:任何装了 Xtype 的人点一下就能拿到。测试期这样没问题——本来就是请大家来用。但它不能一直开着:识别是真金白银的成本,敞口不关,产品就永远算不清自己的账。
这一版把它换成邀请制。规则不复杂,但每一条背后都压着一个真实的坑。
票认人,不认转发
邀请码发到你的邮箱,就只有你的邮箱能兑。转发给别人,码是废的。
为什么这么严?因为码一旦「见码就兑」,它就会变成流通物——被截图、被转卖、被脚本收集。认邮箱把码钉死在收信人身上,转发失去意义,滥用面直接消失。
被邀请,不等于能邀请别人
最初的设计是「每个代付用户送 3 个邀请名额」。听起来很自然——增长产品都这么玩。
但有人算了笔账:受邀者兑换后也是代付用户,也拿 3 个名额,那就是 1→3→9→27 的指数裂变,每一层都是 90 天的真实成本。「上线后盯着,出问题再关」不是答案——没人真的盯 dashboard。
所以定稿是:邀请名额默认为零,只有我们单独点名的少量种子用户才有额度。代付是权益,邀请是资格,两码事。增长慢一点,账算得清。
「删除账号」删什么,不删什么
账号页最底下加了删除按钮。删掉的是:邮箱、所有登录会话、云端用量、邀请记录。不删的是这台 Mac 上的历史、词库、录音——那些本来就不在云上,服务器无权也无法碰你电脑里的文件,我们不会为了「删得干净」的观感去谎称删了。
删完这台 Mac 回到匿名状态,照常免费用。账号是可选的身份,不是枷锁。
这版真正的故事:两个 AI 互相挑刺
邀请制的服务端不是一个 AI 写完就上线的。是两个 AI——Claude 和 Codex——来回三轮对抗式互审出来的:一个写,另一个专门找茬,每一轮都要求「不要照着摘要打勾,去读真实的 diff;说竞态就给出具体的交错顺序,不许只说理论上可能」。
三轮下来抓出来的东西,每一个都是单干时会漏的:
- 错码能让全体用户的码作废:第一版为了防爆破,输错一个码就给所有有效码记一次失败。看似防御,实际是把攻击者的一次错误请求变成对全体用户的写权限——五个错误请求,所有人的真码一起失效。
- 兑换失败的回滚会覆盖并发授予:兑换中途另一台 Mac 登录、迁移授予了代付,兑票失败按旧快照回滚,会把那份合法授予抹成免费。修法是反转占用顺序,让没有并发写入方的一侧承担回滚。
- 登录凭证在本机留了明文副本:为了换签名调试方便,登录态镜像到了本机偏好文件。审到这条时,另一个 AI 用一条命令当场把 64 字符的凭证读了出来——演示比论证有说服力。这版起只进钥匙串。
分歧怎么办?规矩是:谁也不许默认接受对方的改动,也不许为了「重做一遍」而改风格;同意要写依据,反对要给可复现的失败场景;真僵住就两案并列,交给人定夺。三轮往来的原文都在仓库的 docs/HANDOFF-*.md 里,谁都可以翻。
一个人写代码,盲区是自己的;两个 AI 互审,盲区至少要撞一次才能活下来。这一版之后,Xtype 的服务端改动都会走这套流程。