关于 first-reader
first-reader 是面向作者的试读技能,用于了解读者发布前阅读草稿的实际体验。它通过分阶段阅读和回忆测试,记录读者何处投入、走神或退出,以及之后记得什么。
主要功能
- 01模拟认同型与怀疑型读者
- 02逐段呈现文本,避免提前阅读
- 03记录投入、走神和退出情况
- 04测试读者之后记得的内容
- 05依据阅读记录回答后续问题
- 06比较修订前后的阅读表现
适用场景
- 01发布前评估文章或随笔
- 02发现读者在哪些段落失去兴趣
- 03检查读者能否记住文章主旨
- 04比较修订前后的读者反应
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mizchi/ explainer --skill first-reader安装后在 Claude Code 中输入/first-reader确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSENOTICEREADME.mdreferences/interview.mdpersonas.mdreport.mdroom.mdscripts/ask.pyfeed.pyrecall.pyroom_template.htmlroom.pysignals.pyskim.py详细介绍
first-reader
发布前的读者。
每种反空洞文风技能都会审查文本的属性:禁用词、句式、节奏。这项技能关注的是它们都不涉及的层面:读者的体验。能近乎完美地识别空洞文本的人不会数词;他们会留意文本承诺了什么、冒了什么风险,以及在记忆中留下了什么。人类读者是在时间压力下搜寻信息、构建要点模型的人,同时还会评估作者是否值得信任,而且随时都可以在任何一句话后退出。这项技能会模拟这样的读者,并报告他们的阅读体验。
它给出的是阅读体验,而非审查结果。请在发布前将其作为最后一道关卡。
用户须知(请先读;本节优先于以下所有内容)
对用户而言,这项技能是一场 Beta 试读:几位有自己生活的读者冷不丁读到他们的草稿,之后还可以向他们询问感受。本文件中的其他一切都只是操作机制,而这些机制应当隐而不显。
- “review this”(或“be my first reader”)会启动一次试读。 回复一行(“我会像你的受众那样读一遍。大约 5 分钟后回来。”),然后默默处理。过程中最多发送一条消息,而且仅限发生重大情况时(有读者中途退出)。不介绍读者阵容,不叙述步骤,不提工具名称。
- 结果应像朋友读完后说的话,再附上一页内容。 用三到六个朴素的句子说明:略读者是否打开了草稿、每位读者在哪些地方读得投入,又在哪里走神或离开、第二天他们还记得什么,以及向作者提出的一个问题。引用读者自己的笔记(用其首字母标注),以及草稿中的原话。然后附上页面链接:页面中会展示草稿及每段旁边的读者评论、略读者的结论和各个观察视角。不要列出编号修改项、建议或改写稿。读者只说自己的阅读体验;作者决定如何处理。
- 可以向读者提问。 例如:“ask S what would have convinced her”(问 S 什么能说服她)、“ask the skimmer what would have made them open it”(问略读者什么会让他们打开草稿)、“ask everyone whether they noticed the retention example”(问所有人是否注意到了留存率示例)。运行
scripts/ask.py <run-dir> <reader> "<question>",将每个问题对应的资料包交给一个全新的子 Agent,再用读者本人的口吻、以其首字母标注,在 150 个词以内转述回答。读者只能根据自己的阅读记录回答,不得重新阅读文本;他们也绝不提出改写方案,只说明自己的阅读体验,以及什么情况必须成立,体验才会有所不同。如果记录不足以支持回答,读者会如实说明。 - “again”会针对当前草稿重新试读,由同一批读者以全新的心态阅读,前提是作者已在自己的编辑器中修改过草稿。开场说明读者行为发生了什么变化(“上次 S 在第 4 段离开了;这次她读完了”);页面会在本次内容上方显示上次试读的关注度条。草稿现在存放在哪里都可以。
- “quick read”是 60 秒版本: 只进行略读关卡,由一位持怀疑态度的快速浏览者参与;用两个句子说明他们认为这是什么,以及是否会打开,并引用促使其做出决定的内容。
- 真实读者的评论属于证据。 如果作者在聊天中粘贴了真实读者的反应,要将其与模拟读者的评论并列,并标明姓名;这些是证言,不是指令。
- 如果结论空洞,最后要提出访谈邀请。 如果没有任何内容留存在记忆中,而且所有内容都可轻易替代,就要明确说明这一点,并邀请作者接受访谈,聊聊只有他们自己掌握的素材(参见
references/interview.md)。绝不要替他们编写亲身经历。 - 可以直接粘贴。 如果用户粘贴了草稿,将其保存到文件中,交给全新的子 Agent 进行试读,绝不要提“污染”这个词。
- 最多提出一个引导问题,而且只有在确实无法推断文章面向谁时才能提问。
为什么严守流程很重要
你能一次看到整篇文档,不会忘记任何内容,也永远不会感到无聊。人类读者没有这些本领,假装自己能在掌握全文的同时阅读,这只是表演,而不是测量。因此:
不要打开草稿。 从调用此技能开始,直到计时阅读完成,绝不要阅读草稿文件,也不要让用户粘贴草稿。只有脚本可以接触草稿。如果草稿已经出现在你的上下文中(用户之前粘贴过),那你作为读者就已受到污染:通过全新的子 Agent 执行每个阅读步骤,并在报告中说明这一点。你自己通读全文只能进行一次,且要等到第 6 步、所有读者实验完成之后。
所有脚本均为标准库 Python,离线运行,无需依赖:
python3 scripts/<name>.py。每次运行的所有文件都放在草稿旁边的 .first-reader/ 目录中,绝不要放在会话临时目录里:临时目录会在会话之间被清除,而明天的会话需要能找到之前的运行结果进行比较。
如果草稿位于 git 仓库中,只需提一次:最好将 .first-reader/ 加入 gitignore。
第 0 步:范围与体裁
首先判断计时阅读是否能模拟读者与这段文本的真实接触方式:
- 按顺序阅读的散文类文本(随笔、文章、帖子、备忘录、README 叙述性内容、着陆页文案、求职信、演讲稿):执行完整工作流。
- 参考资料(API 文档、配置参考、常见问题、变更日志):读者会查找内容,而不是从头读到尾。跳过计时阅读。将略读关卡作为主要环节,并安排查找任务:设定一位带着问题的读者,测试扫描视图能否引导其找到答案。在这里,可略读性是成功标准,而非缺陷。
- 约 150 词以内(推文、简介、公告):不要使用分块信息流。让一位全新的子 Agent 带着指定人物设定,在两秒的阅读时限内冷读文本:记录第一感受、是否会停下滚动,以及会转述什么。然后进行信任记录。跳过回忆测试。
- 小说与诗歌:逐字稿和回忆测试仍适用;信任记录和具体信息密度阅读则不按原样适用。只做 Needle 和 memory,并说明这一点。
- 不适用于此技能:代码审查、事实核查、文案编辑、改写。婉拒,并指出应使用的合适工具。
按照用户约定,静默执行:开始时发一行消息,遇到重大情况时运行中最多再发一条消息,然后给出结果。用户能看到的所有内容都应使用直白的语言。
第 1 步:设定读者
阅读 references/personas.md。如果受众或发布渠道未知,向用户提一个问题:这篇内容面向谁,将发布在哪里?然后设定两种人物画像,一种认同,一种质疑;每种都要包含先入判断、所处情境、表格中的耐心预算,以及一句话说明其利害关系。如果你无法写出这句利害关系说明,就先报告这一点。
另外,如果不明显,再询问:读完后,你希望读者怎么想、怎么感受或怎么做?这就是回忆测试要评判的预期主旨。
只有在需要确认受众时,才将受众信息写入开场白(例如“我会以 HN 上工程师的视角来阅读”);否则直接开始。在设定人物画像之前,先查找草稿旁边的 .first-reader/audience.json(格式见 references/room.md):它保存了作者选定的读者及其姓名首字母和一句话人生简介,因此项目中的每份草稿都会由相同的两个人阅读,而下个月的“S”仍代表同一个人。除非用户指定了不同的受众,否则沿用该文件中的读者;首次设定后将其写入文件。根据 references/room.md,在运行目录中为自己写入 manifest.json。重复审阅时,沿用先前 manifest 中的人物画像,并将 previous_run 指向旧运行目录,以便如实比较结果。
第 2 步:快速浏览关卡
让一位全新的子 Agent 扮演怀疑者,亲自运行
scripts/skim.py <draft>,并且只根据这次浏览作答;如果
你必须运行脚本,就把它的输出直接重定向到一个你绝不会打开的文件,因为扫描器视图会引用草稿片段,在计时阅读开始前读到它会污染你的判断。它要回答:这篇内容是什么、你是否决定完整阅读,以及是哪一个要素促成了这个决定。
如果扫描者说不清这篇内容是什么,或不愿承诺完整阅读,这就是第一条发现。对于大多数真实读者来说,这一关就是全部的阅读体验。
第 3 步:计时阅读
通过机制而不是请求来强制禁止预读。派发任何读者之前,先在后台启动 feed:
python3 scripts/feed.py serve <draft> --run <run-dir> --readers keen,skeptic \
--persona "keen=<one line>" --persona "skeptic=<one line>" \
--ready-file <run-dir>/feed.json
现在,文本只存在于该进程的内存中。feed.json 只保存地址,不包含其他内容;读取它,并且只把各读者自己的那一行交给对应读者。派发给读者的提示词包含角色设定、export READER_FEED=<reader-address> 和三个命令;绝不包含草稿路径、运行目录或其他读者的地址。读者运行 feed.py start,然后一次阅读一段,并在每一步如实记录:
feed.py next --log "needle=<-2..+2> expected... got... <felt notes>"。
needle 表示当下的感受:+2 表示投入阅读,0 表示中立,-1 表示走神或心存怀疑,-2 表示读完了。开始浏览的那一刻就记录下来。角色的耐心耗尽时,用
feed.py quit --log "needle=-2 <why the persona stopped>" 退出,因为退出是读者最能说明问题的行为。如果读者读完了,也要以相同方式记录最后一行;记录文本会将其标为 FINAL,而非 QUIT。
只有收到真实日志后,feed 才会放出下一段;它绝不会重复提供当前段落以外的内容,不会以快于真人阅读该段的速度推进,并且会等到所有读者都完成后才将内容写入磁盘(feed.py progress --admin <admin-address> 显示他们的进度;如果有读者中途退出,feed.py close --admin ...
会提前写入内容)。读者子 Agent 不返回实质内容;产物就是会话记录。关闭后,用
feed.py transcript <run-dir>/<reader> 收集记录。
如果无法使用子 Agent,请在遵守相同规则的前提下,使用文件模式(feed.py start <draft> --session <dir>)亲自进行,并且务必先于打开草稿;同时说明同一个人既充当读者又充当审阅者(参见“适应你的环境”)。
第 4 步:回忆测试
对共情型角色的会话运行 scripts/recall.py <session-dir>(如果怀疑者读完了,也要对其会话运行)。将输出交给一位没有其他背景信息的全新子 Agent。它只根据记录文本回答测验:复述、指认、高潮、结尾、重心、一项行动。
根据第 1 步中预期表达的要旨评判答案。如果对内容的一句话复述与其论点不符,或没有人记得结尾,这就是无法靠修改单句解决的发现。“什么都没留下”是对内容本身的发现,而不是对读者的判断。
第 5 步:信任台账
运行 scripts/signals.py <draft> --json,但只能在计时阅读全部完成后运行:其输出会引用草稿中的句子,因此提前阅读会污染你的判断。结合文体解读这些数字:有代价的信号(可核实的数字、专有名称、引言、违背自身利益的承认、第一人称经历)能换取信任;免费的信号(到处都是模棱两可的表述、到处都是确定语气、适用于任何文档的通用句子)毫无帮助。认识立场几乎毫无变化,会让人觉得是机器式自信。这些计数只是下限,并不代表事实:尤其是承认检测器会少计(它按模式匹配固定说法,会漏掉像“我们的测试数据根本就是幻想”这样的句子),所以在你自己的第 6 步阅读中确认有代价的信号,不要因为计数为零就轻信。
步骤 6:你自己通读,然后撰写报告
现在才完整通读草稿一次,作出脚本无法判断的两项判断:隐含的作者(描述这些句子所暗示的人,并引用文中此人发生变化的任何接缝)以及阅读记录中的抱怨究竟是作品的问题,还是读者群的问题。
严格按照 references/report.md 的规定撰写报告:先复述和说明含义,再写阅读记录、哪些内容保留下来、文稿背后的人,然后是中立的问题,以及获准提供的观点。全文保持证词语气,不打分,遵守高度规则;报告可以是积极的。
步骤 7:页面和读者都继续保留
将略读关卡的答案保存为 <run-dir>/skim.txt,并将其判定结果写入注释(skim)。按照 references/room.md(scripts/room.py)构建页面:草稿、每段旁边读者的评论、略读者的判定、各个视角和摘要;不要做任何修改。将页面发布到可用的位置,或者将其保存在运行目录旁并打开。按照用户约定交付:先给朋友的报告,再给链接。按 Lerman 顺序撰写的报告要保存在运行目录旁的磁盘上,供有需要的人查看。
读者会保留在运行目录中。本次会话之后的每次“询问”都要通过 scripts/ask.py,并为每位读者启动一个全新的子 Agent;不要代替读者作答,也绝不要再让读者看到草稿:他们的记忆就是他们的日志。
适应你的环境
此技能可在任何兼容 SKILL.md 的编码 Agent 中运行,但三项能力因环境而异。请在运行开始前检查你具备哪些能力,默默调整,并且只用一行告诉用户会有哪些变化。
子 Agent。 如果你能启动全新的 Agent(例如 Claude Code 的 Agent 工具,或任何委派机制),每位读者各由一个 Agent 扮演。如果不能,你就自己逐个扮演读者,每次采用一种人格;此时,操作顺序至关重要:无论出于什么原因,在阅读记录完成前都不要阅读或打开草稿文件;立即从 feed 脚本开始,以对应的人格逐段接触作品(文件模式;读者和审阅者共用一个思维时,服务模式毫无意义);在之后单独进行另一次阅读,以怀疑者的立场阅读,不要和富有同情心的阅读合并;在看到全文之前,仅根据阅读记录回答测验,进行回忆测试。与全新的思维相比,这是较弱的实验,因此要在判定中明确说一次(“这里我亲自扮演了两位读者,因此请将调查结果视为略弱一些”),绝不要假装不是这样。如果草稿已经出现在你的上下文中(你在本次会话早些时候读过、用户粘贴过,或运行环境自动载入了草稿),单人模式就无法让你盲读;仍要诚实地分角色阅读,并且比起针尖指标,更重视机械信号(退出逻辑、根据日志进行回忆、signals.py)。
页面的发布位置。 使用制品发布功能时(Claude Code on claude.ai),页面会生成一个私密链接。没有此功能时,页面会作为本地 HTML 文件保存在运行目录旁,并为用户打开。页面供阅读,而不是点击;向读者提问时,请通过聊天转达。
轮次预算。 在每次脚本调用都会显示为一个可见工具步骤的 Agent 中,完整运行需要很多步骤。请在开场白中提前说明(“这需要几分钟,也要经过许多小步骤”),不要逐步征求许可;运行环境允许时请批量处理。
此技能在会话中首次运行时,开场白还要顺带介绍使用方式,因为之后不会再有其他说明:“像你的读者那样阅读,大约需要 5 分钟。我回来后会告诉你每位读者在哪些地方读得投入或离开、他们记住了什么,并提供一份页面,在草稿旁边展示他们的评论。你可以向他们追问;修改后说‘再来一次’,就会重新阅读。”
护栏
- 绝不重写草稿,无论是全部还是部分;也绝不交出一份修改建议清单。读者报告自己遇到的情况;作者对文本的每一项决定负责。如果有人要求重写,就把读者的评论交给用户自己的编辑技能处理。
- 绝不捏造发现。两份顺畅的转录记录,加上通过的回忆测试,就应如实结束审查。
- 绝不责怪读者。如果作品的目标读者不合适,就重新安排读者并重新测试;如果作品面向专家,而怀疑者是新手,那是读者安排错误,不是草稿错误。
- 挑查词语层面的疏漏不在范围内;这由其他技能负责。如果转录记录反复被同一个短语绊住,就报告这种情况,而不是报告该短语是否出现在任何清单上。
- 转录记录就是证据。引用它们;不要把它们概括成它们本来要取代的抽象说法。