伊本·图斐勒补入 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-text、kind: full-text 与来源链接。chat_enabled 仍保持 false。
Issue 58 先秦两汉典籍全文补入
按 GitHub issue #58 的优先级补入一批公版中文典籍全文,新建 7 个独立典籍 entity:huainanzi、gongyang-zhuan、guliang-zhuan、hanshi-waizhuan、kongzi-jiayu、daxue、zhongyong。
本轮共新增 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 完成。
配套清理:
- 删除
wrangler.admin.toml,并删除 GitHub Actions 与scripts/deploy-check.mjs里对deploy --config wrangler.admin.toml的调用,避免以后误创建wenmai-admin。 scripts/write-assetsignore.mjs注释同步为单 Worker 口径。AGENTS.md/README.md记录硬约定:不要新增、恢复或部署wenmai-admin。
同日进一步把生产部署入口收口到 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:
- 新增
version_group/version_role/version_label/version_order版本字段,先用《哈姆雷特》原文 + 文脉新译做试点。 - 新增
alignment_id/alignment_status对齐字段。只有同一组alignment_id的版本才进入结构对齐;《哈姆雷特》先标为draft,表示幕 / 场结构已对齐,但不是逐行精校本。 - 作者页把同一作品的多个版本收成一张卡,卡内直接给各版本入口,避免原文和译本散成两张看起来互不相关的卡。
- 作品页顶部新增版本切换;桌面端可切到
?view=parallel并排阅读。若存在alignment_id,对照页按共同结构节点分行显示,并提供?part=act-1/?part=all这类长文本分段入口。 - 对照入口现在显式写入
part=all,分段状态可复制分享;窄屏下保留“单页 / 对照”切换,并给每个堆叠文本块补版本标签,避免退成单列后丢失左右关系。 - 设计文档同步补了“精校对照 / 版本树只对少数作品开放”的规则:段落级对齐需要人工校对,不能把所有译本都默认当成可比较版本树。
Timeline 全文补齐、作品分类与 Supabase 入库收口
本轮把 timeline 补全文计划 issue #35—#41 推进到可关闭状态:公共版权节点不再用 guide / excerpt 叶子冒充全文;所有 work frontmatter 的 kind 已收敛到 full-text、excerpt、guide 三类。
主要内容变化:
- 古典希腊罗马、印度/日本/波斯/阿拉伯、中世纪—启蒙、十九世纪欧洲与现代主义前夜节点批量补入公版原文或公版英译全文;没有公版中译时,不使用现代中译,改用原典 / 公版英译,并把文脉新译作为后续逐卷推进项。
- 旧的选段、导读、重复 leaf 统一移入各作者
archive/,避免站内 leaf 语义混乱。 al-jahiz补入《البخلاء》阿拉伯语原文全文,替换旧《动物书》选段 leaf,恢复 chat corpus 资格。
Supabase 收口:
- 对本轮变更范围逐作者执行真实 embedding,新增 / 更新长篇与诗文 chunk;
al-jahiz/al-bukhala新嵌入 793 个 chunk。 - 额外软删除被归档作品留下的 orphan chunks 858 个,避免 Supabase 仍命中过时选段。
node scripts/audit-chat-enabled.mjs结果为112/112合格。
页面性能:
scripts/generate-work-pages.mjs的 work body shard 从按作者分片改为按author/work分片,避免新增长篇全文后单一 shard 过大。src/pages/authors/[slug]/[work].astro增加小型渲染缓存,并继续对超长 full-text 跳过正文 auto-link,降低作品页重复打开成本。
最终内容审计口径:
node scripts/audit-timeline-content-quality.mjs:public_domain_non_full=0,non_standard_kind=0。node scripts/audit-work-kind-taxonomy.mjs:invalid=0。
M1 内容 issue 收口与 readiness 锁表
本轮把 M1 内容 issue #8、#10、#14、#16、#17、#18、#23、#24 全部推进到可关闭状态,并完成最后一次 timeline/chat readiness 收口:
npm run generate:chat-authors通过,当前生成 107 个 chat-enabled authors。npm run generate:author-completeness通过,生成 6347 条 completeness records。node scripts/audit-chat-enabled.mjs通过,107/107 chat-enabled authors 全部合格。node scripts/audit-timeline-chat-readiness.mjs --markdown docs/timeline-chat-readiness.md --json docs/timeline-chat-readiness.json通过,82 条 major timeline rows 中 ready 51、blocked-copyright 23、blocked-translation-copyright 2、metadata-only 6。
关键收口结果:
homer、hesiod、horace、ovid、sappho、virgil的缺失 chunks 已补齐,古典作者线恢复为可检索状态。aeschylus、plato保持诚实 blocked,不再用导读或梗概冒充可聊天 corpus。four-great-classical-novels、mesopotamian-literature、bible、quran等聚合/圣书节点完成版权边界说明与 delegated corpus 收口。lanling-xiaoxiaosheng、african-precolonial等仍按 metadata-only / blocked 策略处理,不误开 chat。
同时补齐并关闭了与本轮相关的 GitHub issue:#8 #10 #14 #16 #17 #18 #23 #24。
Issue 13 原文 corpus 收尾
中世纪欧洲史诗、克雷蒂安、一千零一夜、但丁四组 M1 节点从“导读 corpus”升级为“可检索公版原文 / 公版英译 corpus”:
one-thousand-and-one-nights:收入 Jonathan Scott 修订本 / Aldine 1890The Arabian Nights Entertainments Complete公版英译全本(GITenberg / Project Gutenberg #5668)。medieval-epic:收入《贝奥武甫》(J. Lesslie Hall 1892)、《罗兰之歌》(C. K. Scott-Moncrieff 1919)、《尼伯龙根之歌》(Daniel B. Shumway 1909)、《熙德之歌》(R. Selden Rose / Leonard Bacon 1919)的公版英译全文。chretien-de-troyes:收入 W. W. Comfort 1914Four Arthurian Romances中《埃雷克与埃尼德》《克利杰斯》《朗斯洛》《伊万》公版英译全文;《佩尔斯瓦尔》收入 French Wikisource 转录的 1911 公版古法语文本。dante:收入 GITenberg / Project Gutenberg #997/#998/#999 的《神曲》三部意大利语原文,以及 #71218《新生》意大利语公版文本;《论俗语》《飨宴》《帝制论》暂保留为本站中文导读。
新增 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.ts、authors/<slug>/metadata.yaml、page.md、直属 works/*.md 和 Supabase chunks 表生成 timeline 节点状态。
本轮生成并提交:
docs/timeline-chat-readiness.md/docs/timeline-chat-readiness.jsondocs/timeline-copyright-matrix.md
脚本默认只审计 weight: major 节点,--all 可输出全量 timeline;支持 --json <path> 与 --markdown <path>。Supabase 环境变量缺失时仍输出本地 readiness,并把 chunk coverage 标为 unknown。同时把 scripts/audit-chat-enabled.mjs 的 work 枚举修正为与 scripts/embed-corpus.ts 一致:只看 works/ 直属 .md,work_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> 为止。
直接副作用:
/devlog只渲染 11 条版本记录,其余 56 条丢失。motion.js没有被浏览器注册成 script,所有.reveal段落停在初始opacity: 0,整页看起来空白(顶栏与标题块仍可见)。- DOM 里
<body>只剩div.ambient+main.page两个子节点,<footer class="colophon">缺失。
修法:把那个占位包进 backtick 写成 `/canon/<title>`,与该条目正文里其它两处 `/canon/<title>` 写法一致。后续 changelog 写新条目时,凡是占位用尖括号的地方都要 backtick 包裹,避免再次触发这个 swallow 行为。
配图迁移到 Supabase Storage + 自动兜底
之前 public/images/<work-slug>/*.png 直接进 git,单作者动辄上百 MB;CI 还在重复拷贝静态资产。本轮把图片彻底搬到 Supabase Storage:
src/lib/imageBase.ts在渲染时把marked.parse输出的<img src="/images/...">改写到${BASE}/images/...。优先级:PUBLIC_IMAGE_BASE>PUBLIC_SUPABASE_URL推导值 > 仓库内硬编码FALLBACK_BASE,即便 CF auto-build 没读.env.local也不会出 404。- 4 个
marked.parse站点(src/pages/authors/[slug]/[work].astro、src/pages/authors/[slug].astro、src/pages/eras/[slug].astro、themes/classical-chinese/EntryRenderer.astro)统一接rewriteImageHtml。 scripts/upload-images-to-supabase.ts:idempotent 批量上传,本地 checkpoint 跳过已传文件;.gitignore新加public/images/与 checkpoint。astro.config.mjs+ 部署配置:fix: prevent Astro from copying public images/fix: exclude generated images from deploy build阻止 Astro/Vite 把 public/images 拷进 dist,避免 worker bundle 被图压垮。illustrate-work/illustrate-and-pushskill 同步:下载到本地后跑上传脚本,commit 时只git addmarkdown,不 add 图。
唐诗·宋词·元曲第一/二/三梯队大批量配图(gpt-image-2,约 5,000 张)
继 5-07 的试点(8 首短诗)后,本轮跑通 apimart.ai gpt-image-2 异步 task + 轮询协议批量出图,按梯队推进:
- 唐诗第一梯队:李白 249、杜甫 247、白居易 250、王维 250、杜牧 250、李商隐 250,共约 1,496 张。
- 唐诗二梯队:合计约 1,429 张(840 + 589 两批)。
- 宋词第一梯队:李清照 61、柳永 218、欧阳修 248、苏轼 372 / 379 张图、辛弃疾 645,共约 1,544 张。
- 宋词二梯队:486 张(7 + 479 两批)。
- 宋词三梯队:500 张(1 + 499 两批)。
- 元曲:起步 1 首试出。
所有图都按 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=false 把 src/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 范式:
[work].astro改回prerender=false,恢复isBulkWorkShell分支;但 body 不再走 client JS escape,bulk shell 直接服务端渲染(src/lib/work-body.ts+loadBulkWorkItem):从public/generated/work-bodies/shard-XX.json拉单首诗,过marked.parse+rewriteImageHtml+ autolink 同管线。src/generated/work-pages.ts只剩元数据(~2 MB),body 散到 194 个 shard JSON(共 130 MB)走ASSETS.fetch;prerender 页面([poem].astro/[slug].astro/eras/[slug].astro)走src/lib/work-body-build.ts用 fs 同步读 shard。- shard JSON 在 CF Worker isolate 里 module-scope Map 缓存 + inflight Promise 去重:同 shard 第二次起 fetch + parse 都跳过;冷启动首次仍要 fetch 一次。
scripts/generate-author-metadata.mjs:build 时把 7,000+ 个metadata.yaml预解析成src/generated/author-metadata.tsJSON,运行时JSON.parse一次(50 ms)替代现场7 s 冷启动)。yaml.parse(generate-bulk-author-works.mjs:合并 curator 单文件到 bulk corpus,按(authorSlug, collectionName, simpTitle)索引。命中:workSlug改成 curator 的 friendly slug,curator 正文里的行追加到 bulk 末尾;未命中:作为新条目并入 bulk。273 条单文件已合,李白shi-ji从 1,207 → 1,211。generate-bulk-author-works.mjs给每个 item 加searchText字段,把title/titleNative/bookLabel/workSlug/year/genre这些短字段过opencc-js出简繁两种变体后 lowercase 拼起来——李白诗集等 bulk 集合页内部搜索现在简繁互查(body 不做变体,避免 shard 体积 ×3)。- 作家页 collection 卡 lead 文本:strip 掉每段里的
再判长度,避免「李白词集」卡显示成字面字符串。
实测: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"的状态:
- african-precolonial(6):sundiata / mwindo / kebra-nagast / ifa / utendi-wa-tambuka / manding-griot
- dada-surrealism(8):breton / tzara / eluard / aragon / ball / desnos / artaud / soupault
- latin-american-modernismo(6 新 + 2 补挂):silva / casal / lugones / nervo / agustini / herrera-y-reissig;ruben-dario、jose-marti 补挂 path
- russian-silver-age(10):akhmatova / mandelstam / tsvetaeva / blok / mayakovsky / pasternak / bryusov / khlebnikov / gumilyov / bely
- transmedia(6):michael-joyce / jackson / moulthrop / danielewski / moore / gaiman
- enlightenment(10):swift / defoe / diderot / rousseau / montesquieu / wollstonecraft / richardson / fielding / lessing / sterne
- classicism(5):corneille / la-fontaine / boileau / dryden / pope
- romanticism(14):wordsworth / coleridge / blake / byron / keats / shelley / mary-shelley / schiller / novalis / poe / holderlin / hugo / lermontov / mickiewicz
- gothic(5):walpole / radcliffe / stoker / le-fanu / mr-james
- absurdist-theatre(5):ionesco / genet / pinter / adamov / durrenmatt
- existentialism(4):kierkegaard / sartre / de-beauvoir / unamuno;kafka 补挂 path
副带修了 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.yaml 的 paths:
- 删除悬空路径:
mu-allaqat、china-song-yuan、chinese-classical、ancient-near-east-canon、indian-classical-canon、world-epic-tradition、日本细分页等不存在的 slug。 - 悬诗相关诗人回到
arabic;元曲/元代诗文作者回到china-yuan;徐渭归china-ming。 biblical-hebrew严格保留给古代圣经希伯来文本:迈蒙尼德改归medieval,阿莫斯·奥兹改归global-south。indian-epic收窄为两大史诗谱系;婆罗多、跋娑、波你尼、钵颠阇利、考底利耶、龙树、马鸣等转入indian-classical-sanskrit。- 新增
eras/indian-classical-tamil/page.md,承接阿维亚尔、蒂鲁瓦鲁瓦尔、伊兰戈·阿迪迦、萨坦那,避免把桑伽姆/后桑伽姆泰米尔传统塞进梵语史诗。 - 紫式部时间线入口改用较完整的
authors/murasaki/,旧murasaki-shikibustub 隐藏且不再挂时代路径。
配套更新 src/lib/eras.ts、src/lib/timeline.ts 与 scripts/classify-authors.py。分类脚本现在从 eras/*/page.md 动态读取合法 slug,默认保留人工校订路径,避免再次生成已归档或不存在的路径。
Cloudflare 部署瘦身:批量诗词语料退出主路由图
批量导入 chinese-poetry/chinese-poetry 后,authors/*/works/*.md 增至 8 万余个,Astro/Vite 若继续把所有作品 Markdown 纳入主站路由图,会显著拖慢 Cloudflare 构建并放大 Worker 产物。
本轮把读者感知较低的批量语料从主站导航路由中剥离:
scripts/generate-work-pages.mjs只生成非批量作品页数据;批量诗词作品继续留在/corpus/chinese-poetry语料浏览器。src/lib/works.ts不再 eager import 全量 Markdown,改读生成的src/generated/work-pages.ts,避免 Vite 追踪 8 万个作品模块。- 全站搜索索引改为构建前生成的静态
public/search-index.json,并过滤批量导入作者与批量作品。 - chat 作者包只生成
chat_enabled=true条目,避免把不可对话作者元数据打入 Worker。 - 公共作者列表、时代页、作者/作品静态路径过滤批量语料作者;旧的批量作者 URL 在 Worker 层 308 重定向到
/corpus/chinese-poetry?q=作者名。 /corpus/chinese-poetry支持PUBLIC_CHINESE_POETRY_CORPUS_BASE_URL,可将大体积 corpus 资产外置到 R2/CDN;未配置时仍使用本地打包资产。
验证结果:当前全量 clean build 可通过;generate-work-pages 从 82,219 个 Markdown 中生成 3,561 个主站作品页,跳过 78,658 个批量语料文件;Worker 目录约 3.2MB,搜索索引 gzip 后约 250KB。
扩充 chinese-poetry 古典语料库
scripts/import-chinese-poetry-corpus.mjs 从 chinese-poetry/chinese-poetry 导入可用的主体文本语料,除原有全唐诗、宋词、元曲外,补入全宋诗、御定全唐诗、唐诗三百首、宋词三百首、花间集、南唐二主词、诗经、楚辞、论语、四书章句、蒙学、幽梦影、曹操诗集、纳兰性德诗词、水墨唐诗等子库;/corpus/chinese-poetry 改为动态子库选择与统一搜索入口。
全站搜索支持繁简标题互搜
全站 /search-index.json 生成时为作家、作品、时代的标题、副标题、别名与关键词补充简体/繁体搜索变体;SearchPalette 打分改用隐藏搜索字段,不改变 UI 显示标题。现在输入简体题名(如「早发白帝城」)可以命中繁体原题「早發白帝城」。
老子《道德经》主文本改为完整王弼本
authors/laozi/works/di-1-zhang.md 至 di-81-zhang.md 原先导入的是维基文库《老子(帛书本)》甲乙本分列文本,正文中大量 □ 实为帛书残缺字,不适合作为站内主通读文本和 RAG corpus。
本轮改动:
- 81 章全部重写为维基文库《道德经(王弼本)》经文正文,去掉王弼注文、跋文、音义,只保留完整经文。
collection从道德经(帛书本)改为道德经,所有章显式标记layout: "prose"。- 新增
scripts/import-laozi-wangbi.mjs,可从维基文库 raw source 重新生成 81 个章节文件,并自动检查残缺字标记。 authors/laozi/metadata.yaml记录站内采用王弼本通行章序。
拆分 arabic-persian era:阿拉伯文学 + 波斯文学
动机:阿拉伯文学和波斯文学虽共享伊斯兰文化圈,但语言、文体、谱系各自独立——合并展示在一张 era 页里既影响阅读体验也削弱了波斯古典诗等独有传统的可见度。
拆分结果:
- 删除
eras/arabic-persian/page.md - 新增
eras/arabic/page.md(前伊斯兰诗 + 阿拔斯黄金 + Nahda + 现当代马格里布、巴勒斯坦、海湾、马赫贾尔等) - 新增
eras/persian/page.md(萨曼/伽色尼新波斯语复兴 + 古典黄金 + 印度风格期 + 现代 She'r-e No)
作家迁移(共 56 位,按 language 字段判定):
- 31 位 →
paths: [arabic]:abdelrahman-munif, abu-nuwas, adunis, al-ghazali(双语,主要作品阿拉伯语), al-hariri, al-jahiz, al-khansa, al-maarri, al-mutanabbi, antarah, assia-djebar(马格里布法语 → 阿拉伯文化圈), elias-khoury, ghassan-kanafani, hanan-al-shaykh, ibn-al-muqaffa, ibn-arabi, ibn-battuta, ibn-hazm, ibn-khaldun, ibn-tufayl, imru-al-qays, khalil-gibran, mahmoud-darwish, mu-allaqat, naguib-mahfouz, nizar-qabbani, one-thousand-and-one-nights, tahar-ben-jelloun, tarafa, tayeb-salih, usama-ibn-munqidh - 25 位 →
paths: [persian]:ahmad-shamlou, anvari, attar, bayhaqi, bozorg-alavi, ferdowsi, forugh-farrokhzad, hafez, houshang-golshiri, jami, khaqani, mahmoud-dowlatabadi, nasir-khusraw, nima-yooshij, nizami-ganjavi, omar-khayyam, rudaki, rumi, saadi, sadegh-choubak, sadegh-hedayat, sanai, simin-daneshvar, sohrab-sepehri, suhrawardi(伊朗"光明哲学")
配套更新:
src/lib/eras.tsTIME_PERIOD_SLUGS:arabic-persian→arabic、persianscripts/classify-authors.py:分类规则按language含 "波斯语" / "阿拉伯语" 分流;马格里布法语兜底归阿拉伯;OVERRIDES 字典内 21 条对应作家更新scripts/import-kb.ts:知识库目录映射改为 05-阿拉伯文学 + 06-波斯文学(kb 侧目录后续单独归档)
未改动:
src/lib/timeline.ts中"阿拉伯-波斯书写扩张"等史诗章句保留——这是文化圈描述,不是 era slug- 各作家 page.md / skill.md 中"阿拉伯—波斯混血""阿拉伯—波斯修辞学"等行文保留——作家个体语境的客观事实
Sonnet 第二轮 collection 顺序补全 + 拆分(908 + 591 + 17 文件)
A1-A5 collection book 顺序(共 908 文件):
- A1 章回小说(autoFromSlug):三国演义 3 回、水浒传 3 回
- A2 先秦经典(explicit books 列表 / 24 个 collection):
- 韩非子 55、墨子 53、荀子 33、管子 23、礼记 25、仪礼 17、周礼 60
- 尚书 29、国语 21、春秋三传各 12、山海经 18、吕氏春秋 26
- 商君书 25、尉缭子 24、孙膑兵法 16、吴子 6、六韬 6
- 鬼谷子 14、列子 8、公孙龙子 6、楚辞 5、晏子春秋 8
- 周易 74(64 卦 + 10 翼)
- A3 诗经 305 篇(新脚本
add-shijing-book-numbers.mjs):volume 1-6(国风/小雅/大雅/周颂/鲁颂/商颂),book=poem_index - A4 诗词集 66 个 collection(按年份/slug 顺序):杜甫/李白/白居易/辛弃疾/李煜/苏轼 等约 400 首新增 book+collection_unit
- A5 戏剧/三言/福音书:关汉卿杂剧集 4 部、三言 3 部、福音书 3 卷
B1-B3 monolithic 拆分(6 部,61 个分卷文件):
- 琵琶記(gaoming):42 出 → pipaji-01~42.md(原文移 archive)
- 人生如梦(calderon):3 幕 → la-vida-es-sueno-1~3.md
- 薄伽梵歌(vyasa):16 章 → bhagavad-gita-sanskrit-01~16.md
- 迷途指津(maimonides):3 卷 → guide-for-the-perplexed-1~3.md
- 痴儿西木传(grimmelshausen):5 卷 → simplicissimus-1~5.md
- 梦与话语(quevedo):3 卷 → suenos-y-discursos-1~3.md
史记 5 篇补 collection: 史记 + book 顺序(bao-renan-shu 判定为信件不入 collection)
跳过未做 / 待人工核对:
- 仪礼 ji-sang-li slug 已修正为 jixi-li(既夕礼)
- 荀子超过 32 篇含重复 slug(faxing/yibing 对应多篇),需人工核查:repo 有 33 文件,按字母序分配到 32 篇号位置
- Homer iliad.md/odyssey.md 是导读 overview 页,非全文,保留单文件
- Hesiod theogony/works-and-days/shield/catalogue 连续诗体无章节,保留单文件
- hangongqiu(马致远)/ zhaoshigu-er(纪君祥)无折标记或内容较短,保留单文件(B4 规则)
- gongzizhen/jihai-zashi 318 首己亥杂诗全在一文件,拆分需要识别每首边界,跳过(复杂度高)
- guanzi books 列表中第 10-11 项(bayan/baguan)均为"八观"同名,实为两篇不同文本,保留两个不同 book 号
- 吕氏春秋 repo 无 Das zweite Buch 对应的 lvshichunqiu 第二本 Buch(德语原文问题),已用 26 篇覆盖
New scripts added:
scripts/add-shijing-book-numbers.mjsscripts/split-pipaji.mjsscripts/split-la-vida-es-sueno.mjsscripts/split-bhagavad-gita.mjsscripts/split-maimonides.mjsscripts/split-simplicissimus.mjsscripts/split-quevedo.mjs
collection book 顺序补全(论语/庄子/鲁迅 5 集/老子/孟子/西游记/红楼梦/战国策/聊斋)+ 奥古斯丁《忏悔录》拆 13 卷
上一轮把 collection 页改为 TOC 之后用户发现:很多 collection 的 TOC 都是「卷 0」(因为底层 work 文件没有 book: 字段,collectionNumberOf 全部返回 0)。
修复路径:
code 改动 1 处(src/pages/authors/[slug]/[work].astro collectionLabelOf):
book_label未设时,默认从卷 N改为读collection_unit字段- 新规则:
{unit} {book},例:「篇 1 学而」、「回 5 西游记 第 5 回」
11 个 collection 批量补 book: N + collection_unit(脚本 scripts/add-collection-book-numbers.mjs,~966 文件改动):
- 论语 20 篇(学而 → 尧曰,传统篇序)
- 庄子 33 篇(内 7 / 外 15 / 杂 11)
- 鲁迅 5 集 = 70 篇(呐喊 14 / 彷徨 11 / 故事新编 9 / 朝花夕拾 12 / 野草 24 / 各按原始出版顺序)
- 老子《道德经(帛书本)》81 章(slug
di-N-zhang自动推导) - 孟子 14 篇(梁惠王上 → 尽心下 7 篇 ×2 上下)
- 西游记 100 回(slug
西游记-N自动推导,unit: 回) - 红楼梦 120 回(slug
红楼梦-N自动推导) - 战国策 33 卷(slug
juan-NN自动推导) - 聊斋志异 475 篇(按
volume+ slug 复合排序,累计 1..475)
脚本三种模式:(1)显式 ordered 列表(论语/庄子/鲁迅),(2)autoFromSlug 正则提取(老子/西游记/红楼梦/战国策),(3)sequentialByVolumeSlug 复合排序(聊斋)。
1 个 monolithic 单文件拆分(脚本 scripts/split-augustine-confessiones.mjs):
authors/augustine/works/confessiones.md(589KB 单文件)→ 13 个分卷文件confessiones-1.md...confessiones-13.md,挂collection: "Confessions(忏悔录)"、book: N、book_label: 卷一..卷十三、collection_unit: 卷- 原文件归档到
authors/augustine/works/archive/confessiones-monolithic.md - 用户访问
/authors/augustine/confessiones现在是 13 卷 TOC;分卷/authors/augustine/confessiones-1是单卷正文页
还没做完(下一轮):
- 108 个 collection 仍欠
book:字段(韩非子 55 篇、墨子 53、礼记 25、周易 64 卦、周礼 60、诗经 305、孝经、仪礼、春秋三传、孙子兵法、Bhagavad Gita 等)—— 多数需要手动建立传统篇序映射,下次再做 - 30+ monolithic 单文件 >25KB 未挂
collection,候选拆分(按文件大小降序):- Maimonides《迷途指津》1.5MB(3 部 70+ 章,希伯来/阿拉伯哲学经典)
- Grimmelshausen《Simplicissimus》1.4MB(5+ 卷)
- Quevedo《Sueños y discursos》1MB(多梦集)
- Calderon《La vida es sueño》212KB(3 幕剧)
- 高明《琵琶记》210KB(42 出南戏)
- Bhagavad Gita 梵文 188KB(18 章)
- Plautus 三剧 各 130-170KB
- Hesiod《神谱》《工作与时日》《赫拉克勒斯之盾》各 60-150KB
- 王国维《人间词话》84KB(64 节,可能保留单文件)
- Homer《伊利亚特》《奥德赛》各 40+KB(注:另有按卷拆好的 iliad-greek-N / iliad-zh-N 等已存在)
IA 规则成文 + collection 改 TOC + 诗词加 layout: poetry + 鲁迅长篇拆分
写下站内信息架构(IA)的核心规则到 CLAUDE.md / AGENTS.md,并据此做了一轮全站统一:
IA 规则(CLAUDE.md / AGENTS.md「信息架构(IA)规则」节): 每个作品的叶子节点(全文/导读)只走三条路径——
- 有作者 →
时代/流派 → 作者 → 作品(entity_type: author) - 无作者 + 多作品合集 →
时代/流派 → 合集 → 作品(entity_type: collection|tradition) - 无作者 + 孤立 →
时代/流派 → 作品(entity_type: work)
entity_type 修正:
authors/shijing/(诗经):work→collection(305 篇匿名民歌,明显是合集)authors/mabinogion/(马比诺吉昂):work→collection(4 篇威尔士传奇 + 数篇骑士传奇)authors/poetic-edda/(诗体埃达):work→collection(神话诗 + 英雄诗多篇匿名集合)- 删除拼写错误目录
authores/(仅含空sadegh-choubak/works/.gitkeep,未被src/lib/works.ts加载)
collection 页渲染从「拼接全文」改为「TOC + 链接」(src/pages/authors/[slug]/[work].astro buildCollectionBody):
- 旧版:
/authors/luxun/aq-zhengzhuan等 collection 页把所有分卷正文拼成一页(西游记 100 回、唐诗 100+ 首一并展示,单页过长) - 新版:collection 页只渲染目录——
卷 N {标题}行链接到各分卷独立页/authors/<slug>/<workSlug>;自动检测是否所有 books 都有卷号,没有卷号的(诗词合集)只展示作品标题 - 副作用:collection layout 不再继承首篇
layout,统一走 prose-body(TOC 不是诗)
鲁迅《阿Q正传》拆分(scripts/split-aq-zhengzhuan.mjs):
- 原
aq-zhengzhuan.md(64KB 单文件)→ 拆为 9 章:aq-zhengzhuan-1.md至aq-zhengzhuan-9.md,挂collection: "阿Q正传"、book: N、book_label: "第N章" - 原文件移到
archive/aq-zhengzhuan-monolithic.md保留对照 /authors/luxun/aq-zhengzhuan现在是 9 章 TOC;/authors/luxun/aq-zhengzhuan-1...-9是分章独立页
中国古典诗词批量补 layout: poetry(scripts/add-poetry-layout.mjs):
- 共 566 个 zh-classical / zh 诗词 work 文件追加
layout: "poetry"frontmatter - 匹配 genre:诗 / 词 / 词组 / 散曲 / 散曲组 / 赋 / 辞 / 骚 / 楚辞 / 乐府 / 乐府诗 / 长诗 / 叙事诗 / 抒情诗 / 哲理诗 / 绝句 / 律诗 / 五言诗 / 七言诗 / 古体诗 / 拟古 / 诗组
- 视觉:李白《静夜思》、杜甫《兵车行》、辛弃疾、李清照等数百首作品从
.fiction-body(首段空两格)改走.poetry-body(居中窄列、不缩进、行高 2.08)
新建 authors/mu-allaqat/ 合集 entity(IA 规则 A1):
metadata.yaml:entity_type: collection、paths: [arabic-persian]、works 列 7 主 + 3 补共 10 首page.md:3000+ 字概述——qaṣīda 三段式、悬诗传说与学界质疑、阅读顺序、版权地图- 与
paths/mu-allaqat.md互补:path 是阅读路径(深度路线图),合集 entity 是 era 卡片入口(让 arabic-persian era 页能直接看到悬诗合集)
空 collections 内容补齐第一波(IA 规则 D2):
authors/gushishijioushou/(古诗十九首):从维基文库抓取 19 首全文,每首独立 work 文件,挂collection: "古诗十九首"、book: 1-19。脚本:scripts/import-gushishijioushou.mjsauthors/troubadours/:补 2 篇代表作(贝尔纳·德·凡塔多恩《见到云雀飞翔》、若弗雷·吕戴勒《远恋之歌》)—— 奥克语原文公版片段 + 中文导读authors/icelandic-sagas/:补 2 篇代表作(《尼雅尔萨迦》《埃吉尔萨迦》)—— DaSent 1861 / Green 1893 公版英译入口 + 中文导读authors/english-mystery-plays/:补 2 篇代表作(韦克菲尔德《第二牧羊人剧》、约克循环《钉十字架》)—— Pollard 1890 / Smith 1885 公版本入口 + 中文导读- 上述 6 篇均
kind: commentary、status: stub,明确"待补全"——避免把代表作页误当 RAG 全文
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> 占位。
新文件 / 改动:
src/lib/canon.ts:加CanonWorkRef类型 +normalizeWork+workHref+listAllPlaceholderWorkssrc/pages/canon/index.astro:把<li>《w》</li>换成<a href={workHref(w)}>《w.title》</a>,加.has-text/.placeholder两套 hover 样式(已入库走 accent,占位走 muted + 虚下划线)src/pages/canon/[work].astro:新建占位路由,getStaticPaths从 canon YAML 收集所有无href的条目canon/rujia/page.md、canon/daojia/page.md:6 处加 href
未做(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 个原本只列其他作者同名词的"消歧义页"被替换为该作家本人词文:
qingguan/works/queqiaoxian.md(鹊桥仙·纤云弄巧)yanshu/works/huanxisha.md(一曲新词酒一杯)zhubangyan/works/sumuzhe.md(燎沉香)
并给现有 liuyong/yulinling.md、jiangkui/yangzhouman.md 补 collection 字段。
李煜目录归档:前会话用宽 slug(pozhenzi.md、yumeiren.md 等),与本轮窄 slug(pozhenzi-sishinian.md、yumeiren-chunhua.md 等)重复——把旧的 7 篇移到 authors/lihouzhu/works/archive/(按项目规则归档而非删除;works.ts glob 不递归子目录,archive 不影响聚合)。
总体增量:
- 新作家:+9 位
- 新词文件:约 75 篇
- 修正存根:3 篇
- 自动生成的 collection:~24 个
<姓名>词集聚合页
版本来源:所有词作出自维基文库 / 公版词集,作者均远过著作权保护期。本轮未抓取外网,全部依据通行简体本,frontmatter license: public-domain。
未做的事:
- 新建作家未补
page.md/skill.md/fewshot.jsonl——按项目规则(CLAUDE.md "page.md 必须自己写或 LLM 辅助 + 人工严肃审核"),延后人工补充 - metadata.yaml 的
works字段做了基础列表,未做完整年代考证 chat_enabled: true已为新作家开启(全公版),但 RAG 嵌入未跑(待scripts/embed-corpus.ts下次执行时增量收)- 周密(zhoumi)目录暂未建(可靠词文不足 2 首)
2026-05-07 — era 页改为按作家/集体作品 entity 分卡片 + 新建 yuefu collection
src/pages/eras/[slug].astro渲染重构:era 页不再每作品一卡(旧版/eras/china-han散落 30+ 张作品卡),改为每个 entity(author / collection / tradition)一卡。卡片内行内列出该 entity 名下的作品 / 体裁合集,例:- 司马迁卡片 → 内列 6 篇
《项羽本纪》《高祖本纪》《淮阴侯列传》《屈原贾生列传》《报任安书》《太史公自序》 - 汉乐府卡片 → 内列
汉乐府古辞 3 篇(collection 聚合) - 古诗十九首卡片 → 即使
works/暂空也占一卡(collection entity 也是一等公民)
- 司马迁卡片 → 内列 6 篇
- 卡片排序:按
birth/text_compilation_date_start升序;同年按中文姓名排序 entity_type视觉区分:collection / tradition / work 加集/传统/文本标签;author 不加(默认)- 影响所有 era / movement 页:唐代 41 卡、宋代、明清等同步生效;总卡数大幅下降,可读性提升
- 新建
authors/yuefu/——汉乐府 collection entity(entity_type: collection,paths: [china-han]):metadata.yaml:3 个 works(孔雀东南飞 / 陌上桑 / 东门行)+ tutor voice(无单一作者,第三人称讲解员)page.md:4000 字导读,覆盖采诗制度、与《诗经》《楚辞》对照、三种叙事模式(悲剧 / 喜剧 / 绝望)、与五言诗及建安诗人的关系skill.md+fewshot.jsonl:tutor 模式样本- 3 篇全文 works(来源:维基文库《古诗为焦仲卿妻作》/《艳歌罗敷行》/《乐府诗集》卷三十七):
- 《孔雀东南飞》(350+ 句完整长篇 + 序言「漢末建安中…」)
- 《陌上桑》(《艳歌罗敷行》三段)
- 《东门行》古辞本辞(含《乐府解题》引言)
chat_enabled: true——汉代匿名作品全公版
- 修正了原始
gushishijioushou.influenced_by中yuefu这个悬空引用——本次新建 yuefu entity 后该引用被解析
新增作家:徐渭(xuwei)+ RAG 嵌入
- 新建作家文件夹:
authors/xuwei/——明代文学家、书画家、军事家(1521–1593),公安派先驱 - 收录 7 篇代表作品全文(来源:维基文库):
- 《歌代啸》(杂剧,~25000 字)——四折无标题杂剧,讽世奇作
- 《南词叙录》(论著,1559)——中国戏曲史上首部南戏理论专著
- 《自为墓志铭》(墓志铭,1565)——自述生平,有自缢前绝笔之称
- 《十白赋》(赋,~1565)——为胡宗宪代笔的十篇咏物小赋(鹿、兔、鹊、猴等)
- 《梅赋》(赋,~1570)——咏梅名篇
- 《亡妻潘墓志铭》(墓志铭,~1546)——悼亡妻潘氏,年仅十九
- 《进白鹿表》(表,~1562)——代胡宗宪进呈嘉靖帝的二通贺表
chat_enabled: true——作家死于 1593 年,全球公版且中文原作无译本问题scripts/import-xuwei-wikisource.mjs——维基文库抓取脚本(范式 B:独立页面 + 统一 START_MARKER)- RAG 嵌入完成:92 个 chunks(BGE-M3 / 1024 维),已写入 Supabase
chunks表 page.md(导读 ~3000 字)、skill.md(tutor 模式系统提示)、fewshot.jsonl(8 条覆盖代表作/理论/生平/ refusal) 已完成
阿拉伯悬诗(Mu'allaqāt)collection 补齐
- 新增 collection 索引:
paths/mu-allaqat.md——介绍七首悬诗 + 三首补充悬诗的传说、qaṣīda 三段式(atlāl / raḥīl / fakhr)、阅读顺序、传承脉络(前伊斯兰部落口传 → 乌玛叶 → 阿拔斯 → 安达卢西亚 → 现代阿拉伯诗) - 扩充 / 新增 7 大悬诗 works 文件——每篇含 25–40 对句的"阿拉伯文 + 拉丁转写 + 公版英译(Lyall 1885 / Johnson 1893)+ 文脉新中译"四语对照,加分段导读:
- 伊姆鲁勒·盖斯(
imru-al-qays)—— 大幅扩充原 5 对句版本到 40 对句,覆盖全诗五大段(废墟、爱情、夜与晨、骏马、暴雨) - 塔拉法(
tarafa)—— 新建 32 对句,覆盖废墟、骆驼大写真、享乐宣言、死亡预感 - 安塔拉(
antarah)—— 新建 30 对句,覆盖质疑式开篇、战场单骑、思念阿布拉
- 伊姆鲁勒·盖斯(
- 新建 4 位悬诗作者作家文件夹(含 metadata / skill / page / works/muallaqa-zh):
- 祖海尔(
zuhayr)—— 反战 + ḥikma 哲理诗的奠基;28 对句 - 拉比德(
labid)—— 自然主义 + 动物悲剧;32 对句;先知亲赞之"阿拉伯人说过的最真诗句" - 阿姆鲁·伊本·库勒苏姆(
amr-ibn-kulthum)—— 部落咆哮 + 弑君事件;28 对句 - 哈里斯·伊本·希尔扎(
harith-ibn-hilliza)—— 法庭辩护诗;24 对句
- 祖海尔(
- 新建 3 位补充悬诗作者作家文件夹:
- 纳比加(
al-nabigha)—— 谢罪诗 + 著名"你是太阳,其他国王是星辰";18 对句 - 阿尔阿沙(
al-asha)—— 商旅诗 + 酒诗奠基;18 对句 - 阿比德·伊本·阿巴拉斯(
abid-ibn-al-abras)—— 反规范 + 命运诗;16 对句
- 纳比加(
- 版权一致性:阿拉伯文原文(公元 6 世纪)与英译(Lyall 1885 / Johnson 1893 / Geyer 1928 / Lyall 1913)皆已超过 70 年公版;A. J. Arberry (1957) 仍在版权期未引用;中译均为本站新译。所有作家
chat_enabled: false(按 rev 4 规则——译本中译公版作品稀缺,待译本审定后再开);corpus 待嵌入
唐代词作者与作品全面补齐
- 填写存根:温庭筠(
wentingyun)、韦庄(weizhuang)、韦应物(weiyingwu)——完成 page.md 导读、skill.md、fewshot.jsonl 和全部词作 works/*.md - 新增唐代词人 7 位:张志和(
zhangzhihe)、皇甫松(huangfu-song)、韩翃(hanhong)、王建(wangjian)、戴叔伦(daishulun)、司空图(sikongtu)、段成式(duanchengshi)——均含完整元数据、导读、skill、fewshot 和词作全文 - 新增五代过渡词人 2 位:冯延巳(
fengyansi)、李煜/李后主(lihouzhu,避开已有liyu/李渔)——涵盖南唐词对宋词的桥梁作用 - 为已有诗人补充词作:李白(菩萨蛮、忆秦娥、清平乐)、白居易(忆江南、长相思、竹枝词、浪淘沙)、刘禹锡(忆江南、杨柳枝、浪淘沙)
- 新增唐代词主题总览页:
topics/ci-tang/page.md——涵盖词体起源、发展三阶段、两场范式革命、唐→宋桥梁,附完整作家索引表和推荐阅读路径 - 所有新增词人
chat_enabled: true(全公版);词作文本优先从维基文库/公版来源导入
唐诗代表作品扩充 + 元曲补全 + 清代作者 stub
- 唐诗作品大量扩充:为李白、杜甫、王维、白居易、刘禹锡、柳宗元、韩愈、孟郊、贾岛、李商隐、李贺、王勃、卢照邻、骆宾王、杨炯、宋之问、沈佺期、张九龄、张若虚、贺知章、孟浩然、王昌龄、王翰、王之涣、崔颢、岑参、高适、刘长卿、陈子昂、元稹 等三十余位唐代诗人补充代表作品全文(共计两百余篇 works/*.md)
- 元代戏曲作品补全:关汉卿《望江亭》、郑光祖《倩女离魂》、纪君祥《赵氏孤儿大报仇》、高明《琵琶记》、马致远等;
scripts/import-prose-drama-wikisource.mjs扩充约 30 条元曲、明清戏剧、元代散曲诗词条目用于后续维基文库自动导入 - 新建清代核心作者 11 位 stub:王夫之、黄宗羲、顾炎武、姚鼐、方苞、郑燮、纪昀、黄景仁、赵翼、沈复、李渔——含 page.md/skill.md/metadata.yaml/fewshot.jsonl,但 works/ 待后续填充;
chat_enabled: true已开,RAG corpus 入库需等待 works/ 补齐 - 同步更新
src/generated/chat-authors.ts和eras/china-yuan/page.md
巴洛克文学作者与作品补齐
- 新增巴洛克核心作者:贡戈拉、克维多、卡尔德隆、约翰·多恩、安德鲁·马维尔、格里美尔斯豪森;完善既有
sor-juana,统一归入paths: [baroque]。 - 新增 15 个
works/*.md:优先使用公版中译但未确认可入库文本;实际入库为西语/德语/英语原文、Project Gutenberg 公版英译,以及文脉自写中文导读。 - 更新
eras/baroque/page.md与时间线,补充殖民地巴洛克和已入库底本状态;新增scripts/import-baroque-literature.mjs作为可复跑来源导入脚本。 - 所有新增巴洛克作者
chat_enabled: false:文本页已上线,但 RAG 嵌入、citation 回归和译本版权复核尚未完成。
维多利亚文学作者与作品补齐
- 扩充
authors/dickens/,新增夏洛蒂·勃朗特、艾米莉·勃朗特、乔治·艾略特、萨克雷、托马斯·哈代、丁尼生、伊丽莎白·巴雷特·勃朗宁、罗伯特·勃朗宁、王尔德、霍普金斯。 - 新增 39 个
works/*.md作品导读页,优先记录英文公版底本入口;中文译本只记录早期译介线索或版权状态,不导入未经确认的现代中译全文。 - 更新
eras/victorian/page.md的代表作家表述和站内补充说明。
文艺复兴作者与作品第一批补齐
- 新增文艺复兴作者条目:拉伯雷、蒙田、马基雅维利、托马斯·莫尔、克里斯托弗·马洛、埃德蒙·斯宾塞、阿里奥斯托、塔索、伊拉斯谟;均归入
paths: [renaissance],chat 保持关闭。 - 完善既有条目:莎士比亚、塞万提斯、薄伽丘、彼特拉克、弥尔顿补 works metadata、page 导读和作品页入口。
- 新增 19 个
works/*.md导读页。中文公版可确认的优先挂中文维基文库入口(如朱生豪译《哈姆雷特》《暴风雨》);未确认可入库中文译本的,挂 Project Gutenberg / English Wikisource 原文或公版英译,并只写本站中文导读。 - 版权策略:不复制现代中译全文;所有新增作品页标
kind: commentary,避免把导读页误当 RAG 全文。
萨福残篇全文与新残篇入口补齐
authors/sappho/works/fragmenta.md保留 Wharton 1908 Project Gutenberg 公版底本,覆盖其所收 170 个残篇与 Fayum fragments;明确这是“现存残篇”口径,不是古代九卷诗集的完整传本。- 新增/校准单篇入口:
hymn-to-aphrodite.md、fragment-31.md使用 Wharton 公版希腊文与英文直译;中文部分只写导读,不冒充既有中译本。 tithonus-poem.md、brothers-poem.md使用 The Digital Sappho 的 CC BY-SA 4.0 现代整理希腊文本,并配本站工作英译 + 中文导读;metadata 明确标为cc-by-sa-4.0-edition,避免混作纯公版译本。- 未找到可靠可入库的公版中译本,因此不复制现代中译;萨福作家页与 metadata 同步说明文本来源、授权边界和 chat 暂不开启。
- 验证:
npm run build通过;bun run scripts/validate-metadata.ts→ 695 entries / 0 errors。
古希腊 / 古罗马时代拆分与古希腊作品入口补齐
- 将 active era 从
eras/greco-roman/拆为eras/ancient-greek/与eras/ancient-roman/;旧页归档到archive/eras/greco-roman/。 - 89 个原
greco-roman作者 metadata 改为ancient-greek、ancient-roman或双路径;奥古斯丁、波爱修斯、普鲁登提乌斯、马克罗比乌斯保留 / 补入medieval桥接路径。 - 更新时代列表、作者索引、时间线和目录维护脚本,避免后续重新生成旧
greco-roman路径。 - 新增
scripts/update-ancient-greek-work-guides.mjs,为 47 个古希腊 / 希腊语传统作者的 154 个 metadata 作品补齐works/*.md入口;已有荷马全文、三大悲剧代表页等不覆盖。 - 这些新增作品页均为
kind: commentary、license: cc-by-sa-4.0,明确标注“暂无可入库公版中文译本时,只放原典 / 公版英译候选入口 + 文脉自写中文导读”,不复制现代中译本。
搜神记 / 世说新语 整理为 collection
- 给
authors/ganbao/works/soushenji-juan*.md与soushenji-xu.md共 21 个文件加上collection: "搜神记"与book字段(序=0,卷=1..20);空壳索引soushenji.md归档至archive/authors/ganbao/,让/authors/ganbao/soushenji走 auto-collection。 - 把
authors/liuyiqing/works/全部章节批量改名为shishuoxinyu-NN-<pinyin>.md(NN 为传统 36 章原序号),并补book字段;从维基文库抓回缺失的 16 企羡 / 21 巧蓺 / 36 仇隟 三章,36/36 章齐。/authors/liuyiqing/shishuoxinyu自此可作为聚合页通读。 - 文本清洗:剔除维基文库残留——前后章节链接(如「忿狷第三十一」「尤悔第三十三」)、
返回页首、重复书名、作者:刘义庆、上卷上·...卷标、◄/►导航箭头;soushenji-xu.md整段去重;soushenji-juan03/04/07段首 U+3000 全角空格统一去掉。 - 新增
scripts/normalize-collection.ts(可重跑、--dry-run预览),后续若再有同形态 wikisource 抓取可复用; 另加scripts/cleanup-orphan-chunks.mjs清理 chapter rename 后 chunks 表残留的 529 条孤儿 chunk(软删除,可--hard物理删)。
公开反馈页与后台留言删除
- 新增
/feedback公开留言页,仅接受文字内容;提交后留言直接展示在页面的最近留言列表。 - 新增
/api/feedback服务端 endpoint,写入feedback_messages表,公开读取时只返回未删除留言,并加入同源校验、长度限制与按 IP hash 的基础限流。 - 新增后台
/admin/feedback,管理员可软删除不适宜公开展示的留言;删除后前台立即隐藏,后台保留删除时间与操作者记录。 - Supabase 新增
feedback_messages表、索引、RLS 与 service_role policy;前端不直接访问表。
用户系统:手机号验证码登录接入
- 登录页新增手机号 / 邮箱分段切换,手机号默认走中国大陆
+86前缀,同时接受13800000000、8613800000000、+8613800000000并统一规范为 E.164。 - Supabase Auth 接入 Phone OTP,短信供应商按 Twilio Verify 配置;验证码验证页同时支持邮箱验证码与手机短信验证码。
/api/auth/config忽略<...>占位环境变量,避免本地.dev.vars占位值覆盖真实 Supabase anon key。- 账号页与显示名逻辑兼容邮箱、Google 与手机号用户;导航优先读取
profiles.display_name,不再把 Google 账户名或邮箱当作最终显示名。 docs/auth.md补充 Twilio Account SID / Auth Token / Verify Service SID、Geo permissions、Unsupported phone provider、Invalid API key、Twilio60238等排障说明。
神学大部头作品 collection 聚合
- 将阿奎那《神学大全》四个 Project Gutenberg 分卷合并为
collection: "神学大全·English Dominican Province 英译本",自动生成/authors/aquinas/summa-theologiae聚合页。 - 将奥古斯丁《上帝之城》Marcus Dods 英译两卷合并为
collection: "上帝之城·Marcus Dods 英译本",自动生成/authors/augustine/de-civitate-dei聚合页。 - collection 页面支持
book/book_label/collection_unit,避免非史诗文本被硬编码显示为重复的「卷 2」。 - 将奥古斯丁
confessiones-1-1.md从works/归档到archive/works/;它只是《忏悔录》I.1 双语样章,不再作为独立作品卡展示。 - 新增
scripts/format-theology-works.mjs批量整理《忏悔录》《上帝之城》《神学大全》Project Gutenberg 正文:清理标题页、目录、广告与尾注噪音,转换 Book / Question / Article / Chapter 标题层级,并为论述类全文标记layout: prose。
欧洲中世纪作家与作品目录扩充
- 新增/更新欧洲中世纪目录条目:古英语、武功歌、骑士传奇、北欧萨迦、伊比利亚、女性神秘主义、晚期英语与法语城市文学等 40+ 个作者/文本/传统节点。
- 补齐但丁、彼特拉克、薄伽丘、乔叟等核心条目的 works metadata,并将薄伽丘纳入 medieval + renaissance 双路径。
- 重写
eras/medieval/page.md:按早期中世纪、英雄史诗、宫廷爱情、宗教与女性声音、晚期白话、伊比利亚与旅行文学重排代表作表。 - 当前仅做目录与导读,chat 均保持关闭;后续补公版底本或自产译文时再逐条评估版权与 RAG。
DeepSeek 默认模型 deepseek-chat → deepseek-v4-pro
deepseek-chat 计划下架,全仓 default 升到 deepseek-v4-pro。
- chat 路径:
src/pages/api/chat.ts的callDeepSeek/callDeepSeekStream两处 fallback。 - 离线翻译:
scripts/translate-works.py的request_deepseek硬编码 model + argparse--model默认 + 启动 print 三处。 - 配置/文档:
.env.example默认值、wrangler.toml注释、docs/design-doc.md架构图同步。 - 生产生效路径:实际模型由
wrangler secret put DEEPSEEK_MODEL控制(runtime env 覆盖代码 fallback);prod 若已 set 旧值,需重新 set 一次后才能切到新模型。 - 历史
chat_messages.model行(约 78 条)保留deepseek-chat标记,作为旧请求的归档证据,不回填。
荷马史诗中译完整产出(48 卷,cc-by-sa-4.0)
继当日 corpus 双层公版策略入库(希腊原文 Allen 1920 OCT + Butler 1898/1900 英译),本轮把伊利亚特 24 卷 + 奥德赛 24 卷全部译为现代汉语散文体,仓库自产、license cc-by-sa-4.0。绕开通行中译本版权期(罗念生/王焕生 2041+,杨宪益 2060,陈中梅在世)的实际可行解。
- 架构:Opus 4.7 把控 taste,Sonnet 4.6 执行翻译。Opus 直出伊利亚特卷 1 第 1-100 行作 frozen anchor;其余 47.5 卷由 8 波 Sonnet agent(每波 5-6 个 in parallel/background)按 anchor 风格批量生成。
- 风格规则:现代汉语散文(21 世纪报刊文学体例);专名罗念生体例(阿基琉斯/阿开亚人/达那俄斯/伊利昂/奥林波斯,罗马名 Jove/Juno/Minerva 等全部还原为希腊名);Homeric epithets 全保留(捷足的、白臂的、银足的、玫瑰指的、跛足的等);段落对齐 Butler 自然段;段尾
[B.X-Y]标希腊行号区间;破折号 ≤ 5 / 卷;弯引号“…”。 - 关键 cross-book 一致性:
- 帕特罗克洛斯之死(卷 16)与赫克托耳之死(卷 22)共用同一句 Homeric 死亡公式:「灵魂从他身上飞离,进入冥府哈得斯,悲哀地离去,告别了他的英勇和青春」(τὸν δὲ κατ' ὄσσε ἔλλαβε... ψυχὴ δ' ἐκ ῥεθέων πταμένη Ἄϊδόσδε βεβήκει / ὃν πότμον γοόωσα, λιποῦσ' ἀνδροτῆτα καὶ ἥβην)——全诗结构对称的核心
- 伊利亚特末句「他们这样为驯马的赫克托耳举行了葬礼」(Ὣς οἵ γ' ἀμφίεπον τάφον Ἕκτορος ἱπποδάμοιο)字字归位
- 奥德赛卷 9-12 奥德修斯叙述用中文多段引语惯例(每段开
“,仅卷 12 末段闭”)
- 产出:48 个
<work>-zh-NN.md文件、约 73 万中文字、约 1.5 MB 文本;frontmatter 含voice: <work>-zh、based_on双源声明、license: cc-by-sa-4.0、translator标注 Opus/Sonnet 分工。 - Cleanup sweeps(同日完成):epithet 统一(灰眼/猫眼 → 明眸的雅典娜);弯引号集体转换(直引号 → 弯引号,跳过 frontmatter);破折号超标清理(9 卷从约 213 个 → 全 ≤5);行号缺口修复(8 卷共 92 行)。
- metadata.yaml 更新:
license_status仍public-domain-corpus+ 第三层中译;works[].sources加 zh voice;voices[].notes标注新中文 corpus;content_quality: 7→8。 - 下一步(未做):本轮 chat_enabled 不开。fewshot.jsonl 仍空、page.md 待精修;Phase 1 末再考虑开 chat。
吉尔伽美什全译本 gilgamesh.md 完成(Phase 2 + 3)
承接当日 Phase 1(Thompson 1928 启动)的 Tablet I 样章 + 术语表,本轮收尾 Phase 2 翻译 + Phase 3 拼装。
- Phase 2 收尾:Tablet XI 翻译(X-XI agent 早前撞 rate limit 后由独立 agent 补译;约 290 诗行的大洪水叙述 + 试睡七日七夜 + 海底仙草 + 蛇盗草 + 末尾回环呼应序诗)。
- Phase 3 拼装:12 块按顺序合并为
authors/anonymous-mesopotamia/works/gilgamesh.md(2228 行 markdown),覆盖原本伪装「权威学术译本」的 LLM 散文占位。统一 frontmatter(layout: poetry对齐 gilgamesh-summary)+ 顶部底本/风格/专名说明 + 12 块目录;Tablet XII 章首注入「后加附录」quote 说明。 - 同日排版小修:清除 watermark 行;gilgamesh-summary layout 改 verse 后再切回 poetry;为吉尔伽美什梗概补充配图。
- metadata 校正:旧 notes「约 3000 行」精确化。
吉尔伽美什 Thompson 1928 全译本启动(Phase 1 样章 + 术语表)
anonymous-mesopotamia/gilgamesh 主条目改为「全译本」占位(基于 R. Campbell Thompson 1928 The Epic of Gilgamish (Oxford),英美均已公版)。新增 gilgamesh-summary 条目指向已有的 185 行散文梗概,避免占位与梗概互相覆盖。
_staging/新增 Phase 1 工作产物:tablet-i.md(第一稿,忠实 Thompson 风格保留括号补语和半引号补字)、tablet-i-v2.md(白话化重写,括号 135→18、半引号 98→13)、glossary.md(70+ 条术语对照 Thompson 旧拼法 ↔ 现代标准 ↔ 中文译名,修正「圣赫安那」→「伊安娜」)。- 底本选择 Thompson 1928 是因其英美双重公版地位 + 行号便于学术引用;Phase 3 拼装时落入
works/gilgamesh.md。
欧洲中世纪页 name_zh 标注精确化
eras/medieval/page.md 的 name_zh 与标题从「中世纪」改为「欧洲中世纪」,避免与印度中世纪、拜占庭中世纪等混淆。
issue #3 P2-P4 收尾(管子谋失 / yijing 噪音 / 旧索引 / mozi 亡篇注)
继 P1 诗经全文导入,本轮收完 issue #3 剩余 phases。
- P2 管子·谋失:metadata
authenticity: lost-text-only,source_url置空,notes 标「汉志录 76 篇之一,今本散佚仅存篇目」。embed-pre-qin现按lost-text-onlyskip 该 entry。 - P3-1 yijing/xici-shang.md 顶部 wikisource 导航噪音清除:删 9 行(「文言 / 系辞上传 / 作者:孔子东周 / 系辞下传 / 本作品收录于《[[易传]]》」等)。注:作者归孔子的传统说法已在 W2-6 metadata 修订时按 Shaughnessy 2022 否定,wikisource 残留这条 attribution 一并删除。
- P3-2 旧索引清理:删除
authors/guanzi/works/guanzi.md(196 行)和authors/guoyu/works/guoyu.md(68 行)。两文件是 Agent 5 早期 import 时生成的 TOC stub,metadata 不收录、其他章节文件已替代它们的功能。
周礼 metadata 拆 6 → 60 职官 + corpus 替换 + notes 聚合
eanzhao/17-z.com sites/zhouli 数据迁入。site-data.core.json 60 条 curated(6 大官 × 10 职官)作 metadata + works 粒度,fullClassical 完整经文作 corpus。
metadata.yamlworks[]: 6 → 60,每条work_slugper-file(沿用 shijing/zhuangzi 约定避免 chunk 唯一键冲突)。works/:60 个职官级 .md 文件(删 6 旧 stub),命名<官>-<职官pinyin>.md(如tianguan-gongzheng.md)。notes/:6 文件 1:N 聚合(每大官一份,含 summary + fullTranslation + note;H2 拆 10 职官)。- 顶层
attribution_status/authenticity_notes真伪定位保留:朱熹疑刘歆为王莽伪作;钱穆 / 顾颉刚定前 3 世纪。
楚辞 / 庄子 校对 + 读书笔记 sidecar 入库
继 rev 6 notes/ sidecar 约定,本轮把 eanzhao/17-z.com 的 AI commentary 落地到楚辞与庄子。0 篇 corpus 替换——双方文本经校对均为编辑选择差异,不动 works/。
- 楚辞(10 篇校对):lisao eanzhao 严重缺章(130 行 vs wenmai 190 行)—— wenmai 保留;9 篇异体字差异(厄 / 阨等)属编辑选择,wenmai 现代简体保留。
works/增 +13.5k 字(每篇加## 题解+## 词汇节,进 RAG);notes/10 文件 / 10.7k 字(guide + passageGuide,不进 RAG)。集合篇 jiuge / jiuzhang 用 H3 拆 11/9 子篇。 - 庄子(33 篇校对):21 篇 identical / 11 篇 minor diff(
[X]校勘 + 异体字)/ 1 篇 major diff(zhibeiyou文末 UTF-8 字形说明保留);差异均属项目惯例,works/完全不动。notes/33 文件:overview + study_notes + 逐段今译 + 段释;authored_by=mixed(人 / AI 协作)。
山海经 18 区升级 + 552 条 AI 读书笔记 sidecar
山海经 corpus 升 3 倍(147 KB → 444 KB / 17.6 万字),同时 552 条 AI commentary 落入 notes/ sidecar(不进 RAG)。
works/:18 区文件覆盖更新;每条 entry 含原文 + 翻译 + 词条 + 异兽四层。中山经 4 子文件合并为一;海外 / 海内 / 大荒按四方拆区。山经 5 区 + 海外 4 区 + 海内 5 区 + 大荒 4 区 = 18。notes/:18 文件 / 7.7 万字 / 552 条 AI commentary。rev 6 schema:authored_by=claude/source_repo=eanzhao/17-z.com。山经覆盖率高(南 / 西 / 北山经 100%),海 / 荒经 commentary 较稀疏。- dry-run chunk +369(works 部分入库);
notes/自动跳过。 - 数据源:
eanzhao/17-z.comsites/shanhaijing。
诗经 305 首全文从 eanzhao/shijing 导入(option A,关闭 issue #3 P1)
works/ 305 个 .md 文件取代原 6 个 section 级 stub TOC。
- 国风 160 + 小雅 74 + 大雅 31 + 周颂 31 + 鲁颂 4 + 商颂 5 = 305 首。
- 每首三层都进 corpus:原文 + 注音表(字 ↔ 拼音)+ 题解。
- 文件命名
<section>-<idx>-<pinyin>.md(当节 1-based 序号)。 - frontmatter
work_slug设为 per-file 而非共用'shijing',避免embed-pre-qinchunk 唯一键冲突。 metadata.yaml不动(保留 6 个 section 级 entries),305 首通过 frontmatter title 自识别。- dry-run chunk 增量 +379(6 → 385)。
- 新增
scripts/import-shijing-eanzhao.mjs增量幂等抓取。 - 数据源:
eanzhao/shijing(用户自有 repo,CC-BY-NC-SA-4.0)。
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 仅用于本地迁移
唐诗宋词大型语料导入
- 新增
scripts/import-chinese-poetry-corpus.mjs和npm run import:chinese-poetry,从chinese-poetry/chinese-poetry导入《全唐诗》《全宋词》结构化数据 - 新增
public/corpus/chinese-poetry/静态语料分片、manifest、索引分片和第三方 MIT 许可文本,避免把 7 万多首作品打进 Astro Worker 包;索引分片规避 Cloudflare 单资产 25MiB 限制 - 新增
/corpus/chinese-poetry浏览器,可按唐诗/宋词、作者、题名、词牌和首句检索并按需加载作品分片 - 新增
全唐诗、全宋词两个 collection 入口,挂入唐代/宋代时代页
里尔克 M1 全文化
- 将
authors/rilke/的三部作品直接补成全文:Das Buch der Bilder、Die Aufzeichnungen des Malte Laurids Brigge、Der Neuen Gedichte anderer Teil - 统一补入 Project Gutenberg 书号与 source_url,并把
m1_corpus_status改为full-text-primary; all works full-text - 这批内容从 timeline 的 selected / guide 选读状态里退出,后续只保留 page.md 导读与 RAG 全文
用户系统: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 时启用