slug 是硬校验,不是建议:正则是 ^[a-z0-9][a-z0-9-]{0,63}$ —— 首字符必须是小写字母或数字, 之后只允许小写字母、数字、连字符,总长 ≤64。中文、下划线、空格、大写、点号全部不合法。 中文目录名/文件名必须映射成英文或拼音 slug(见 §6 的映射表模板)。
固定四分类的圆点色(建分类时要给,取自 design/README.md 的 token 速查): pm=#2563eb · deep-dive=#16a34a · engineering=#f9c22e · frontier=#8b5cf6。
目录层级必须齐平到两层。 当前 Agent基础知识/ 是「分类/阶段/章节」三层,其余是两层。 三层的处理有且只有两种合法做法,选一种、别混用:
为什么要 series.json:notes_chapter_upsert 需要 ordinal / label / pinned / title / summary / sourceUrl / publishedAt,而库里不存 frontmatter(R5 裁定)。 把这些写在正文顶部的 --- 块里会被原样当正文渲染出来 —— server 一个字节都不改。 所以元数据必须走 manifest,正文里只有正文。
约束速查:ordinal 与 label 一一对应且系列内不重复;pinned: true 的那条固定 ordinal: 0。
| 目录 | 处理 |
|---|---|
| 内容分享/ | 不收。当前导出里有 7 篇,请从交付包里移除 |
| 原始资料/(若有) | 不收,且不得生成指向它的链接 |
| AI资料/ | 只收中译;每篇必须在 series.json 里给 sourceUrl = 原文链接。当前 64 篇里只有 6 篇正文带「来源/原文」行,其余需要补出原链;补不出的,那篇就不收 |
| 其余 | 收 |
| 源目录 | 建议 categorySlug | 建议 series slug |
|---|---|---|
| Pi/ | deep-dive | pi |
| Claude Code Harness/ | deep-dive | claude-code-harness |
| Codex Harness/ | deep-dive | codex-harness |
| DeepSeek Harness/ | deep-dive | deepseek-harness |
| Harness Engineering/ | engineering | harness-engineering |
| Rust深度教程/ | engineering | rust-deep-dive |
| TypeScript深度教程/ | engineering | typescript-deep-dive |
| AI native软件工程教程/ | engineering | ai-native-engineering |
| Agent基础知识/ | pm | 见 §1 的 A/B 选择;A 方案下每个阶段一个 slug,如 agent-basics-s01 … |
| AI资料/ | frontier | ai-frontier(或按子目录再分系列) |
| 项 | 要求 |
|---|---|
| 格式 | WebP(统一转)。允许 webp / png / jpeg / gif;SVG 永不接受(可执行文档,同源存储型 XSS) |
| 尺寸 | 宽度压到 ≤1600px(R5 管线口径) |
| 单张大小 | ≤4 MiB;转 WebP 后应远低于此 |
| 文件名 | 全小写,匹配 ^[a-z0-9][a-z0-9._-]{0,95}$。推荐 <内容 sha256 前 16 位>.webp。大写扩展名会在线上 404 —— Caddy 与 next dev 的分流 matcher 都只认小写 |
| 扩展名 ↔ contentType | 必须自洽(.webp↔image/webp 等),否则上传被拒 |
| 正文引用 |  |
| 放置 | <系列slug>/assets/ 下,不按章节再分子目录(文件名已是全局唯一的哈希) |
当前导出:55 张 PNG(共 77.3 MB,最大 1.84 MB)+ 1 张 JPG,全部要转 WebP 并改名。 另有 48 处 http 外链图片——保留外链还是下载本地化,请裁定(保留则境内可达性自负; 本地化则并入上面的流程)。
逐条跑一遍,全绿再发:
发布走 MCP 管理面(/api/mcp,R6),顺序固定:
notes_chapter_upsert 幂等:内容与库内完全一致时整行不动、不刷新 updatedAt,RSS 不会假装有更新。 重跑安全。