Wenmai Release Notes
Synced from docs/changelog.md
当前版本 v0.1
Diarium Operis

开发日志

版本记录 · 内容补充 · 编辑说明

v0.1
2026-06-02

伊本·图斐勒补入 Ockley 公版英译全文

这里现在直接读取仓库里的 docs/changelog.md。工程日志和公开开发日志共用同一份来源,避免线上版本记录再和提交历史脱节。

当前收录 82 条版本记录。

伊本·图斐勒补入 Ockley 公版英译全文

按 canon-expand 的“空壳优先”规则补齐 authors/ibn-tufayl/ 的作品全文:新增 Project Gutenberg #16831 所据 Simon Ockley 1708 年英译本 The Improvement of Human Reason,作为《哈伊·伊本·叶格赞》的公版英文全文页。现代中文译本仍在版权期内,未录入本站。

新增 scripts/import-ibn-tufayl-gutenberg.mjs,固定 Gutenberg #16831 下载、头尾清理和硬换行重组逻辑;metadata.yaml 同步标记该 work 的 coverage: full-textkind: full-text 与来源链接。chat_enabled 仍保持 false。

Issue 58 先秦两汉典籍全文补入

按 GitHub issue #58 的优先级补入一批公版中文典籍全文,新建 7 个独立典籍 entity:huainanzigongyang-zhuanguliang-zhuanhanshi-waizhuankongzi-jiayudaxuezhongyong

本轮共新增 67 个 works/*.md 全文页:《淮南子》21 篇、《春秋公羊传》十二公、《春秋谷梁传》十二公、《韩诗外传》10 卷、《孔子家语》10 卷,以及《大学》《中庸》单行本各 1 篇。文本据中文维基文库公版原文导入,并保留 source_url 到 frontmatter;正文清理页面导航、模板残留和空校勘标题。

新增 scripts/import-issue-58-classics-wikisource.mjs,固定本轮维基文库导入配置、请求节流、429 重试和正文清洗逻辑,便于后续复跑。7 个新增 entity 暂设 chat_enabled: false,先作为阅读页与后续路径编排语料,不进入 RAG。

admin 子域保持主 Worker 承载

确认 admin.wenmai.io 不再拆成单独 Worker。后台域名继续与 wenmai.io 一起由主 Worker wenmai 承载,wrangler.toml 里保留两个 custom domain routes;后台隔离继续通过 hostname gate / middleware 完成。

配套清理:

同日进一步把生产部署入口收口到 GitHub CI:删除旧的 Pages workflow,新增 .github/workflows/deploy-worker.yml,PR 只做构建/干跑检查,main push 与手动触发才执行 wrangler deploy --config wrangler.toml。项目不再依赖 Cloudflare Pages / Cloudflare 控制台直连 GitHub 自动部署;本地 npm run deploy 改为触发 GitHub workflow,直接 Wrangler 发布需要显式 ALLOW_DIRECT_WRANGLER_DEPLOY=1

Claude skills 迁移到 Codex 项目技能目录

.claude/skills/ 下现有 4 个 skill 复制到项目级 .agents/skills/。这是 Codex 迁移工具文档里 Claude skills 对应的项目内目标目录。

注意:这些是 Codex skills,不是 Codex 内置 slash commands;聊天框里的 /translate-work 不会因此注册。使用方式是 $translate-work 或自然语言触发。插画相关 skill 里的示例脚本路径也改成仓库相对路径,避免硬编码到旧机器目录。

同一作品的原文 / 多译本版本导航与桌面对照

把作品页的“同一部作品多个版本”关系补成第一类 UI:

Timeline 全文补齐、作品分类与 Supabase 入库收口

本轮把 timeline 补全文计划 issue #35#41 推进到可关闭状态:公共版权节点不再用 guide / excerpt 叶子冒充全文;所有 work frontmatter 的 kind 已收敛到 full-textexcerptguide 三类。

主要内容变化:

Supabase 收口:

页面性能:

最终内容审计口径:

M1 内容 issue 收口与 readiness 锁表

本轮把 M1 内容 issue #8、#10、#14、#16、#17、#18、#23、#24 全部推进到可关闭状态,并完成最后一次 timeline/chat readiness 收口:

关键收口结果:

同时补齐并关闭了与本轮相关的 GitHub issue:#8 #10 #14 #16 #17 #18 #23 #24

Issue 13 原文 corpus 收尾

中世纪欧洲史诗、克雷蒂安、一千零一夜、但丁四组 M1 节点从“导读 corpus”升级为“可检索公版原文 / 公版英译 corpus”:

新增 scripts/import-issue-13-originals.mjs,固定 GITenberg repo + commit,后续可复跑导入。所有新增原文均在 frontmatter 标明 source repo、source commit、Gutenberg ID 或 Wikisource 来源,并继续排除现代中文译本。

Timeline chat readiness 审计脚本与报告

docs/timeline-chat-milestone-1.md 的 M1 readiness 口径落成可复现脚本:新增 scripts/audit-timeline-chat-readiness.mjs,从 src/lib/timeline.tsauthors/<slug>/metadata.yamlpage.md、直属 works/*.md 和 Supabase chunks 表生成 timeline 节点状态。

本轮生成并提交:

脚本默认只审计 weight: major 节点,--all 可输出全量 timeline;支持 --json <path>--markdown <path>。Supabase 环境变量缺失时仍输出本地 readiness,并把 chunk coverage 标为 unknown。同时把 scripts/audit-chat-enabled.mjs 的 work 枚举修正为与 scripts/embed-corpus.ts 一致:只看 works/ 直属 .mdwork_slug = frontmatter.work_slug ?? basename(file, ".md"),避免递归子目录造成嵌入覆盖误报。

两个 audit 脚本都内置 M1_CHINESE_POETRY_RAG_AUTHORS = {wangwei, libai, dufu, baijuyi, sushi, xinqiji},与 scripts/embed-corpus.ts 的 M1 例外清单同步:对清单内作者把 chinese-poetry/chinese-poetry 导入也算成 expected works,对其他作者则继续跳过批量诗歌语料。审计因此能真实反映 baijuyi 等节点的全量 chunk 覆盖度。

收尾时修正 docs/timeline-copyright-matrix.md 的 movement 口径:已建成 collection / tradition 且版权清楚的公版 corpus 不再被误列为 metadata-only 阻塞项。

2026-05-08 — 修 devlog 页 <title> 字面量被解析成 HTML 标签

docs/changelog.md 第 212 行 h2 里的 /canon/<title> 占位写成了裸 <title>marked.parse 不会转义 inline HTML,浏览器把它当作真的 <title> 起始标签——后面所有内容(包括另外 56 条版本记录、<footer>、以及 body 末尾的 <script src="/motion.js" defer>)都被吞进隐式 <title> 文本里直到下一个 </title> 为止。

直接副作用:

修法:把那个占位包进 backtick 写成 `/canon/<title>`,与该条目正文里其它两处 `/canon/<title>` 写法一致。后续 changelog 写新条目时,凡是占位用尖括号的地方都要 backtick 包裹,避免再次触发这个 swallow 行为。

配图迁移到 Supabase Storage + 自动兜底

之前 public/images/<work-slug>/*.png 直接进 git,单作者动辄上百 MB;CI 还在重复拷贝静态资产。本轮把图片彻底搬到 Supabase Storage:

唐诗·宋词·元曲第一/二/三梯队大批量配图(gpt-image-2,约 5,000 张)

继 5-07 的试点(8 首短诗)后,本轮跑通 apimart.ai gpt-image-2 异步 task + 轮询协议批量出图,按梯队推进:

所有图都按 illustrate-work / illustrate-and-push skill 流程:抽场景 → gpt-image-2 出图 → 下载到 public/images/<work-slug>/ → 走上一条迁移流程上传 Supabase Storage → 按现有约定回填 markdown。

bulk corpus 部署架构稳定(worker bundle 81 MB → 26 MB)

加完 chinese-poetry 全唐诗/全宋词/元曲后,bulk 作品超过 8 万首。之前 [work].astro prerender=falsesrc/generated/work-pages.ts 整块(57 MB)塞进 CF worker bundle,撞上 64 MiB 限制(实际 81 MB),deploy 失败;中途切到全量 prerender 又导致 bulk 单首诗 404、build 时间 91s → 5.4 min。本轮把架构稳到 shard JSON + 局部 prerender 范式:

实测:worker bundle 26 MB(含 authors 21.7 MB;不再含 work bodies),build 54 s,HTML 6,431 个(远低于 CF Pages 20k 上限);bulk 集合页 + 单首诗都不再 404,生产环境图片也不再 404。

补齐 11 个 P0 空白/近空白文学路径(约 80 个 stub 实体)

按内容覆盖审计文档的优先级,把先前文学史 era 页里只剩骨架的 11 条路径补齐成"至少有作者列表 + 代表作品 stub"的状态:

副带修了 4 处 yaml 字段:alan-moore / daniel-defoe / mary-wollstonecraft / velimir-khlebnikov 的 metadata 里冒号没引号包裹,YAML 解析报 mapping value 错。

元曲语料挂入中国元代文学作者/作品体系

scripts/import-chinese-poetry-authors.mjs 新增 yuan 模式,按 public/corpus/chinese-poetry/yuan-qu 的 11,053 支元曲生成作者 stub 与作品 Markdown,并统一挂入 china-yuan。导入时把 高明《蔡伯喈琵琶记》 这类语料作者名拆成基础作者 + 剧名 collection,避免生成伪作者;唐宋同名条目不再被误复用。

scripts/generate-bulk-author-works.mjs 同步识别 元曲 / yuanqu-* corpus,bulk collection 使用 曲集 作为默认单位。scripts/embed-corpus.ts 显式跳过 chinese-poetry-author-import 批量语料,避免把批量诗词曲全文塞入 chat RAG。

修正元曲 title/body 混排导入

scripts/import-chinese-poetry-corpus.mjs 针对 chinese-poetry/chinese-poetry 的元曲数据增加题名拆分规则:当 title 中最后一个 后面明显是带句读的正文时,导入时把它移回正文开头,并在半句截断处接回第一段正文。

重建 /public/corpus/chinese-poetry 后,截图中「碧玉箫」一类条目不再把正文显示在标题里;同时恢复了 139 条原先因正文全在 title 字段而被跳过的元曲条目。

校正时代/流派路径:去悬空 slug,拆出古典泰米尔文学

文学史分类复核后,修正一批 authors/*/metadata.yamlpaths

配套更新 src/lib/eras.tssrc/lib/timeline.tsscripts/classify-authors.py。分类脚本现在从 eras/*/page.md 动态读取合法 slug,默认保留人工校订路径,避免再次生成已归档或不存在的路径。

Cloudflare 部署瘦身:批量诗词语料退出主路由图

批量导入 chinese-poetry/chinese-poetry 后,authors/*/works/*.md 增至 8 万余个,Astro/Vite 若继续把所有作品 Markdown 纳入主站路由图,会显著拖慢 Cloudflare 构建并放大 Worker 产物。

本轮把读者感知较低的批量语料从主站导航路由中剥离:

验证结果:当前全量 clean build 可通过;generate-work-pages 从 82,219 个 Markdown 中生成 3,561 个主站作品页,跳过 78,658 个批量语料文件;Worker 目录约 3.2MB,搜索索引 gzip 后约 250KB。

扩充 chinese-poetry 古典语料库

scripts/import-chinese-poetry-corpus.mjschinese-poetry/chinese-poetry 导入可用的主体文本语料,除原有全唐诗、宋词、元曲外,补入全宋诗、御定全唐诗、唐诗三百首、宋词三百首、花间集、南唐二主词、诗经、楚辞、论语、四书章句、蒙学、幽梦影、曹操诗集、纳兰性德诗词、水墨唐诗等子库;/corpus/chinese-poetry 改为动态子库选择与统一搜索入口。

全站搜索支持繁简标题互搜

全站 /search-index.json 生成时为作家、作品、时代的标题、副标题、别名与关键词补充简体/繁体搜索变体;SearchPalette 打分改用隐藏搜索字段,不改变 UI 显示标题。现在输入简体题名(如「早发白帝城」)可以命中繁体原题「早發白帝城」。

老子《道德经》主文本改为完整王弼本

authors/laozi/works/di-1-zhang.mddi-81-zhang.md 原先导入的是维基文库《老子(帛书本)》甲乙本分列文本,正文中大量 实为帛书残缺字,不适合作为站内主通读文本和 RAG corpus。

本轮改动:

拆分 arabic-persian era:阿拉伯文学 + 波斯文学

动机:阿拉伯文学和波斯文学虽共享伊斯兰文化圈,但语言、文体、谱系各自独立——合并展示在一张 era 页里既影响阅读体验也削弱了波斯古典诗等独有传统的可见度。

拆分结果

作家迁移(共 56 位,按 language 字段判定):

配套更新

未改动

Sonnet 第二轮 collection 顺序补全 + 拆分(908 + 591 + 17 文件)

A1-A5 collection book 顺序(共 908 文件)

B1-B3 monolithic 拆分(6 部,61 个分卷文件)

史记 5 篇补 collection: 史记 + book 顺序(bao-renan-shu 判定为信件不入 collection)

跳过未做 / 待人工核对

New scripts added


collection book 顺序补全(论语/庄子/鲁迅 5 集/老子/孟子/西游记/红楼梦/战国策/聊斋)+ 奥古斯丁《忏悔录》拆 13 卷

上一轮把 collection 页改为 TOC 之后用户发现:很多 collection 的 TOC 都是「卷 0」(因为底层 work 文件没有 book: 字段,collectionNumberOf 全部返回 0)。

修复路径:

code 改动 1 处src/pages/authors/[slug]/[work].astro collectionLabelOf):

11 个 collection 批量补 book: N + collection_unit(脚本 scripts/add-collection-book-numbers.mjs,~966 文件改动):

脚本三种模式:(1)显式 ordered 列表(论语/庄子/鲁迅),(2)autoFromSlug 正则提取(老子/西游记/红楼梦/战国策),(3)sequentialByVolumeSlug 复合排序(聊斋)。

1 个 monolithic 单文件拆分(脚本 scripts/split-augustine-confessiones.mjs):

还没做完(下一轮)

IA 规则成文 + collection 改 TOC + 诗词加 layout: poetry + 鲁迅长篇拆分

写下站内信息架构(IA)的核心规则到 CLAUDE.md / AGENTS.md,并据此做了一轮全站统一:

IA 规则(CLAUDE.md / AGENTS.md「信息架构(IA)规则」节): 每个作品的叶子节点(全文/导读)只走三条路径——

  1. 有作者 → 时代/流派 → 作者 → 作品entity_type: author
  2. 无作者 + 多作品合集 → 时代/流派 → 合集 → 作品entity_type: collection|tradition
  3. 无作者 + 孤立 → 时代/流派 → 作品entity_type: work

entity_type 修正:

collection 页渲染从「拼接全文」改为「TOC + 链接」src/pages/authors/[slug]/[work].astro buildCollectionBody):

鲁迅《阿Q正传》拆分scripts/split-aq-zhengzhuan.mjs):

中国古典诗词批量补 layout: poetryscripts/add-poetry-layout.mjs):

新建 authors/mu-allaqat/ 合集 entity(IA 规则 A1):

空 collections 内容补齐第一波(IA 规则 D2):

2026-05-07 — 典籍页全量可点击:现存合集走 /authors/X/Y,未入库走 /canon/<title> 占位

之前 canon/index.astro 把每条典籍渲染成纯文本 <li>《X》</li>,没有任何链接。改成全部可点击:

已入库的 6 部 → 直链对应 collection:

典籍 href
论语 /authors/kongzi/论语
孟子 /authors/mengzi/孟子
道德经 /authors/laozi/di(slug 自动从 di-N-zhang 公共前缀派生,丑但能用,不动 81 章数据)
南华真经 /authors/zhuangzi/庄子
冲虚真经 /authors/liezi/列子
文子 /authors/wenzi/wenzi

剩余 ~50 部未入库 → /canon/<title> 占位页:复用主题骨架(ambient + crumb + work-head + colophon),正文写「本经全文尚未收入文脉文库」+ 项目计划简述,末尾回 /canon 总目按钮。

Schema 改动canon/<school>/page.md frontmatter 的 sections[].works[] 现在接受字符串 或 {title, href} 对象两种形式(canon.ts:normalizeWork)。带 href 走外链,不带的走 /canon/<title> 占位。

新文件 / 改动

未做(user 选 B 不是 C):50 部未入库典籍的全文 ingest(含《大般若经》600 卷、《华严经》80 卷等)排到后续单独立项。

大规模补充宋词词库 + 按作家聚合 collection

目标:把宋词从零散几首扩充到按作家聚合的可读词集,每位作家一个 <姓名>词集 collection(works.ts:142 自动按 frontmatter.collection 聚合,≥2 篇即生效)。

新建 9 位词人目录(含五代南唐入宋的李煜):

slug 姓名 时期 词作篇数
lihouzhu 李煜 五代 15(虞美人·春花秋月、浪淘沙令·帘外雨潺潺、相见欢、乌夜啼、破阵子、玉楼春、望江南×2、子夜歌、长相思、菩萨蛮、清平乐、渔父×2)
zhushuzhen 朱淑真 南宋 4(蝶恋花·送春、减字木兰花·春怨、清平乐·夏日游湖、谒金门·春半)
wuwenying 吴文英 南宋 6(风入松·听风听雨过清明、唐多令·惜别、浣溪沙·门隔花深旧梦游、八声甘州·灵岩、祝英台近·除夜立春、齐天乐·与冯深居登禹陵)
shidazu 史达祖 南宋 2(双双燕·咏燕、绮罗香·咏春雨)
liuchenweng 刘辰翁 南宋遗民 3(永遇乐·璧月初晴、兰陵王·丙子送春、柳梢青·春感)
zhangyan 张炎 宋元之际 3(高阳台·西湖春感、解连环·孤雁、八声甘州·辛卯岁北归)
wangyisun 王沂孙 宋末 2(齐天乐·蝉、眉妩·新月)
jiangjie 蒋捷 宋末 2(虞美人·听雨、一剪梅·舟过吴江)
zhudunru 朱敦儒 北宋末南宋初 5(鹧鸪天·西都作、相见欢·金陵城上西楼、卜算子·旅雁向南飞、好事近·渔父词、西江月·世事短如春梦)

周密(zhoumi)暂未建:可靠词文不足 2 首(未达 collection 阈值),延后处理。

为现有 14 位词人补充代表作(覆盖原存量 ≤ 7 首的所有词家):

slug 姓名 原有→补后
liuyong 柳永 1 → 6(补 蝶恋花·伫倚危楼、八声甘州·对潇潇暮雨、望海潮·东南形胜、鹤冲天·黄金榜上、少年游·长安古道)
qingguan 秦观 1 → 7(鹊桥仙原是消歧义页,补完整词文;新增 满庭芳·山抹微云、踏莎行·郴州旅舍、浣溪沙·漠漠轻寒、千秋岁·水边沙外、江城子·西城杨柳、临江仙·千里潇湘)
jiangkui 姜夔 1 → 6(补 暗香、疏影、踏莎行·自沔东来、点绛唇·丁未冬、念奴娇·闹红一舸)
yanshu 晏殊 2 → 7(浣溪沙原是消歧义页,补完整;新增 蝶恋花·槛菊愁烟、踏莎行·小径红稀、清平乐·红笺小字、诉衷情·芙蓉金菊、玉楼春·绿杨芳草)
yanjidao 晏几道 2 → 8(补 蝶恋花·梦入江南、少年游·离多最是、思远人·红叶黄花、生查子·关山魂梦、阮郎归·天边金掌、清平乐·留人不住)
zhangxian 张先 2 → 4(补 青门引·乍暖还轻冷、千秋岁·数声鶗鴂)
zhubangyan 周邦彦 4 → 8(苏幕遮原是消歧义页,补完整;新增 兰陵王·柳、少年游·并刀如水、西河·金陵怀古、玉楼春·桃溪不作从容住)
xinqiji 辛弃疾 9 → 16(补 水龙吟·登建康赏心亭、摸鱼儿·更能消、贺新郎·别茂嘉、西江月·遣兴、鹧鸪天·壮岁旌旗拥万夫、鹧鸪天·送人、祝英台近·晚春)
sushi 苏轼 14 → 22(补 江城子·乙卯正月二十日夜记梦、蝶恋花·春景、浣溪沙·游蕲水清泉寺、行香子·述怀、临江仙·夜归临皋、水龙吟·次韵章质夫杨花词、西江月·照野弥弥浅浪、南歌子·雨暗初疑夜)
liqingzhao 李清照 9 → 12(补 凤凰台上忆吹箫·香冷金猊、念奴娇·萧条庭院、菩萨蛮·风柔日薄春犹早)
luyou 陆游 3 → 6(词作;补 鹊桥仙·夜闻杜鹃、鹊桥仙·华灯纵博、夜游宫·记梦寄师伯浑)
huangtingjian 黄庭坚 0 → 3 词(原 3 首皆诗,新增"黄庭坚词集":清平乐·春归何处、虞美人·宜州见梅作、鹧鸪天·黄菊枝头生晓寒)
ouyangxiu 欧阳修 2 → 7 词(补 蝶恋花·庭院深深深几许、踏莎行·候馆梅残、浪淘沙·把酒祝东风、玉楼春·尊前拟把归期说、采桑子·荷花开后西湖好)
fanzhongyan 范仲淹 1 → 3 词(补 渔家傲·秋思、御街行·纷纷坠叶飘香砌)

hezhu 贺铸(3)、zhangxiaoxiang 张孝祥(2)、fengyansi 冯延巳(5,含 quetazhi 内嵌 5 首鹊踏枝)现存量已达 collection 阈值,本轮未补。

collection 命名约定:所有词作 frontmatter 用 collection: "<姓名>词集"(如"苏轼词集"、"李煜词集"、"黄庭坚词集"——后者与现有"黄庭坚诗集"区分),src/lib/works.ts:142 listCollections 自动按此聚合,前端 /authors/<slug> 页与 /authors/<slug>/<collectionSlug> 自动出 collection 详情页。无需改代码

修复消歧义存根:3 个原本只列其他作者同名词的"消歧义页"被替换为该作家本人词文:

并给现有 liuyong/yulinling.mdjiangkui/yangzhouman.mdcollection 字段。

李煜目录归档:前会话用宽 slug(pozhenzi.mdyumeiren.md 等),与本轮窄 slug(pozhenzi-sishinian.mdyumeiren-chunhua.md 等)重复——把旧的 7 篇移到 authors/lihouzhu/works/archive/(按项目规则归档而非删除;works.ts glob 不递归子目录,archive 不影响聚合)。

总体增量

版本来源:所有词作出自维基文库 / 公版词集,作者均远过著作权保护期。本轮未抓取外网,全部依据通行简体本,frontmatter license: public-domain

未做的事

2026-05-07 — era 页改为按作家/集体作品 entity 分卡片 + 新建 yuefu collection

新增作家:徐渭(xuwei)+ RAG 嵌入

阿拉伯悬诗(Mu'allaqāt)collection 补齐

唐代词作者与作品全面补齐

唐诗代表作品扩充 + 元曲补全 + 清代作者 stub

巴洛克文学作者与作品补齐

维多利亚文学作者与作品补齐

文艺复兴作者与作品第一批补齐

萨福残篇全文与新残篇入口补齐

古希腊 / 古罗马时代拆分与古希腊作品入口补齐

搜神记 / 世说新语 整理为 collection

公开反馈页与后台留言删除

用户系统:手机号验证码登录接入

神学大部头作品 collection 聚合

欧洲中世纪作家与作品目录扩充

DeepSeek 默认模型 deepseek-chat → deepseek-v4-pro

deepseek-chat 计划下架,全仓 default 升到 deepseek-v4-pro

荷马史诗中译完整产出(48 卷,cc-by-sa-4.0)

继当日 corpus 双层公版策略入库(希腊原文 Allen 1920 OCT + Butler 1898/1900 英译),本轮把伊利亚特 24 卷 + 奥德赛 24 卷全部译为现代汉语散文体,仓库自产、license cc-by-sa-4.0。绕开通行中译本版权期(罗念生/王焕生 2041+,杨宪益 2060,陈中梅在世)的实际可行解。

吉尔伽美什全译本 gilgamesh.md 完成(Phase 2 + 3)

承接当日 Phase 1(Thompson 1928 启动)的 Tablet I 样章 + 术语表,本轮收尾 Phase 2 翻译 + Phase 3 拼装。

吉尔伽美什 Thompson 1928 全译本启动(Phase 1 样章 + 术语表)

anonymous-mesopotamia/gilgamesh 主条目改为「全译本」占位(基于 R. Campbell Thompson 1928 The Epic of Gilgamish (Oxford),英美均已公版)。新增 gilgamesh-summary 条目指向已有的 185 行散文梗概,避免占位与梗概互相覆盖。

欧洲中世纪页 name_zh 标注精确化

eras/medieval/page.mdname_zh 与标题从「中世纪」改为「欧洲中世纪」,避免与印度中世纪、拜占庭中世纪等混淆。

issue #3 P2-P4 收尾(管子谋失 / yijing 噪音 / 旧索引 / mozi 亡篇注)

继 P1 诗经全文导入,本轮收完 issue #3 剩余 phases。

周礼 metadata 拆 6 → 60 职官 + corpus 替换 + notes 聚合

eanzhao/17-z.com sites/zhouli 数据迁入。site-data.core.json 60 条 curated(6 大官 × 10 职官)作 metadata + works 粒度,fullClassical 完整经文作 corpus。

楚辞 / 庄子 校对 + 读书笔记 sidecar 入库

继 rev 6 notes/ sidecar 约定,本轮把 eanzhao/17-z.com 的 AI commentary 落地到楚辞与庄子。0 篇 corpus 替换——双方文本经校对均为编辑选择差异,不动 works/

山海经 18 区升级 + 552 条 AI 读书笔记 sidecar

山海经 corpus 升 3 倍(147 KB → 444 KB / 17.6 万字),同时 552 条 AI commentary 落入 notes/ sidecar(不进 RAG)。

诗经 305 首全文从 eanzhao/shijing 导入(option A,关闭 issue #3 P1)

works/ 305 个 .md 文件取代原 6 个 section 级 stub TOC。

notes/ 读书笔记 sidecar 约定(rev 6)

新增 authors/<slug>/notes/ 子目录约定:作家文件夹现在可以同时持有公版原文(works/,进 RAG)和 AI 生成的读书笔记 / 评论 / 导读(notes/不进 RAG)。动机是把 eanzhao/17-z.com 等外部 repo 的 commentary 字段(AI 写的导读)保留进仓库供前端展现,同时避免作家本人 voice 检索到 AI 评论 = "自己引自己"(RAG self-pollution)。

先秦作家 author-voice 模式切换收尾(issue #2)

承接 rev 5 cleanup 的 kongzi / zhuangzi 切换,本轮把剩余 6 位先秦作家全部切到 author-voice 第一人称对话模式,issue #2 关闭:

荷马史诗 corpus 入库(双层公版策略)

补齐 authors/homer/works/,落实 CLAUDE.md "古典 / 小语种作家:不出原作者 voice,多译本融合中文 voice" 路线。中译本受版权约束(罗念生/王焕生 2041+,杨宪益 2060,陈中梅在世),方案绕开通行中译本走双层公版 corpus:

先秦元数据全面修订(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)

楚辞 / 屈原语料边界整理

古希腊罗马作家与作品目录扩充(88 条目)

先秦文学目录二次补全与精校(49 条目 / 516 个作品项)

先秦文学全面收纳(+18 位新作家,2672 chunks)

对话分享、公开入口与目录维护

作品正文排版系统升级

古埃及文学扩充(+6 篇新作品,261 chunks)

美索不达米亚文学作品体系完善

新增古埃及文学(文明级条目)+ 238 chunks 入 Supabase

信息架构与视觉系统整理

批量新增 90 位中国古代文学家 + RAG 作品摄入 + author-voice 标准化

公版作品全文与内容清洗批量落地

鲁迅 corpus 扩充:故事新编 + 朝花夕拾 + 野草(+45 篇)

庄子 corpus 入 RAG(Phase 1 第二位公版作家)

搜索、流式对话与移动端聊天修复

邮箱登录:Magic Link + 验证码

部署、限流与运行时护栏

移除微信登录

chat 端到端:DeepSeek + Supabase 会话存储

唐诗宋词大型语料导入

里尔克 M1 全文化

用户系统:Supabase Auth + Google / Email

鲁迅 Phase 0 RAG 初版与强制引用

站点骨架、设计系统与内容底座

rev 4:v1 stack 锁定 + 版权硬规则 + 产品定位

会话来源:plan-eng-review(含 codex outside voice 第二意见)

新增的项目级硬规则

  1. chat 仅对全公版作家开放:作品没全部进入公有领域的作家,不出 AI chat 入口metadata.yaml.chat_enabled: bool 闸控,由版权状态驱动。版权未到期作家依然可以有 page.md 导读 + 影响图谱节点,只是 chat 组件不渲染。
  2. 产品定位双轨制:默认 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 必加(原设计文档遗漏)

Eval 策略重写

原设计文档"style classifier 5-10 sample" 路线在 codex review 中被指为假严谨。Phase 0 改为:

  1. Golden set(20-50 题):human-curated 测试集,覆盖 citation 准确性、refusal 行为、中文可读性、幻觉检查
  2. LLM-judge 仍用,但跑 golden set 而非 holdout 自相似度
  3. Style classifier 推迟到 v2(LoRA 真训出来时才有意义,否则学的是 prompt 工程艺术品而非作家风格)
  4. 人工评估:Phase 0 不做(太早);Phase 1 末有外部访问后再启动

Phase 0 种子作家:博尔赫斯 → 鲁迅

Codex outside voice 全部采纳的技术修正

已保留的设计(codex 提了但我们坚持的)