notes/ 读书笔记 sidecar 约定(rev 6)
新增 authors/<slug>/notes/ 子目录约定:作家文件夹现在可以同时持有公版原文(works/,进 RAG)和 AI 生成的读书笔记 / 评论 / 导读(notes/,不进 RAG)。动机是把 eanzhao/17-z.com 等外部 repo 的 commentary 字段(AI 写的导读)保留进仓库供前端展现,同时避免作家本人 voice 检索到 AI 评论 = "自己引自己"(RAG self-pollution)。
- 新增
authors/_template/notes/.gitkeep+authors/_template/notes/EXAMPLE.md:模板,带完整 frontmatter(title/work_slug/part/parent_file/type=reading-notes/authored_by=claude|user|mixed/source_repo/license=CC-BY-NC-SA-4.0/created)以及 1:1 与 1:N 聚合两种形式的注释样板。 - 新增
docs/design-doc.md"notes/ 读书笔记 sidecar(rev 6 / 2026-05-05)"小节:用途、与 works/ 的对比表、文件结构、frontmatter 字段定义、RAG 隔离实现、前端接入路线(未来独立 PR)。 - 与 page.md 的区别:page.md 是人写的导读(content_quality 重视);notes/ 是 AI 写的笔记(不进 RAG,但保留作 repo 文物,前端可作为可选附录渲染)。
- 工程层无需改动:
scripts/embed-pre-qin.ts与scripts/embed-corpus.ts通过readdirSync(worksDir)仅扫描works/,不递归notes/;src/lib/works.ts用 globauthors/*/works/*.md路径段写死。sidecar 默认就被 RAG 排除。 - 验证:
bun run scripts/validate-metadata.ts→ 575 entries / 0 errors;bun run scripts/embed-pre-qin.ts --dry-run→ embedded=5314 与本约定引入前一致(_template在 main loop 显式 skip,notes/不在扫描路径)。
先秦作家 author-voice 模式切换收尾(issue #2)
承接 rev 5 cleanup 的 kongzi / zhuangzi 切换,本轮把剩余 6 位先秦作家全部切到 author-voice 第一人称对话模式,issue #2 关闭:
- mengzi(孟子) — 雄辩气盛 / 排比反诘 / 援譬连类;fewshot 含性善 / 仁政 / 民本 / 浩然之气 / 与告子辩 / 私淑孔子 等 10 题。
- xunzi(荀子) — 论说严整 / 自称"况";fewshot 含性恶 / 礼论 / 天人之分 / 解蔽 / 正名 / 李斯韩非师承 / 与孟轲异同 / 君民舟水 等 10 题。
- hanfeizi(韩非) — 冷峻 / 寓言 / 自称"非";fewshot 含法术势 / 二柄 / 矛盾律 / 守株待兔 / 师承荀子 / 李斯之死 / 反显学 / 性自利 等 10 题。
- quyuan(屈原) — 抒情富丽 / 兮字楚辞 / 自称"余";fewshot 含离骚 / 哀郢思君 / 投江汨罗 / 香草美人 / 渔父 / 九歌 / 天问 等 10 题。
- sunzi(孙武) — 极简格言 / 兵家克制 / 自称"武";fewshot 含五事七计 / 知彼知己 / 不战而屈 / 诡道 / 吴宫教战 / 慎战 等 10 题。
- mozi(墨子) — 朴实平直 / 自称"翟";school-attributed 性质坦诚("此为吾门共有之论");fewshot 含兼爱 / 非攻 / 公输盘 / 节用非乐 / 三表 / 天志 等 10 题。
- 每位作家 skill.md ~600 字第一人称人格 + 7-8 条应答规则(强制引用 RAG / 超出材料明说 refusal / 不知未来);fewshot.jsonl 10 条样本,全部第一人称、引《xx》原文作据。
- 后续 corpus 缺口(mozi 的《公输》《非命》《明鬼》等篇)下波 ingest 补;现 fewshot 在 cite 时已透明标注。
荷马史诗 corpus 入库(双层公版策略)
补齐 authors/homer/works/,落实 CLAUDE.md "古典 / 小语种作家:不出原作者 voice,多译本融合中文 voice" 路线。中译本受版权约束(罗念生/王焕生 2041+,杨宪益 2060,陈中梅在世),方案绕开通行中译本走双层公版 corpus:
- 古希腊原文:Monro & Allen, Homeri Opera (OCT 1908-1920),从 PerseusDL/canonical-greekLit 拉 TEI XML,按卷切;保留 Allen 行号每 5 行一标,便于学术引用。伊利亚特 24 卷 / 奥德赛 24 卷。
- 公版英译:Samuel Butler 散文体(伊利亚特 1898 #2199 / 奥德赛 1900 #1727,Project Gutenberg);Butler 1902 卒,全公版;散文体相对易 RAG。各 24 卷。
- 中文导读:原
iliad.md/odyssey.md重命名为iliad-zh-guide.md/odyssey-zh-guide.md,保留自撰中文导读;license_notes修正去除"公版中译本暂无"措辞。 - 命名约定
<work>-<voice>-<book>.md(扁平结构,匹配 luxun 等现有作家约定 + 现embed-corpus.ts不递归的扫描行为);总计 96 个 corpus 文件 + 2 个导读 = 98 个 .md。 metadata.yaml:license_status改public-domain-corpus;works[].sources列出每个 corpus voice 的版本/译者/URL/license;新增voices: [homer-tutor-zh](type=native,mode=tutor,backend=prompt)。- 占位策略:
chat_enabled: false维持不变(Phase 0 聚焦鲁迅;荷马 page.md / fewshot.jsonl 仍为草稿);corpus 已就绪,flip flag 即可开 chat。 - 验证:spot-check μῆνιν 起始行、ἄνδρα 起始行、第 24 卷收束,无 Gutenberg 标记泄露;YAML safe_load 通过。
先秦元数据全面修订(rev 5 cleanup)
承接同日 rev 5 schema 扩展,集中一轮 11 条并行 wave + 1 条收尾 wave,对全部先秦 49 条作者/作品条目做真伪、断代、归属逐条清理;并把符合 CLAUDE.md author-voice 标准的两位先秦人物切换到第一人称对话模式。据多源学界主流(A.C. Graham 1960/1989、Hunter & Kern 2018、Yuri Pines 2017、Edward Shaughnessy 2022/2024、chinaknowledge.de 等)。
- 使用字段:rev 5 schema 引入的
composition_year_start/composition_year_end/authenticity(authentic/mixed/disputed/pseudo/lost) /attribution_status(self/disciple-compiled/traditionally-attributed/pseudo-attributed/composite/anonymous) /authenticity_notes,顶层text_compilation_date_start/text_compilation_date_end。 - W2-1 尚书 古文伪篇 — 《大禹谟》《舜典》《益稷》等保留全文 + frontmatter / metadata 标
pseudo,注明梅赜本伪古文学界共识,与今文真篇并存不删。 - W2-2 商君书 — 《御盗》标
lost(篇亡),补《外内》《君臣》两篇,修正 wikisource URL 错位。 - W2-3 孔子 / 诗经 — 孔子
attribution_status: disciple-compiled,作品归属仅保留《论语》(不再挂《春秋》《易传》《孝经》等托名);诗经补daya.md、lusong.mdworks 文件。 - W2-4 疑伪文本批 — 列子、鬼谷子、邓析子、尹文子、公孙龙子、宋玉、文子 7 条按学界主流标
disputed/pseudo+ notes,corpus 全部保留。 - W2-5 诸子+楚辞 metadata 批 — 老子、墨子、孙子、孙膑、吴子、司马法、尸子、屈原、楚辞 9 条,统一 schema 字段。
- W2-6 经史子军 metadata 批(25 条)— 礼记、仪礼、周礼、春秋、左传、公羊、谷梁、国语、战国策、山海经、易经、尔雅、逸周书、孝经、六韬、穆天子传、竹书纪年、吕氏春秋、晏子春秋、管子、鹖冠子、黄帝四经、尉缭子、慎子、申子(申不害)。
- W2-7 5 位新作者条目 —
zisi(子思)、yangzhu(杨朱)、huishi(惠施)、zengzi(曾子)、yan-hui(颜回),含 metadata.yaml + page.md,正配合影响图谱补缺。 - W2-8 庄子 author-voice 切换 —
voices[].mode → author-voice,重写 skill.md + fewshot.jsonl(第一人称内篇语调)。 - W2-9 孟子 — metadata 精修 + corpus 14 篇确认完整;mode 暂留 tutor(追踪 issue 待续)。
- W2-10 荀子 — metadata 精修 + corpus 32 篇(17 篇新抓 + 15 篇已有),新增
scripts/import-xunzi.mjs。 - W2-11 韩非子 — metadata 精修 + corpus 55 篇(40 篇新抓 + 15 篇已有),新增
scripts/import-hanfeizi.mjs。 - Wave 3 孔子 author-voice 切换 —
voices[].mode → author-voice,重写 skill.md + fewshot.jsonl(《论语》第一人称语调,强制 citation 子曰原文)。 - 统计:
50 个 metadata.yaml 更新,60 个新 corpus 文件(57 个 xunzi / hanfeizi 篇章 + 2 个 shijing 大雅鲁颂 + 1 个尚书古文伪篇结构补正),5 个新作者条目,2 处 mode 切换(kongzi / zhuangzi)。 - 验证:
bun run scripts/validate-metadata.ts→ 575 条目 0 错误;bun run scripts/embed-pre-qin.ts --dry-run→ 48 位先秦作者 / 3364 chunks 计划入库。 - 项目立场:忠实展现文本为先,伪篇 / 后人辑录 / 托名作品保留全文不删,严谨通过 schema 字段表达(authenticity + notes + 复合作者);作品级
chat_enabled不变,corpus 入库闸控保持原状。 - 剩余 author-voice 切换(mengzi / xunzi / hanfeizi / quyuan / sunzi / mozi)已建 GitHub issue 追踪:#2 先秦作家 author-voice mode 切换。
先秦元数据:真伪 / 断代 / 归属字段扩展(rev 5)
authors/_template/metadata.yaml新增可选字段:作品级composition_year_start/composition_year_end/authenticity/attribution_status/authenticity_notes;顶层text_compilation_date_start/text_compilation_date_end。覆盖先秦语料常见的伪篇、误传作者、年代不准三种情况,让下游 agent 能用结构化字段记录学术分歧。- 新增
scripts/validate-metadata.ts:zod schema 校验全部authors/*/metadata.yaml,新字段 optional,现有 570 条目全数通过。bun run scripts/validate-metadata.ts,退出码 0 / 1。 - 不破坏向后兼容:旧
year/birth/death单值字段仍接受;混合类型(数字 / "公元前 5 世纪" / "~750" / "unknown")继续容忍;不动任何已有 metadata 文件。 - 标注哲学:忠实展现文本是首要目的(鬼谷子、列子等保留全文 + chat_enabled),严谨态度通过新增字段表达,不删 corpus。
- 详细说明见
docs/design-doc.md"元数据真伪与断代字段"节。下一波 wave 2 会用这些字段对 49 条先秦条目逐条标注。
楚辞 / 屈原语料边界整理
- 将《楚辞》定位为总集、文体与编纂传统入口,关闭其独立 chat/RAG,避免和屈原、宋玉作者条目重复持有同一段全文。
- 归档
authors/chuci/works/chuci.md聚合全文;屈原条目继续负责《离骚》《九歌》《天问》《九章》《渔父》等传统归属屈原篇章。 - 清理屈原作品页的 Wikisource 页眉、作者栏、卷次栏和“本作品收录于……”等非正文导入残留。
- 将屈原 skill/fewshot 改回 tutor 模式,不再使用第一人称作家模拟。
古希腊罗马作家与作品目录扩充(88 条目)
- 古希腊罗马目录从 9 个作者条目扩到 88 个,覆盖希腊史诗、抒情、悲喜剧、史学、演说、哲学、希腊化诗歌、希腊语帝国文学、罗马共和国/帝国/古代晚期拉丁文学。
- 精校已有条目:荷马、赫西俄德、萨福、埃斯库罗斯、索福克勒斯、欧里庇得斯、维吉尔、奥维德补齐或重排核心作品清单;欧里庇得斯补至现存 18/19 部剧,三大悲剧家补齐现存剧目口径。
- 新增
scripts/update-greco-roman-catalog.mjs,以结构化数据批量生成古希腊罗马作者 metadata 与目录级 page,方便后续继续补作品全文和公版译文。 - 重写
eras/greco-roman/page.md,按体裁和时代重排作家作品总表,并补明收录口径、关键概念、非西方同期对照与版权提醒。
先秦文学目录二次补全与精校(49 条目 / 516 个作品项)
- 先秦目录从 31 条扩到 49 条,补入《春秋》《仪礼》《孝经》《尔雅》《楚辞》《司马法》《六韬》《逸周书》《穆天子传》《竹书纪年》《慎子》《申子》《邓析子》《尹文子》《尸子》《鹖冠子》《文子》《黄帝四经》等。
- 统一精校先秦元数据:补
paths: [china-pre-qin],把《诗经》《尚书》《周易》《左传》《国语》《战国策》等匿名或复合典籍标为entity_type: work,保留孔子、孟子、庄子、屈原等个人作者为author。 - 作品清单扩到 516 个作品/篇章项;《周易》补齐六十四卦与十翼,《仪礼》补齐 17 篇,《尔雅》补齐 19 类,《楚辞》补核心篇章。
- 从维基文库补入可用公版语料:《仪礼》《尔雅》《楚辞》《黄帝四经》《司马法》等;目录或提要性质强、正文不可靠的条目继续
chat_enabled: false,避免空 RAG 或弱依据 chat。 - 重写
eras/china-pre-qin/page.md,按诗歌、礼乐经典、历史散文、诸子、兵家、楚辞、神话地理、出土/辑佚文献重排先秦文学脉络。 - 清理一批 Wikisource 导入残留页脚(如“姊妹计划”“Public domain”“返回顶部”),减少 RAG 噪音。
先秦文学全面收纳(+18 位新作家,2672 chunks)
- 先秦文学 corpus 从 10 位作者扩充至 28 位,基本覆盖所有主要先秦典籍
- 新增 18 位作家目录及 RAG chunks:
- 经部:诗经(shijing / 4 chunks)、尚书(shangshu / 79 chunks)、周易(yijing / 6 chunks)、周礼(zhouli / 149 chunks)、礼记(liji / 243 chunks)
- 春秋三传:左传(zuozhuan / 671 chunks)、公羊传(gongyang / 143 chunks)、谷梁传(guliang / 128 chunks)
- 史部:国语(guoyu / 4 chunks)、山海经(shanhaijing / 117 chunks)
- 诸子:管子(guanzi / 16 chunks)、吕氏春秋(lvshi-chunqiu / 5 chunks)、公孙龙子(gongsunlong / 5 chunks)、晏子春秋(yanzi-chunqiu / 4 chunks)、商君书(shangjunshu / 4 chunks)
- 兵家:孙膑兵法(sunbin / 45 chunks)、吴子(wuzi / 16 chunks)
- 楚辞:宋玉(songyu / 25 chunks)
- 3 位作者标记 chat_enabled=false(wikisource 缺全页面):战国策、鬼谷子、尉缭子
- 10 位已有先秦作者 1006 chunks 已验证,unchanged
- 新增脚本:
scripts/import-pre-qin-wikisource.mjs、scripts/import-pre-qin-fix.mjs、scripts/embed-pre-qin.ts
对话分享、公开入口与目录维护
- ChatWidget 增加回答复制和分享图能力,方便把一次对话保存或传播出去
- 支持作者级
alt_titles,一千零一夜加入"天方夜谭"等别名,搜索和自动互链都能命中 - 修复一千零一夜
catalog_visibility导致的公开访问 404 - 删除 48 个时代页底部的"精读清单"章节,避免不完整清单占据正文空间;阅读路径后续会单独做
作品正文排版系统升级
- 作品页渲染层自动识别附录型二级标题并包为
aside.work-note,让"文学价值与影响"、版本说明、译本说明等内容脱离正文流 - 保留并统一升级
<aside class="callout">为旁注框样式,已有手写 callout 和自动附录框共用同一视觉系统 - 重做
poetry-body诗歌/史诗段落排版:史诗类作品可用layout: poetry标记,段落、章节、图片之间的留白更适合长篇韵文 - 收束
fiction-body的缩进规则:小说保留段首缩进,诗歌/史诗不缩进 - 作品页 Markdown 渲染启用
breaks: true,避免诗歌、韵文、古代文本行文黏连 - 作家页与时代页作品列表按年份排序;长篇集合可按
collection聚合,避免《道德经》81 章、《庄子》33 篇在时代页刷屏
古埃及文学扩充(+6 篇新作品,261 chunks)
authors/anonymous-egypt/新增 6 篇作品,works 从 21 增至 27 篇- 卡赫佩尔森布的哀叹(中王国社会批判文学)
- 伊普威尔箴言 / 阿普乌的哀叹(社会崩溃预言文学,可能是人类最早的"弥赛亚期望"文本)
- 安图夫墓竖琴手之歌("趁生时享乐"——古埃及版《传道书》)
- 陶阿夫的训导(通过比较各行各业凸显书吏优越性)
- 舒神颂歌(空气之神颂歌)
- 贝赫坦公主传奇(拉美西斯二世时代驱魔传奇)
- skill.md / page.md / metadata.yaml 同步更新(content_quality: 0→3)
- 261 chunks 入 Supabase(原 238)
美索不达米亚文学作品体系完善
- 将巴比伦/美索不达米亚匿名文学从伪作家目录重组到时代页入口,吉尔伽美什、埃努玛·埃利什等作为文明传统作品展示
- 创建美索不达米亚 19 部缺失作品,时代页开始显示作品列表;自动互链覆盖 tradition 类型条目
- 恩赫杜安娜作品从
anonymous-mesopotamia移回authors/enheduanna/,补齐《伊南娜与埃比赫》《神庙颂歌》等作品 - 《埃努玛·埃利什》加入图像资源;美索不达米亚文学页面完成一轮精校,修正 23 处错别字、语法错误和术语不统一
- 自动互链支持
alt_titles、短标题匹配和 hidden 条目,避免译名变体漏链
新增古埃及文学(文明级条目)+ 238 chunks 入 Supabase
- 新建
authors/egyptian-literature/(entity_type: tradition,模式同 gilgamesh / 古巴比伦文学) - 21 篇作品,涵盖宗教文本、创世神话、叙事文学、智慧文学、颂歌五大类
- 底本:E.A. Wallis Budge, The Literature of the Ancient Egyptians (1914, PD),LLM 英→中翻译
- 归档旧有独立 stub:
sinuhe/,ptahhotep/,book-of-the-dead/→archive/authors/ - embedding:238 chunks via BGE-M3 → Supabase pgvector
信息架构与视觉系统整理
- 首页、时代/流派页、文脉名录页完成视觉分区;时代/流派按起始年份排序
- 新增文脉 logo;作者索引、首页可对话作家列表、时代子分区支持折叠,降低长列表压迫感
- 父级时代页归档,子时代加国家/地区前缀,并补全 69 位作者生卒年
- 印度作家映射到六个子时代;古埃及文学和印度时代体系纳入同一浏览框架
- 作家索引限制时代预览长度,修复标题点击区域与折叠列表显示问题
批量新增 90 位中国古代文学家 + RAG 作品摄入 + author-voice 标准化
- 按 CLAUDE.md 的
mode判定标准,存世作品足够推测生平 → author-voice(第一人称),其余保持 tutor(第三人称) - 新增作者 90 位,按时期分布:
- 先秦 10:孔子、老子、孟子、荀子、墨子、屈原、韩非子、孙子、宋玉、列子(庄子已存在)
- 秦汉 8:司马迁、司马相如、贾谊、扬雄、张衡、枚乘、王充、蔡邕(班固已存在)
- 魏晋南北朝 15:曹操/曹丕/曹植、嵇康、阮籍、陶渊明、谢灵运、鲍照、陆机、左思、庾信、干宝、刘义庆、王羲之、孔融
- 唐代 15:李白、杜甫、王维、白居易、韩愈、柳宗元、李商隐、杜牧、孟浩然、刘禹锡、李贺、岑参、高适、王勃、陈子昂
- 宋代 15:苏轼/苏洵/苏辙、辛弃疾、李清照、陆游、欧阳修、王安石、柳永、秦观、周邦彦、姜夔、范仲淹、朱熹、晏殊
- 元明 14:关汉卿、王实甫、马致远、白朴、郑光祖、罗贯中、施耐庵、吴承恩、汤显祖、冯梦龙、张岱、袁宏道、徐渭、归有光
- 清/清末民初 13:曹雪芹、蒲松龄、吴敬梓、纳兰性德、袁枚、龚自珍、孔尚任、洪升、梁启超、王国维、刘鹗、朱自清、闻一多
- mode 分布:76 位 author-voice(第一人称,存世作品可推生平),14 位 tutor(第三人称,诸子哲人/纯哲学/生平信息极少的章回小说家)
- 每位作家包含完整的 metadata.yaml(含 works/voices/influences)、skill.md(系统提示)、page.md(导读桩)、fewshot.jsonl(2-3 条 QA)、works/ 目录
- RAG 作品摄入:从 zh.wikisource.org 抓取作品全文,创建 6 个 import 脚本(classics/poetry/prose-drama/philosophers/qinhan-weijin/novels-plays),88/90 位作家有至少一篇作品原文落地
- 论语 20 篇、道德经 81 章、孟子 14 篇、孙子兵法 13 篇、楚辞 5 篇、世说新语 33 篇、搜神记 20 卷等
- 唐诗宋词代表作:李白 12 首、杜甫 12 首、苏轼 7 首、李清照 5 首等
- 四大名著前 3-5 回、元曲代表作(窦娥冤、西厢记、牡丹亭、长生殿、桃花扇)
- 庄子 33 篇、鲁迅全集 71 篇已在之前嵌入
- 仅徐渭(四声猿无 wikisource 页)、郑光祖(倩女离魂仅 14 字 stub)2 位暂无作品
- 嵌入 Supabase pgvector:累计 ~4,700+ chunks,通过 BGE-M3 via Cloudflare Workers AI
公版作品全文与内容清洗批量落地
- 发布一批可用公版作品、古典文本、小说和散文全文,作品页开始承担真实阅读入口
- 加入《红楼梦》120 回全文与清洗脚本,为长篇章回小说的作品列表、全文渲染和后续 RAG 做压力测试
- 修复导入内容中残留 frontmatter、Wikisource 链接语法、版权 footer、异常换行等问题
authors/*/works/*.md区分full-text和commentary,小说全文走中文小说阅读模式
鲁迅 corpus 扩充:故事新编 + 朝花夕拾 + 野草(+45 篇)
- 新增
scripts/import-luxun-collections-wikisource.mjs抓鲁迅三本合集:故事新编 9(序言 + 8 短篇)、朝花夕拾 12(小引 + 10 散文 + 后记)、野草 24(题辞 + 23 散文诗)共 45 篇 / 119k 字符 - 三个新抓取情况首次出现:① 子页面相对路径(
故事新編/序言、朝花夕拾/小引);② 带消歧义后缀的 page name(秋夜 (魯迅)/采薇 (鲁迅)/雪 (鲁迅));③ 母页面 section 抽取(野草题辞嵌在野艸母页 section 2,没有独立子页) - 新增
scripts/clean-luxun-corpus.mjs清洗 wikisource 残留 — 文末 license footer("1996 年 1 月 1 日,...")、UI 行([编辑]/收听本文/姊妹计划:等)、OCR 生僻字占位(原字未收录于Unicode,结构:⿰...→□,鲁迅 corpus 里仅 4 个 unique pattern,整字符串替换不会误吞正文)。新 45 篇 + 老 26 篇全部洗过 authors/luxun/metadata.yamlworks[] +45 条,每条含collection字段标明集合归属authors/luxun/works/现 71 篇 / 265k 字符:呐喊 15(71k)+ 彷徨 11(75k)+ 故事新编 9(57k)+ 朝花夕拾 12(41k)+ 野草 24(20k)LICENSE_MARKERS在新 importer 里加1996/2007/2017年1月1日前缀 marker,防御未来类似 wikisource 版权 footer 漏切- 新增
.claude/skills/rag-ingest/SKILL.md:把 luxun 旧脚本(范式 A,多页分散)+ zhuangzi 脚本(范式 B,一书多章)+ 这次合集脚本(范式 B + 子页面 + section)作为 canonical 范式记录,未来新作家入 RAG 时引用 - Supabase 实际状态:luxun 老 26 篇 → 344 chunks 已嵌入;新 45 篇 ~290 chunks 待嵌入。
bun run embed实跑会按(chunk_index, content_hash)自动 skip 老 chunks(清洗只动了 trailing whitespace,hash 不变)
庄子 corpus 入 RAG(Phase 1 第二位公版作家)
- 新建
authors/zhuangzi/:metadata.yaml(chat_enabled: true,license: public-domain)+ skill.md(author-voice 模式,按 chat.ts 第一人称 prompt 模板写)+ fewshot.jsonl(7 条第一人称样本)+ page.md(首版导读,标status: draft待人工严肃审核) - 新增
scripts/import-zhuangzi-wikisource.mjs抓 wikisource 三十三篇(内 7 / 外 15 / 杂 11),共 81,755 字符;与鲁迅范式 A(多页分散)不同,采用范式 B(一书多章 + 统一 START_MARKER) - 33 篇 → 216 chunks → BGE-M3 嵌入 → Supabase pgvector,
embedding_version=2026-05-03 - 检索抽测:4 个 zhuangzi-y query(鲲鹏 / 庖丁解牛 / 子非鱼 / 鼓盆而歌)均能 surface 相应章节,相似度 0.45–0.58
- voices: 单 voice
zhuangzi-original(中文原作 / 文言原文进出),不走翻译网关 .claude/skills/rag-ingest/SKILL.md已把这次的 importer 引为范式 B 的 canonical 示例
搜索、流式对话与移动端聊天修复
- 新增全站 Cmd+K 搜索,覆盖作家、作品、时代/流派
- 聊天接口改为 DeepSeek SSE → NDJSON 中继 → 客户端逐字渲染
- 修复移动端 ChatWidget 多轮点击/触摸问题:backdrop tap delay、document-level capture click、pointerup 兜底和 300ms 去重
- GET fallback 不再复用 URL 里的
sessionId,避免同设备换号后误 403 - 聊天引用链接改为站内依据链接,面板隐藏状态和气泡排版做了一轮修复
邮箱登录:Magic Link + 验证码
- 新增
/auth/verify邮箱验证码页面,支持输入六位验证码登录,也支持邮件链接中的token_hash自动登录 - 邮箱登录邮件改为跳转验证码页;旧的
/auth/callback也会把邮件链接转交给验证码页处理 - 新增文脉版 Supabase Magic Link / Confirm Signup 邮件模板,避免默认 Supabase 文案误导用户
部署、限流与运行时护栏
- 新增 checked deploy pipeline,部署前跑检查脚本
- 收紧 Worker chat runtime bundle,避免 Cloudflare Worker 包体过大
- 登录账号每日消息数限制落地;聊天消息按账号限额
- 为微信内置浏览器补
crypto.randomUUID降级方案
移除微信登录
- 微信网站应用登录需要开放平台审核,且微信 OAuth 接口与 Supabase Custom OAuth 直连不完全兼容
- 移除前端微信登录入口、账号绑定入口、运行时配置和环境变量说明;当前保留 Google 与邮箱登录链接
chat 端到端:DeepSeek + Supabase 会话存储
- 新增 Astro
/api/chatserver endpoint,经 Cloudflare Worker 调 DeepSeek,不在浏览器暴露 API key - 新增
chat_sessions/chat_messages表;Phase 0.5 用浏览器 UUID 作为匿名 session,所有 user / assistant 消息服务端写入 Supabase - 作者页嵌入可用 chat 面板;刷新后按 sessionId 从 Supabase 读取历史
- 运行时使用
DEEPSEEK_API_KEY、SUPABASE_URL、SUPABASE_SERVICE_ROLE_KEY、SUPABASE_ANON_KEY与 Workers AIAIbinding;数据库 connection string 仅用于本地迁移
用户系统:Supabase Auth + Google / Email
- 新增静态站可用的 Supabase Auth 登录流程:
/login、/auth/callback、/account - Google 使用 Supabase 内置 OAuth provider;邮箱使用 Supabase Magic Link / OTP
- 新增
public.profiles,由auth.users触发器创建站内资料,RLS 限定用户只能读写自己的资料 - 顶部导航与面包屑区域接入登录状态入口
鲁迅 Phase 0 RAG 初版与强制引用
- 鲁迅 corpus 首批入库并嵌入,作为 Phase 0 端到端验证对象
- 收紧 chat citation grounding:回答必须基于检索片段,材料外问题要明确无依据
- 新增作品全文/导读分流,小说全文进入
.fiction-body阅读模式
站点骨架、设计系统与内容底座
- 初始化 Astro + Cloudflare Pages/Workers Static Assets + Supabase + 嵌入 CI 的项目骨架
- 江河版 design system 同步到 Astro 页面,包含首页、作家页、作品页、时代页、开放设计稿
- 批量导入 knowledge-base 71 位作家与 30 个时代/流派概览;古希腊作家作为首批内容上线
- 文案公开化:剥离个人阅读记录,72 篇作家页完成一轮公开站口吻润色
- 自动互链上线:作家名、作品名在 Markdown 渲染后自动链接到站内页面
rev 4:v1 stack 锁定 + 版权硬规则 + 产品定位
会话来源:plan-eng-review(含 codex outside voice 第二意见)
新增的项目级硬规则
- chat 仅对全公版作家开放:作品没全部进入公有领域的作家,不出 AI chat 入口。
metadata.yaml.chat_enabled: bool闸控,由版权状态驱动。版权未到期作家依然可以有 page.md 导读 + 影响图谱节点,只是 chat 组件不渲染。 - 产品定位双轨制:默认 chat 走 "基于以下文本回答 + 强制引用 + 不知道就说不知道" 的 tutor 模式;"和作家本人对话"的作家蒸馏模式作为实验性入口(隐藏或 feature flag),且 UI 必须明确"风格模拟,非作家本人"。
v1 技术栈锁定(覆盖原设计文档对应内容)
| 决策点 | 原方案 | 锁定方案 |
|---|---|---|
| 向量库 | Qdrant | Supabase pgvector(exact search,Phase 1 末向量数 >100k 时再考虑 HNSW) |
| API 层 | Hono 或 FastAPI 独立服务 | Astro server endpoints(v1 阶段 /api/chat 在 Astro 里) |
| 托管 | 未明定 | Cloudflare Worker(静态资源 + Astro server endpoints) |
| 嵌入 | BGE-M3 自托管或 API | BGE-M3 via Cloudflare Workers AI;CI 阶段走 REST API(不是 binding) |
| 主聊天 LLM | Claude Sonnet 4.6 / GPT-5 / Qwen-Max | DeepSeek Chat(个人 key 起步;provider 层后续可替换) |
| 缓存 Redis | Phase 0 公开站时上 | 推迟到 Phase 1(翻译网关上线时一并加,Upstash) |
| Auth | 未明定 | 推迟到 Phase 2(Supabase Auth) |
| 对话历史 | 未明定 | Supabase chat_sessions / chat_messages;Phase 0.5 先用匿名浏览器 sessionId |
Phase 0 必加(原设计文档遗漏)
- IP rate limit + prompt 长度上限 + max_output_tokens 上限 + per-request timeout + Origin header 校验
- 每日 LLM 花费 hard cap(优先在 provider 控制台层面设硬上限,KV/DO 计数器仅做软提示)
- 强制 citation:chat 输出必须能溯源到 RAG chunk;prompt 里硬规定"材料不够说不知道"
Eval 策略重写
原设计文档"style classifier 5-10 sample" 路线在 codex review 中被指为假严谨。Phase 0 改为:
- Golden set(20-50 题):human-curated 测试集,覆盖 citation 准确性、refusal 行为、中文可读性、幻觉检查
- LLM-judge 仍用,但跑 golden set 而非 holdout 自相似度
- Style classifier 推迟到 v2(LoRA 真训出来时才有意义,否则学的是 prompt 工程艺术品而非作家风格)
- 人工评估:Phase 0 不做(太早);Phase 1 末有外部访问后再启动
Phase 0 种子作家:博尔赫斯 → 鲁迅
- 博尔赫斯(1899-1986)作品多数辖区 2056 才公版 → Phase 0 种子换为鲁迅(1936 死,多数辖区 2007 起公版;中国大陆 1986 起公版)
authors/borges/文件夹保留:page.md 导读照常写,影响图谱节点照常存在,但chat_enabled: false,UI 不出 chat 组件authors/luxun/新建为 Phase 0 主战线
Codex outside voice 全部采纳的技术修正
- 删除 schema 里的
translation_cache(Phase 0 用不到,等 Phase 1 翻译网关再加) - chunks schema 加
unique(author_slug, voice_id, work_slug, chunk_index)约束 - chunks schema 加
content_hash、embedding_model、embedding_version、license、source_url、deleted_at字段 - Phase 0 不建 HNSW 索引(exact search ORDER BY embedding
<=>在 ≤100k 行内更稳) - pgvector 检索通过 SQL RPC(
match_chunks(...))暴露,不在客户端拼 SQL - Cloudflare Workers 不是 Node:所有 SDK 验证 edge runtime 兼容;skill.md 等 in-repo markdown 通过
import字符串/资产打包,不依赖fs.readFile - CI 嵌入走 Cloudflare Workers AI REST API + API token(GitHub Actions 不能用 wrangler binding)
- Voice selector UI 推迟到 Phase 1(Phase 0 单 voice 跑通即可)
- dev/prod 环境分离:至少分两个 Supabase project + CF env vars + 独立 DeepSeek key
已保留的设计(codex 提了但我们坚持的)
- 匿名 session 暂存:Phase 0.5 没有用户系统,浏览器只保存 sessionId;消息正文全部进 Supabase,跨设备等登录上线后再补
- HNSW 索引 schema 里留升级路径注释,Phase 1 末向量数过 100k 时启用