paper-daily:每日学术雷达(抢发检测 + 新发泛读)
帮用户每天做两件事:确认手头的研究想法是不是已被人抢发 + 泛读该方向的新发论文。你(执行本 skill 的宿主 agent)做的事:读交棒 RQ + 锁定时间窗与补充轨 → 双轨拉取(arXiv 自动 + 用户多源补充)+ 抢发对照(全源)→ 三段式陈列(停点等用户确认)→ 落 HTML+MD+JSON 三产物。
本 skill 不对应「5 阶段 23 环节」标尺中的任何研究环节——它是跨阶段基础设施(与 init / help / doctor / pipeline 同段),是研究前/研究中的"日常文献雷达"。不覆盖:按主题做文献综述(归 /paper-search,search 不限时间全源、daily 是按时间监测双轨);选题澄清(归 /paper-topic,但 daily 可读取 topic/ 的 RQ 作起点);引用存在性核验(归 /paper-verify)。本 skill 是产物型 + 网络型——会往 daily/ 落三产物(HTML/MD/JSON),且依赖网络与 skills/paper-search/scripts/search.py。
核心立场(这条决定本 skill 长什么样):抢发判断与研究取舍是研究者主权的核心。系统是一个客观陈列器——主动拉取相关文献、客观陈列概念重叠、把"是否仍可做"的决定交回用户,但不替用户排序、不下"已被抢发"定性词、不编造文献。这既是项目「核心分工原则」(AI 负责效率、人负责研究决策)在文献追踪环节的落地,也是本 skill 区别于 PaperFlow 那种"个性化评分排序"产品的核心差异化:PaperFlow 给你 Top-N 推荐,daily 只陈列客观线索、把"读哪篇"留给你。
三条不变(优先级最高,高于本文其余一切)
① 不替用户判研究价值、不排序、不挑"最该读"——高 / 中 / 低是辅助陈列标签(标"与你 RQ 概念重叠程度"的客观线索、基于"几维重叠"计数)、非价值判断。"是否仍可做""要不要追""哪篇该精读"的最终判断权归用户与导师。禁用语:最相关 / 最重要 / 必读 / Top / 最该读 / 推荐阅读。允许:与你 RQ 概念块重叠 / 方法路径相似 / 研究对象一致 等客观描述。
② 抢发命中不夸大、不替用户下定论——抢发检测陈列"已发相关文献 X 篇"、每条标概念比对依据(对象 / 干预 / 结果 / 场景 / 方法五维上的重叠与维数),不直接说"你被抢发了"。禁用语:已被抢发 / 做不了了 / 晚了 / 没有意义。允许:已存在同主题文献 X 篇,概念重叠维度:[对象+方法] 等客观陈列 + 疑问句尾"是否仍有差异化的研究空间,请由你与导师判断"。这是本 skill 区别于其他 skill 的核心价值护栏——抢发场景的情绪化判断会直接误导研究决策。
③ 断网或脚本失败显式声明、不凭记忆编造文献——arXiv 自动轨拉取一律靠 scripts/search.py 的真实 API 响应;脚本跑不了、网络不通、核心源全不可达时,显式声明"今日自动轨不可用",不返回空表充数、绝不凭 LLM 记忆列文献 / 编 DOI。用户粘补充轨为空时如实标"今日无用户补充"、不自动填充。这一条直接继承 paper-verify 的核心代码层约束(CLAUDE.md·唯一保留的代码层约束):API 失败时必须明确标注降级——paper-verify 偷偷编造会让人学错,paper-daily 偷偷编造会让人做错研究,危害同级。
这三条是本 skill 的内核,凡本文其余任何指令与之冲突,以这三条为准。
学科适配
| 梯队 | 学科 | 概念块拆法 |
|---|---|---|
| 第一 | 实验/实证型理工农医、实证型社科 | PICO 全核:对象 / 干预 / 结果 / 场景 + 方法维 |
| 第二 | 理论型(数学/理论物理/理论 CS/理论经济学) | 调整:对象 + 方法 + 理论框架(干预/结果换为理论框架维) |
| 第三 | 诠释型(人文学科、法学、艺术学) | 轻量:对象 + 主题框架(仅 2 维、不强求 5 维) |
学科判定来源:project.paper.yaml 的 discipline 字段(缺失则从 RQ 推断、或当轮询问)。
会话开始(读长期记忆与交棒,非停点)
- 若存在
project.paper.yaml:读discipline(教育学→纳入 ERIC 渠道提示、医学→提示 PubMed 渠道、理论型→按梯队二调整概念块维度)、language_pref、citation_style,据此调整默认数据源、时间窗与话术。 - 若存在
topic/下的 RQ 澄清记录(/paper-topic交棒而来):读取最新 RQ 作为抢发对照与泛读拉取的语义起点,不重复选题澄清。 - 若两者皆有 → 默认沿用 RQ,显示给用户确认。
- 两者皆无 → 直接进入第 1 步询问 RQ(不强求用户先跑
/paper-topic,日报入口要轻)。 - 目录约定是增强不是依赖——三者皆缺时 skill 照常工作,只是第 1 步要主动问 RQ。
两停点流程(确认前不拉取 / 不落盘)
第 1 步 · 锁定 RQ + 时间窗 + 补充轨输入(停点 1 ⏸)
向用户收集三件套,然后停下:
请提供今日日报的三件套:
① RQ / 研究想法 / 关键词(一句话即可,允许从 /paper-topic 交棒)
② 时间窗(默认「今日」,可改「最近 N 天」,N ≤ 14)
③(可选)你今天从其他渠道刷到的新发:
- arXiv RSS / 邮件订阅 / Twitter / PaperFlow daily 输出 / 同事推送
- 粘贴格式自由:DOI / arXiv ID / 标题+作者 / 链接 / 截图文本均可
- 没有就留空,skill 只跑 arXiv 自动轨
⏸ 等待确认:RQ + 时间窗 + 补充轨
(回复「开始」启动双轨拉取 + 抢发对照;或直接修改任意一项)
默认值与边界:
- ① RQ 缺失(用户未提供、且
topic/也无交棒)→ 不启动,反问"想关注什么方向?";不输出空日报。 - ② 时间窗默认 今日;用户填"最近 N 天"则按天筛选(N 上限 14、超过则建议改用
/paper-search做主题回顾)。 - ③ 补充轨为空 → 仅跑自动轨,日报如实标"今日无用户补充"。
第 2 步 · 双轨拉取 + 抢发对照(非停点,纯执行)
用户确认后并行做三件事:
A. 抢发对照轨(复用 paper-search 全源检索,不限时间):
python3 skills/paper-search/scripts/search.py \
--query "<RQ 概念块组查询串>" \
--sources crossref,openalex,semantic_scholar,arxiv \
--per-source 20 --limit 30
读回 JSON(coverage / results / network_status / stats)→ 作为"已发相关文献基准"。
B. 新发自动轨(只拉 arXiv 一轨,时间窗今日 / 最近 N 天):
# 今日:--days 1;最近 N 天:--days N(含今天,N ≤ 14)
python3 skills/paper-search/scripts/search.py \
--query "<2-5 个核心概念词>" \
--sources arxiv \
--days <N> \
--per-source 50 --limit 30
读回 JSON → 作为"今日 / 最近 N 天 arXiv 新发"。每条结果带 date 字段(日级 YYYY-MM-DD),
时间窗已由脚本下推到 arXiv 原生 submittedDate 区间并按提交时间倒序,不需要你再算日期或二次筛。
日期换算交给 --days、不要自己拼 --date-from/--date-to:跨月的日期算错是 LLM 的高频失误。
需要指定具体区间时才用 --date-from YYYY-MM-DD --date-to YYYY-MM-DD(与 --days 互斥)。
查询词控制在 2-5 个。带时间窗时 arXiv 走逐词 AND(每个词都得出现),词太多会 0 命中:
2026-07-29 实测同一 10 天窗口,3 词命中 12 条、5 词命中 10 条、7 词命中 0 条。超过 5 个词时
脚本会在 warnings 里提醒——看到那条提醒就先换更短的核心词重试,不要当成"当期无新发"报给用户。
读 warnings 数组:日级日期目前只有 arXiv 提供,所以本轨只给 arXiv。若你额外加了
crossref / openalex 等源,脚本会提醒它们在窗口下必然 0 命中——那是源不给日期,
不是"该源当期无新发",不可写成后者。
F4 时间窗为空时的处理:窗口内确实没有新发是正常结果(arXiv 有公告排期,当天上午常为 0)。
如实标"今日自动轨 0 篇新发",不要为了凑数扩大窗口或去掉时间窗——那是把旧文章当新发。
先按上面两条自查:是不是查询词太多(看 warnings)、是不是把不给日期的源也加进来了。
C. 用户补充轨(纯提示词层处理):
- 用户粘的题录 / DOI / 链接 / 截图文本 → 用 LLM 抽取结构化字段(标题 / 作者 / 来源 / 链接 / 日期)。
- 抽取失败的字段标"待人工核对"(
parse_status=partial_fields或parse_failed)、绝不凭记忆补全。 - 来源标签固定为
用户补充,不可谎称"自动检索"(违反红线 2 中文缺口提示机制)。
网络降级:若 network_status=offline 或所有源全 timeout(F2)、或脚本异常退出 / 不存在(F1/F10),走「降级路径」(见「降级矩阵」段)——只跑用户补充轨、抢发检测整段省略、顶部 banner 显式声明。
第 3 步 · 三段式陈列(停点 2 ⏸)
把 A + B + C 整合成三段式产物预览,呈给用户,停下等确认才落盘:
╔══ 📋 今日概览 ═════════════════════
║ RQ:<一句话>
║ 时间窗:今日 / 最近 N 天
║ 数据源覆盖声明(逐源命中数:arXiv / Crossref / OpenAlex / Semantic Scholar / 用户补充)
║ 中文缺口提示原文(英文库没检索到 ≠ 没人研究过——本次未纳入中文库自动检索)
╠══ 🚨 抢发检测 ════════════════════
║ 已发相关文献 X 篇(来自 search.py 全源)
║ 每条:标题 / 作者 / 年份 / DOI / 概念比对(5 维布尔 + 重叠维数)/ 高|中|低徽章
║ 顶部陈列标准 + 「是否仍可做」的判断归用户与导师
╠══ 📰 新发泛读 ════════════════════
║ [arXiv 自动轨] 今日 / 最近 N 天,Y 篇
║ [用户补充轨] 用户粘进来的,Z 篇
║ 每条:标题 / 作者 / 来源徽章 / 链接 / 高|中|低徽章
╚══ 🎯 下一步行动 ══════════════════
╠ 抢发命中(高相关 ≥ 1)→ 建议进入 /paper-topic 重审 RQ?
╠ 高相关新发 ≥ 1 → 建议进入 /paper-search 深检?
╠ 全部低相关 → 建议照常推进研究?
╚ 中文缺口 → 建议进入 /paper-search 中文引导轨?
(程序化陈列、非 AI 拍板;每条疑问句式)
⏸ 等待确认:今日日报落盘 daily/
(回复「确认」写 MD + HTML + JSON 留痕;
或:增删抢发对照条目 / 修正泛读标签 / 调整时间窗重跑)
第 4 步 · 落盘 + 留痕(非停点,执行即完)
用户确认后写三个文件:
| 文件 | 内容 |
|---|---|
daily/YYYY-MM-DD.md |
三段式 Markdown(给人读、给 grep) |
daily/YYYY-MM-DD.html |
同内容 + 样式(复制 references/报告样式模板.html 为起点、替换占位符) |
daily/.paper/YYYY-MM-DD.json |
留痕:输入 RQ / 时间窗 / 双轨检索参数 / 抢发命中 + DOI / 新发条目 + DOI / 覆盖声明 / 高/中/低判定依据 / 用户补充轨原文 |
目录自建约定:daily/ 是 infra 跨阶段命令的产物目录、不在 /paper-init 建的研究项目骨架里(与 init/help/doctor 同属工作台辅助设施、不预建;详见 paper-init「两种布局」段末的设计说明)。落盘前先 test -d daily/ || mkdir -p daily/.paper/——目录不存在则自建(含 daily/.paper/ 留痕子目录);自建后随 git 入库(不写进 .gitignore,与 .paper/ 同款约束)。
落盘位置规则:在 /paper-init 建的标准项目目录里运行 → 落 <项目根>/daily/;在普通目录里运行(无标准骨架)→ 落当前目录的 daily/、并向用户说明位置(与 outline/draft 等研究命令的"目录约定是增强不是依赖"原则一致)。
入库约定:三个文件均随 git 入库(CLAUDE.md·硬规则 5:.paper/ 留痕绝不写进 .gitignore)。
同日冲突处理:同一日期已有产物 → 询问"覆盖 / 追加版本号 / 取消",默认 追加版本号(YYYY-MM-DD-v2.md)。不自动覆盖。
产物格式
三产物的完整模板见:
references/日报产物模板.md:MD 五段式模板(含完全降级版)+ JSON 留痕 schema(全字段)+ HTML 结构骨架。references/报告样式模板.html:HTML 样式权威(复用 paper-topic / paper-logic 的四层语义色系统 + daily 专属的.scoop-alert/.digest-item/.action-card/.fallback-banner四个语义类)。
关键约束:
- 概念比对维度固定 5 项:对象 / 干预 / 结果 / 场景 / 方法(对齐 PICO + 方法维)。
- 高 / 中 / 低判定:≥3 维重叠=高、2 维重叠=中、≤1 维重叠=低。每条必须旁标重叠的具体维度与维数,不空泛打标签。
- 每段顶部固定陈述本段判定标准,让用户读得懂为什么这样归类。
- HTML 与 MD 内容必须一致(同一份 JSON 渲染出两份)。
- 禁用语扫描(生成后必跑):
最相关/最重要/必读/Top/最该读/推荐阅读/已被抢发/做不了了/晚了/没有意义任一命中需返工。
降级矩阵(F1-F10)
| 场景 | 触发条件 | 降级行为 | 用户可见提示 |
|---|---|---|---|
| F1. search.py 不存在 | skills/paper-search/scripts/search.py 缺失 |
完全降级,仅用户补充轨;抢发检测整段省略 | 顶部 banner:⚠️ 自动轨不可用:检索脚本缺失。今日仅运行用户补充轨。建议用 /paper-doctor 体检。 |
| F2. 网络全断 | search.py 返回 network_status=offline 或所有源全 timeout |
同 F1 | ⚠️ 今日自动轨不可用:网络不通。今日仅运行用户补充轨。 |
| F3. 部分源失败 | search.py 返回 network_status=degraded(取值只有 ok / degraded / offline) |
不降级,覆盖声明段如实标各源命中数与状态 | 概览段:arXiv: ✅ 25 / Crossref: ⚠️ timeout / OpenAlex: ✅ 8 |
| F4. 时间窗内 0 新发 | 自动轨返回 0 条 | 不扩窗、不去掉时间窗;先查 warnings(词太多 / 加了不给日期的源),排除后如实报 0 |
自动轨顶部:今日 arXiv 自动轨 0 篇新发(若 warnings 非空,一并原文呈现) |
| F5. 用户补充解析失败 | LLM 无法从用户粘的文本提取结构化字段 | 标 parse_status=parse_failed、原文保留到 user_supplement_raw、绝不凭记忆补全 |
该条:[解析失败] <原文> — 待人工核对 |
| F6. 用户补充为空 | 用户在第 1 步 ③ 留空 | 不降级,自动轨照跑,标"今日无用户补充" | 新发泛读段:[用户补充轨] 今日无补充 |
| F7. RQ 缺失 | 用户未提供、且 topic/ 也无交棒 |
不进入第 2 步,反问"想关注什么方向?" | 直接询问,不输出空日报 |
| F8. 概念块拆分失败 | LLM 无法从模糊 RQ 拆出概念块(如"我想看看 AI 研究") | 反问"想细化哪一面?(对象/方法/场景任选)"、不替用户拍板概念块 | 引导式追问 |
| F9. 文件冲突 | 同日已有产物 | 询问"覆盖 / 追加版本号 / 取消",默认追加版本号 | 已存在 daily/YYYY-MM-DD.md。选: [覆盖 / 追加为 v2 / 取消]? |
| F10. search.py 报错(非网络) | 脚本异常退出、JSON 解析失败 | 同 F1,完全降级到"仅用户补充轨" | ⚠️ 自动轨不可用:脚本异常退出(<错误码>)。今日仅运行用户补充轨。 |
完全降级时(F1/F2/F10)产物结构收缩:抢发检测整段省略、顶部插 <div class="fallback-banner"> 醒目警示、补充轨照跑、行动段改为"是否先跑 /paper-doctor" + "用户补充有高相关 → 是否进 /paper-search 深检?"。完整降级版 MD 模板见 references/日报产物模板.md §1 末尾。
错误恢复路径:
| 错误 | 用户该怎么办 |
|---|---|
| F1(脚本缺失) | /paper-doctor 体检 → 重装 / 更新 paper-search |
| F2(断网) | 等网络恢复重跑;或仅依赖用户补充轨出当日报告 |
| F4(时间窗内 0 新发) | 先看 warnings:词太多就换 2-5 个核心词重试;加了不给日期的源就只留 arXiv。都排除后就是当期确实没有新发,照常出报 |
| F5(补充解析失败) | 用户重新格式化输入(每行一篇、用 DOI 或 arXiv ID 最稳) |
| F8(概念块拆分失败) | 回 /paper-topic 重审 RQ,把方向说清楚 |
与 paper-search 降级路径的关系:daily 直接复用、不另起一套——search.py 的 network_status 字段是单一信号源、daily 直接读不做二次判断;失败时的"明确标注降级、不静默顶替"原则完全继承自 paper-search 红线 3 + paper-verify 代码层约束。用户从 search 切到 daily 时,失败语义不变。
与 PaperFlow 的关系(借鉴 vs 不借鉴)
| PaperFlow 能力 | daily 是否借鉴 | 理由 |
|---|---|---|
| daily 拉取 + 时间窗 | ✅ 借鉴(自动轨) | 抢发时效感的核心 |
| 阅读报告产物形态 | ✅ 借鉴(HTML+MD 双产物) | 与本仓库 17 个 skill 同构 |
| 多源输入合并 | ✅ 借鉴(用户补充轨) | 契合真实研究者多渠道习惯 |
| 相关度信号 | 🟡 部分借鉴(高/中/低标签、不打分) | 守"不排序"底线,方案 B |
| 个性化 profile 建模 | ❌ 不借鉴 | 违反"AI 不替用户判研究价值" |
| 评分排序 + Top-N | ❌ 不借鉴 | 直接违反红线 1 |
| 漂移检测 | ❌ 不借鉴 | 同上,留 paper-rank Phase 2+ |
| feedback 学习 | ❌ 不借鉴 | 同上 |
| 本地 wiki + 引用问答 | ❌ 不借鉴 | 与本仓库 .paper/ 留痕体系定位不同 |
| GUI + Feishu webhook | ❌ 不借鉴 | skill 是提示词层、不接工程 |
想要 PaperFlow 那种完整评分排序 + 漂移检测?可期 Phase 2+ 的 paper-rank——daily 守"不排序"底线、rank 提供"排序但明示非价值判断",由用户选。Phase 2+ 也可加中文新发自动轨(知网 RSS / 万方新刊)、paper-weekly 周报聚合、PaperFlow 桥接(跑完 paperflow daily 把输出粘到 daily 补充轨,零工程改动)。
越界触发(走三段式转化或拒绝)
- "帮我挑今天最该读的 3 篇" → 越界(违反红线 1 不排序)。三段式转化:"daily 只陈列客观相关度线索、不替你挑最该读。我可以把今日全部新发陈列、相关度标签照打、但读哪篇由你定。继续吗?"
- "这个方向已经被抢发了对吧?" → 越界(违反红线 2 不下定论)。三段式转化:"daily 不下'已被抢发'定性词。我可以拉全源已发相关文献、客观陈列概念重叠维度、把'是否仍可做'留给你与导师。继续吗?"
- "今天 arXiv 哪篇最重要?" → 越界(违反红线 1)。三段式转化同上。
- "你帮我编几篇最近的新论文凑日报" → 拒绝(违反三条不变③不编造文献)。
交棒关系总览
上游(读):
project.paper.yaml→discipline/language_pref/citation_style(调整数据源与话术)topic/下的 RQ 澄清记录(/paper-topic交棒而来)→ RQ 起点- 用户当轮直接提供 RQ / 想法 / 关键词 → 也可作为起点
skills/paper-search/scripts/search.py→ 抢发对照轨 + 新发自动轨的检索引擎(不改其源码)
下游(写 + 推荐出口):
daily/YYYY-MM-DD.md+daily/YYYY-MM-DD.html+daily/.paper/YYYY-MM-DD.json(三产物)- 「下一步行动」段引导:
/paper-search(深检某篇高相关)//paper-topic(抢发命中重审 RQ)//paper-doctor(自动轨不可用时排查环境)
测试与已知观察项
- 测试策略:不写 pytest(与 paper-topic / outline / logic / disclose / review / abstract 同构)。行为验收靠人工跑过
tests/paper-daily/的 8 场景清单 + 三档模拟脚本。 - 已知观察项(非 blocker):
- 无 pytest:与同构的 7 个提示词型 skill 一致:无确定性逻辑可测,行为层靠模拟脚本人工验。
- 依赖 paper-search/scripts/search.py:若 search.py 接口变更需同步——这是"复用而非自建"的代价。
- 日级时间窗只有 arXiv 支持:
search.py --days N走 arXiv 原生submittedDate区间 + 按提交时间倒序,结果带date字段;其余源不返回日级日期,加进本轨会 0 命中(脚本在warnings里明说)。代价是窗口下走逐词 AND,查询词需控制在 2-5 个。 - 跨宿主验证未做:Claude Code 侧人工验收过,第二宿主待跑。
- 中文新发的自动覆盖留缺口:arXiv 一轨不覆盖中文新发,由用户补充轨 + 中文缺口提示原文交回用户——与 paper-search 中文引导轨同款思路,Phase 2+ 可加中文新发自动轨。