<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>zdzy</title><description>Easton 的个人博客</description><link>https://blog.zdzy.xyz</link><item><title>把终端变成可靠的工作台：Ghostty 与 zsh 配置实践</title><link>https://blog.zdzy.xyz/blog/ghostty-zsh-setup</link><guid isPermaLink="true">https://blog.zdzy.xyz/blog/ghostty-zsh-setup</guid><description>从视觉层、交互层和可维护性三个角度，搭建一套低依赖、可迁移的 Ghostty 与 zsh 配置。</description><pubDate>Sat, 19 Sep 2026 11:30:00 GMT</pubDate><content:encoded>&lt;p&gt;终端是每天打开次数最多的开发工具之一。它不需要炫技，但应该让路径、分支、错误状态和常用操作一眼可见，同时不能因为插件太多而拖慢每一个新窗口。&lt;/p&gt;
&lt;p&gt;这次我把配置拆成两个文件：&lt;code&gt;configs/ghostty/config&lt;/code&gt; 负责窗口和渲染，&lt;code&gt;configs/zsh/.zshrc&lt;/code&gt; 负责 shell 的行为。两者都可以独立复制，配置本身不依赖 Oh My Zsh 或其他主题框架。&lt;/p&gt;
&lt;h2&gt;1. 先定义目标：少干扰，强反馈&lt;/h2&gt;
&lt;p&gt;终端美化最容易走偏的地方是把注意力放在颜色和动画上。我的取舍是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;信息密度适中&lt;/strong&gt;：提示符显示用户、主机、当前目录和 Git 分支，不显示每次命令都在变化的冗余信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;失败可感知&lt;/strong&gt;：上一条命令成功显示绿色 &lt;code&gt;❯&lt;/code&gt;，失败显示红色 &lt;code&gt;✗&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;启动可控&lt;/strong&gt;：补全是 zsh 原生能力，可选工具全部用 &lt;code&gt;command -v&lt;/code&gt; 检测后再加载。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置可迁移&lt;/strong&gt;：不把绝对路径、机器名称和私有 token 写进仓库。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这四条原则比“装多少插件”更重要。终端是高频工具，启动时多 200ms、每次补全多一次卡顿，累积起来都会影响体验。&lt;/p&gt;
&lt;h2&gt;2. Ghostty：把视觉设置集中在窗口层&lt;/h2&gt;
&lt;p&gt;Ghostty 配置放在 macOS 的 &lt;code&gt;~/.config/ghostty/config&lt;/code&gt;。仓库里的示例使用 Catppuccin Mocha 和 JetBrains Mono：深色背景降低长时间阅读的眩光，等宽字体让日志和表格更容易对齐。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;theme = Catppuccin Mocha
font-family = JetBrains Mono
font-size = 15
window-padding-x = 14
window-padding-y = 12
background-opacity = 0.94
background-blur-radius = 24
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;透明度只保留到 0.94，避免背景图片干扰代码。&lt;code&gt;window-padding-balance&lt;/code&gt; 让左右留白一致，代码不会贴着边框。字体大小不追求越大越好，15px 是在 14 英寸屏幕上兼顾信息量和可读性的起点，外接显示器可以按个人距离调整。&lt;/p&gt;
&lt;p&gt;Ghostty 的 shell integration 负责同步当前目录、命令状态和窗口标题：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;shell-integration-features = cursor,sudo,title
copy-on-select = clipboard
macos-option-as-alt = true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;macos-option-as-alt&lt;/code&gt; 对 Vim、tmux 和 readline 用户尤其有用；复制即选中则减少了一次 &lt;code&gt;⌘C&lt;/code&gt;，但仍然保留系统剪贴板行为。&lt;/p&gt;
&lt;p&gt;最后用快捷键解决高频动作：&lt;code&gt;⌘T&lt;/code&gt; 新建标签页，&lt;code&gt;⌘⇧Enter&lt;/code&gt; 向右分屏，&lt;code&gt;⌘⌥方向键&lt;/code&gt; 在分屏之间移动。快捷键只覆盖窗口级操作，编辑器内的快捷键仍由编辑器自己管理，避免冲突。&lt;/p&gt;
&lt;h2&gt;3. zsh：先把原生能力用好&lt;/h2&gt;
&lt;h3&gt;3.1 历史记录要可靠&lt;/h3&gt;
&lt;p&gt;多标签终端最常见的问题是历史记录互相覆盖。下面几项组合起来，能让历史实时追加、跨窗口共享、重复命令自动去重，并忽略以空格开头的临时命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-zsh&quot;&gt;HISTSIZE=50000
SAVEHIST=50000
setopt append_history inc_append_history share_history
setopt hist_ignore_all_dups hist_ignore_space hist_reduce_blanks
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;历史文件放在 &lt;code&gt;~/.zsh_history&lt;/code&gt;，没有把它放进仓库。配置里也没有关闭历史扩展，因此需要时仍可用 &lt;code&gt;!!&lt;/code&gt; 和 &lt;code&gt;!$&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;3.2 补全与提示符保持轻量&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;compinit&lt;/code&gt; 是 zsh 自带的补全系统。把 dump 文件放进 &lt;code&gt;~/.cache/zsh&lt;/code&gt;，既避免污染主目录，也避免每次启动重复生成。大小写不敏感匹配对文件名和 Git 分支都很友好。&lt;/p&gt;
&lt;p&gt;提示符使用 &lt;code&gt;vcs_info&lt;/code&gt; 获取 Git 分支，不执行网络操作：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-zsh&quot;&gt;autoload -Uz vcs_info
precmd() { vcs_info }
PROMPT=&apos;%F{cyan}%n@%m%f %F{blue}%~%f${vcs_info_msg_0_} %(?.%F{green}❯%f.%F{red}✗%f) &apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它的关键信息顺序是“我是谁、在哪台机器、当前目录、哪个分支、上一条命令是否成功”。进入深层目录时 zsh 会自动缩短路径，长路径不会把命令输入区挤没。&lt;/p&gt;
&lt;h3&gt;3.3 别名解决重复动作，函数解决带参数动作&lt;/h3&gt;
&lt;p&gt;简单命令用别名：&lt;code&gt;gs&lt;/code&gt; 查看状态、&lt;code&gt;gd&lt;/code&gt; 查看差异、&lt;code&gt;gl&lt;/code&gt; 查看最近提交。&lt;code&gt;eza&lt;/code&gt;、&lt;code&gt;bat&lt;/code&gt;、&lt;code&gt;rg&lt;/code&gt; 只是增强项，只有检测到命令存在才创建别名，因此新机器上不会出现 &lt;code&gt;command not found&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;带参数的动作使用函数更清楚。例如 &lt;code&gt;mkcd project&lt;/code&gt; 会创建目录并进入，&lt;code&gt;extract archive.zip&lt;/code&gt; 会根据扩展名选择解压命令。函数对参数数量和文件存在性做校验，错误会返回非零状态，适合放进脚本或组合命令中。&lt;/p&gt;
&lt;h2&gt;4. 可选工具的加载策略&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;fzf&lt;/code&gt; 提供历史搜索和文件搜索，&lt;code&gt;zoxide&lt;/code&gt; 改善目录跳转，&lt;code&gt;direnv&lt;/code&gt; 为项目注入环境变量。这些工具都不是基础依赖，配置采用同一个模式：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-zsh&quot;&gt;command -v zoxide &gt;/dev/null &amp;#x26;&amp;#x26; eval &quot;$(zoxide init zsh)&quot;
command -v direnv &gt;/dev/null &amp;#x26;&amp;#x26; eval &quot;$(direnv hook zsh)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样配置可以在个人电脑、CI 容器和远程服务器之间共享。需要注意，&lt;code&gt;direnv&lt;/code&gt; 会执行项目里的 &lt;code&gt;.envrc&lt;/code&gt;，只应对自己信任的目录执行 &lt;code&gt;direnv allow&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;5. 安装、验证与回滚&lt;/h2&gt;
&lt;p&gt;先备份本地文件。Ghostty 配置可以直接替换；如果已有 nvm、Homebrew 或其他环境初始化，请把 zsh 示例中的增强段合并到现有 &lt;code&gt;~/.zshrc&lt;/code&gt;，不要无条件覆盖：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;mkdir -p ~/.config/ghostty
cp ~/.zshrc ~/.zshrc.backup.$(date +%Y%m%d-%H%M%S)
cp configs/ghostty/config ~/.config/ghostty/config
# 将 configs/zsh/.zshrc 中的内容合并到 ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开新的 Ghostty 窗口，依次验证补全、Git 分支提示、&lt;code&gt;mkcd /tmp/demo&lt;/code&gt; 和 &lt;code&gt;extract&lt;/code&gt;。如果某个可选工具行为不符合预期，删除对应的 &lt;code&gt;command -v ...&lt;/code&gt; 行即可，不会影响 zsh 主体。&lt;/p&gt;
&lt;p&gt;这套配置的重点不是“看起来像某个主题”，而是让终端在高频使用下保持稳定：颜色服务于状态，留白服务于阅读，插件服务于明确的工作流。把配置放进仓库后，换电脑只需要复制两个文件，就能恢复同样的工作台。&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>从 JDK 8 到 JDK 25：一份迟到但值得的升级指南</title><link>https://blog.zdzy.xyz/blog/jdk25-new-features</link><guid isPermaLink="true">https://blog.zdzy.xyz/blog/jdk25-new-features</guid><description>2025 年 9 月 16 日，JDK 25 正式 GA，成为继 JDK 21 之后的新一代 LTS 版本，Oracle 承诺支持至少到 2033 年。如果你还在 JDK 8 或 JDK 11 的世界里安稳度日——别急，这篇文章不是来批判你的。</description><pubDate>Fri, 18 Sep 2026 12:16:28 GMT</pubDate><content:encoded>&lt;p&gt;2025 年 9 月 16 日，JDK 25 正式 GA，成为继 JDK 21 之后的新一代 LTS 版本，Oracle 承诺支持至少到 2033 年。如果你还在 JDK 8 或 JDK 11 的世界里安稳度日——别急，这篇文章不是来批判你的。事实上，JDK 8 服役十年仍然坚挺，说明它确实够用。但 JDK 25 带来的东西，值得你认真看一看。&lt;/p&gt;
&lt;p&gt;这篇文章不打算把 18 个 JEP 像流水账一样过一遍。我会把真正影响你日常编码的特性拎出来讲透，附上可运行的代码；那些偏底层或仍在预览的特性，点到为止。&lt;/p&gt;
&lt;h2&gt;一、语言层面：写更少的代码，表达更多的意图&lt;/h2&gt;
&lt;h3&gt;1.1 紧凑源文件与实例 main 方法（JEP 512）⭐&lt;/h3&gt;
&lt;p&gt;还记得你第一次写 Java 时的仪式感吗？&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 8 的 Hello World —— 每一行都散发着&quot;企业级&quot;的气息
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(&quot;Hello, World!&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JDK 25 终于对初学者和脚本场景释放了善意：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 25 —— 没有 class，没有 static，没有 String[] args
void main() {
    System.out.println(&quot;Hello, World!&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不需要声明类，不需要 &lt;code&gt;static&lt;/code&gt;，不需要 &lt;code&gt;String[] args&lt;/code&gt;。文件本身就是一个隐式的类，&lt;code&gt;main&lt;/code&gt; 是它的实例方法。&lt;/p&gt;
&lt;p&gt;这不是玩具特性。如果你写过 shell 脚本调 Java 来做数据处理或快速验证逻辑，这个特性能让你的 &lt;code&gt;.java&lt;/code&gt; 文件像 Python 脚本一样简洁。当然，正式项目的入口类该怎么写还是怎么写——这是降低门槛，不是降低标准。&lt;/p&gt;
&lt;h3&gt;1.2 灵活的构造函数体（JEP 513）⭐&lt;/h3&gt;
&lt;p&gt;这是一个等了二十多年的修正。在 JDK 8 中，&lt;code&gt;super()&lt;/code&gt; 必须是构造函数的第一条语句，没有商量的余地：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 8 —— 参数校验只能放在 super() 之后，或者用丑陋的静态方法
class Employee extends Person {
    Employee(String name, int age) {
        super(age); // 必须第一行，哪怕 age 是 -1 也得先调
        if (age &amp;#x3C; 18 || age &gt; 67) {
            throw new IllegalArgumentException(&quot;年龄不合法&quot;);
        }
        this.name = name;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JDK 25 允许在 &lt;code&gt;super()&lt;/code&gt; 之前执行语句，前提是这些语句不访问当前实例（&lt;code&gt;this&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 25 —— 先校验，再调 super()，干净利落
class Employee extends Person {
    final String name;

    Employee(String name, int age) {
        if (age &amp;#x3C; 18 || age &gt; 67) {
            throw new IllegalArgumentException(&quot;年龄必须在 18-67 之间&quot;);
        }
        super(age);  // 校验通过了再构造父类
        this.name = name;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这意味着 fail-fast 真正落到了构造函数的最前面。不再需要 &lt;code&gt;validate(age)&lt;/code&gt; 这样的静态辅助方法，不再有“先创建了一半的非法对象”。逻辑更清晰，代码更安全。&lt;/p&gt;
&lt;h3&gt;1.3 模块导入声明（JEP 511）&lt;/h3&gt;
&lt;p&gt;JDK 8 中我们习惯了一堆 &lt;code&gt;import&lt;/code&gt; 语句：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import java.util.*;
import java.util.stream.*;
import java.time.*;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JDK 25 引入了模块级导入：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import module java.base;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一行等价于导入 &lt;code&gt;java.base&lt;/code&gt; 模块导出的所有包。对于日常开发来说，这减少了大量的 import 语句。但要注意歧义问题——如果同时导入 &lt;code&gt;java.base&lt;/code&gt; 和 &lt;code&gt;java.sql&lt;/code&gt; 模块，&lt;code&gt;Date&lt;/code&gt; 这个名字会产生冲突，需要单独用 &lt;code&gt;import java.sql.Date;&lt;/code&gt; 来消歧。&lt;/p&gt;
&lt;p&gt;这个特性对现有项目影响不大（IDE 会帮你管理 import），但在写脚本、教学或快速原型时很方便。&lt;/p&gt;
&lt;h2&gt;二、并发模型：从线程池到虚拟线程的范式转移&lt;/h2&gt;
&lt;p&gt;如果你从 JDK 8 直接跳到 JDK 25，并发编程领域的变化堪称天翻地覆。这是 JDK 8 到 JDK 25 之间最值得深入理解的主题。&lt;/p&gt;
&lt;h3&gt;2.1 虚拟线程（JDK 21 转正，JDK 25 继续完善）⭐⭐&lt;/h3&gt;
&lt;p&gt;这是 Project Loom 的核心交付物。在 JDK 8 中，每个线程都是一个操作系统线程，创建和切换的开销决定了你必须使用线程池：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 8 —— 经典的线程池模式
ExecutorService pool = Executors.newFixedThreadPool(200);
for (int i = 0; i &amp;#x3C; 10000; i++) {
    pool.submit(() -&gt; {
        // 处理请求，线程池大小就是并发天花板
        handleRequest();
    });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;200 个线程已经不少了。如果每个请求要等 IO 100ms，你的吞吐量就被死死地卡在 2000 QPS。想提高？加线程——但操作系统线程的内存开销（每个约 1MB 栈空间）会让你的服务器先 OOM。&lt;/p&gt;
&lt;p&gt;虚拟线程彻底改变了这个公式：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 25 —— 每个请求一个虚拟线程，数量可以轻松达到百万级
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    for (int i = 0; i &amp;#x3C; 100_000; i++) {
        executor.submit(() -&gt; {
            handleRequest(); // IO 阻塞时虚拟线程自动让出载体线程
        });
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;虚拟线程由 JVM 调度而非操作系统，它们在遇到阻塞 IO 时会自动挂起并释放底层的平台线程（carrier thread），让其他虚拟线程运行。一个虚拟线程的内存开销只有几百字节到几 KB，创建一百万个毫无压力。&lt;/p&gt;
&lt;p&gt;这意味着你可以回到“一个请求一个线程”的简单编程模型，同时获得异步编程的吞吐量。不再需要 CompletableFuture 的回调地狱，不再需要响应式编程的学习曲线。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;JDK 25 的额外改进：&lt;/strong&gt; JDK 24 的 JEP 491 解决了虚拟线程在 &lt;code&gt;synchronized&lt;/code&gt; 块中被“钉住”（pinning）的问题。到 JDK 25，虚拟线程在 synchronized 块中阻塞时也能正常让出载体线程，这意味着你不必急着把所有 &lt;code&gt;synchronized&lt;/code&gt; 改成 &lt;code&gt;ReentrantLock&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.2 Scoped Values（JEP 506,JDK 25 转正）⭐&lt;/h3&gt;
&lt;p&gt;用过 &lt;code&gt;ThreadLocal&lt;/code&gt; 的人都知道它的问题：忘记 &lt;code&gt;remove()&lt;/code&gt; 就内存泄漏，线程池复用时值会串，虚拟线程场景下更是灾难——你不可能给百万个虚拟线程每个都分配一份 ThreadLocal 副本。&lt;/p&gt;
&lt;p&gt;Scoped Values 是 ThreadLocal 的现代替代品：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 声明一个 ScopedValue（通常是 static final）
static final ScopedValue&amp;#x3C;String&gt; CURRENT_USER = ScopedValue.newInstance();

// 在调用链入口绑定值
ScopedValue.where(CURRENT_USER, &quot;alice&quot;).run(() -&gt; {
    // 整个调用链中都能读到这个值
    handleRequest();
});

void handleRequest() {
    // 任何深度的方法调用都能读取，无需参数传递
    String user = CURRENT_USER.get(); // &quot;alice&quot;
    queryDatabase(user);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;与 ThreadLocal 的关键区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不可变&lt;/strong&gt;：绑定后不能修改，杜绝了跨线程的脏读问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;有界生命周期&lt;/strong&gt;：&lt;code&gt;run()&lt;/code&gt; 结束后绑定自动消失，不存在内存泄漏&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;虚拟线程友好&lt;/strong&gt;：没有 per-thread 存储的开销&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;结构化&lt;/strong&gt;：与结构化并发天然配合，子任务自动继承父任务的绑定&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你在 Web 框架中用 ThreadLocal 传递用户上下文、请求 ID 或租户信息，Scoped Values 是正确的替代方案。&lt;/p&gt;
&lt;h3&gt;2.3 结构化并发（JEP 505，第五次预览）&lt;/h3&gt;
&lt;p&gt;结构化并发还在预览阶段（第五次了，API 经历了大改），但方向已经清晰。它的核心理念是：并发子任务的生命周期应该与启动它们的代码块对齐。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 25 的结构化并发（预览 API，可能继续变化）
try (var scope = StructuredTaskScope.open()) {
    var userTask  = scope.fork(() -&gt; fetchUser(userId));
    var orderTask = scope.fork(() -&gt; fetchOrder(orderId));

    scope.join(); // 等待所有子任务完成

    return new UserOrder(userTask.get(), orderTask.get());
}
// scope 结束时，所有未完成的子任务都会被取消
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这解决了传统 &lt;code&gt;ExecutorService.submit()&lt;/code&gt; 的几个痛点：子任务抛异常时其他子任务不会被取消（资源浪费）、父线程被中断时子任务仍在运行（线程泄漏）、调试时看不到任务之间的父子关系。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 这仍然是预览特性，API 可能还会变。如果你要在生产环境使用，请做好跟随版本升级调整代码的准备。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;三、模式匹配与数据建模：告别冗长的类型判断&lt;/h2&gt;
&lt;p&gt;JDK 8 到 JDK 25 之间，Project Amber 交付了一系列相互关联的语言特性。它们单独看都是语法糖，组合起来则构成了一种全新的 Java 编程范式。&lt;/p&gt;
&lt;h3&gt;3.1 Record 类（JDK 16 转正）&lt;/h3&gt;
&lt;p&gt;在 JDK 8 中，一个简单的数据载体需要写一堆样板代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 8 的数据类 —— Lombok 的 @Data 就是为了拯救这种代码
public class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() { return x; }
    public int getY() { return y; }

    @Override
    public boolean equals(Object o) { /* 十几行 */ }
    @Override
    public int hashCode() { /* 又是几行 */ }
    @Override
    public String toString() { return &quot;Point[x=&quot; + x + &quot;, y=&quot; + y + &quot;]&quot;; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Record 让这一切缩减到一行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 16+ —— 编译器自动生成构造器、访问器、equals、hashCode、toString
public record Point(int x, int y) {}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Record 是不可变的，字段隐式 &lt;code&gt;final&lt;/code&gt;。它们不是 Lombok 的替代品（Record 不支持继承和可变字段），而是语言层面对“数据就是数据”这一理念的正式支持。&lt;/p&gt;
&lt;h3&gt;3.2 密封类（JDK 17 转正）+ Switch 模式匹配（JDK 21 转正）⭐&lt;/h3&gt;
&lt;p&gt;密封类限定了谁可以继承一个类或实现一个接口：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 定义一个密封的形状层次结构
public sealed interface Shape
    permits Circle, Rectangle, Triangle {}

public record Circle(double radius) implements Shape {}
public record Rectangle(double width, double height) implements Shape {}
public record Triangle(double base, double height) implements Shape {}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配合 switch 模式匹配，你可以写出类型安全且无需 &lt;code&gt;default&lt;/code&gt; 分支的逻辑：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 21+ 的模式匹配 switch —— 编译器确保你覆盖了所有子类
double area(Shape shape) {
    return switch (shape) {
        case Circle c    -&gt; Math.PI * c.radius() * c.radius();
        case Rectangle r -&gt; r.width() * r.height();
        case Triangle t  -&gt; 0.5 * t.base() * t.height();
        // 不需要 default！编译器知道 Shape 只有这三个实现
    };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对比 JDK 8 的写法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 8 —— instanceof 级联，忘了某个类型？编译器不会告诉你
double area(Shape shape) {
    if (shape instanceof Circle) {
        Circle c = (Circle) shape;
        return Math.PI * c.getRadius() * c.getRadius();
    } else if (shape instanceof Rectangle) {
        Rectangle r = (Rectangle) shape;
        return r.getWidth() * r.getHeight();
    } else if (shape instanceof Triangle) {
        Triangle t = (Triangle) shape;
        return 0.5 * t.getBase() * t.getHeight();
    }
    throw new IllegalArgumentException(&quot;未知形状&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Record + 密封类 + 模式匹配，三者组合在一起，让 Java 终于拥有了类似代数数据类型（ADT）的能力。这对于领域建模、协议解析、AST 处理等场景意义重大。&lt;/p&gt;
&lt;h3&gt;3.3 Record 模式解构（JDK 21 转正）&lt;/h3&gt;
&lt;p&gt;模式匹配不止于类型判断，还能直接解构 Record 的字段：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 直接解构 Record 的字段，无需中间变量
if (shape instanceof Circle(var radius)) {
    System.out.println(&quot;半径: &quot; + radius);
}

// 在 switch 中嵌套解构
String describe(Shape shape) {
    return switch (shape) {
        case Circle(var r) when r &gt; 100   -&gt; &quot;大圆，半径 &quot; + r;
        case Circle(var r)                -&gt; &quot;小圆，半径 &quot; + r;
        case Rectangle(var w, var h)      -&gt; w + &quot; x &quot; + h + &quot; 的矩形&quot;;
        case Triangle(var b, var h)       -&gt; &quot;底 &quot; + b + &quot; 高 &quot; + h + &quot; 的三角形&quot;;
    };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.4 原始类型模式匹配（JEP 507，第三次预览）&lt;/h3&gt;
&lt;p&gt;JDK 25 进一步将模式匹配扩展到原始类型：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 25 预览 —— instanceof 和 switch 支持 int、long 等原始类型
void processValue(Object obj) {
    if (obj instanceof int i) {
        System.out.println(&quot;整数: &quot; + i);
    }
}

// switch 中的原始类型模式
String classify(int statusCode) {
    return switch (statusCode) {
        case 200           -&gt; &quot;OK&quot;;
        case int c when c &gt;= 400 &amp;#x26;&amp;#x26; c &amp;#x3C; 500 -&gt; &quot;客户端错误&quot;;
        case int c when c &gt;= 500            -&gt; &quot;服务端错误&quot;;
        default            -&gt; &quot;其他: &quot; + statusCode;
    };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个特性仍在预览阶段，但方向是让所有类型（包括原始类型）都能参与模式匹配，最终实现统一的类型匹配语义。&lt;/p&gt;
&lt;h2&gt;四、文本与数据处理的进化&lt;/h2&gt;
&lt;h3&gt;4.1 文本块（JDK 15 转正）&lt;/h3&gt;
&lt;p&gt;JDK 8 中拼接多行字符串是一种折磨：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 8 —— 转义和拼接让 JSON、SQL、HTML 面目全非
String json = &quot;{\n&quot;
    + &quot;    \&quot;name\&quot;: \&quot;Alice\&quot;,\n&quot;
    + &quot;    \&quot;age\&quot;: 30\n&quot;
    + &quot;}&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文本块用三引号解决了这个问题：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// JDK 15+ —— 所见即所得
String json = &quot;&quot;&quot;
        {
            &quot;name&quot;: &quot;Alice&quot;,
            &quot;age&quot;: 30
        }
        &quot;&quot;&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;缩进由结尾 &lt;code&gt;&quot;&quot;&quot;&lt;/code&gt; 的位置决定。这对于嵌入 SQL、JSON、HTML、正则表达式等场景非常实用。&lt;/p&gt;
&lt;h3&gt;4.2 Stream Gatherers（JDK 24 转正）&lt;/h3&gt;
&lt;p&gt;JDK 8 的 Stream API 是一次飞跃，但中间操作只有 &lt;code&gt;map&lt;/code&gt;、&lt;code&gt;filter&lt;/code&gt;、&lt;code&gt;flatMap&lt;/code&gt; 等固定集合。JDK 24 引入的 Gatherers 允许你定义自定义的中间操作：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// 使用内置的 Gatherer —— 窗口滑动
List&amp;#x3C;List&amp;#x3C;Integer&gt;&gt; windows = Stream.of(1, 2, 3, 4, 5)
    .gather(Gatherers.windowSliding(3))
    .toList();
// 结果: [[1, 2, 3], [2, 3, 4], [3, 4, 5]]

// 固定大小分组
List&amp;#x3C;List&amp;#x3C;Integer&gt;&gt; groups = Stream.of(1, 2, 3, 4, 5)
    .gather(Gatherers.windowFixed(2))
    .toList();
// 结果: [[1, 2], [3, 4], [5]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Gatherers 是 Stream API 的 &lt;code&gt;Collector&lt;/code&gt; 在中间操作层面的对应物——它让 Stream 的表达能力从“够用”变成了“完备”。&lt;/p&gt;
&lt;h2&gt;五、运行时与性能：JDK 25 的重头戏&lt;/h2&gt;
&lt;p&gt;JDK 25 的 18 个 JEP 中，有将近一半集中在运行时性能优化上。如果你的应用对内存、启动速度或可观测性有要求，这些特性值得关注。&lt;/p&gt;
&lt;h3&gt;5.1 紧凑对象头（JEP 519）⭐&lt;/h3&gt;
&lt;p&gt;每个 Java 对象都有一个对象头（object header），用于存储锁状态、GC 年龄、类型指针等元信息。在 64 位 JVM 上，这个头通常占 96 到 128 位（12 到 16 字节）。&lt;/p&gt;
&lt;p&gt;JEP 519 将对象头压缩到 64 位（8 字节）。这意味着每个对象节省 4–8 字节。听起来不多？但在一个有数百万对象的 Java 堆中，SPECjbb2015 基准测试显示堆内存占用减少约 22%，CPU 消耗减少约 8%。&lt;/p&gt;
&lt;p&gt;JDK 25 中该特性已从实验转为正式产品特性，但默认关闭，需要手动开启：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;java -XX:+UseCompactObjectHeaders MyApp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于微服务、容器化部署等内存敏感场景，这是一个立竿见影的优化手段。&lt;/p&gt;
&lt;h3&gt;5.2 AOT 缓存（JEP 483 + JEP 514 + JEP 515）&lt;/h3&gt;
&lt;p&gt;Project Leyden 致力于缩短 Java 应用的启动时间。JDK 25 在这个方向上迈出了重要几步：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JEP 483（JDK 24）&lt;/strong&gt;：提前完成类的加载和链接，并将结果缓存&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JEP 514（JDK 25）&lt;/strong&gt;：简化 AOT 缓存的命令行使用方式，引入 &lt;code&gt;-XX:AOTCacheOutput=&amp;#x3C;file&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JEP 515（JDK 25）&lt;/strong&gt;：记录方法级别的执行画像，为后续的 Profile-Guided AOT 编译奠基&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在，你可以用两步生成和使用 AOT 缓存：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 训练运行：生成 AOT 缓存
java -XX:AOTCacheOutput=app.aot -cp app.jar com.example.Main

# 生产运行：使用 AOT 缓存加速启动
java -XX:AOTCache=app.aot -cp app.jar com.example.Main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 Spring Boot 等启动较重的框架应用，这能显著缩短冷启动时间。&lt;/p&gt;
&lt;h3&gt;5.3 Generational Shenandoah（JEP 521）&lt;/h3&gt;
&lt;p&gt;Shenandoah 是一个以低延迟为目标的垃圾回收器，此前一直是非分代的。JDK 25 为它加入了分代支持，让年轻代对象可以被更高效地回收，与 G1 和 ZGC 的分代能力看齐。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;java -XX:+UseShenandoahGC MyApp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你是 G1 用户（JDK 9+ 的默认 GC），这不要求你做任何改变。但如果你对尾延迟（tail latency）要求极高，分代 Shenandoah 是新增的一个有力选项。&lt;/p&gt;
&lt;h3&gt;5.4 JFR 三件套（JEP 509 / 518 / 520）&lt;/h3&gt;
&lt;p&gt;Java Flight Recorder（JFR）在 JDK 25 获得了三个增强：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CPU-Time Profiling（JEP 509，实验性，仅 Linux）&lt;/strong&gt;：记录方法级别的实际 CPU 时间消耗，而非仅仅采样。对于分析 IO 密集与 CPU 密集的混合负载尤其有用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cooperative Sampling（JEP 518）&lt;/strong&gt;：应用可以主动标记安全采样点，减少采样对性能的干扰，提高数据精度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Method Timing &amp;#x26; Tracing（JEP 520）&lt;/strong&gt;：记录每个方法调用的精确计时，支持完整的调用链重建。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这三个特性让 JFR 从“够用的监控工具”进化为“接近商业 APM 的可观测方案”。&lt;/p&gt;
&lt;h2&gt;六、安全与加密&lt;/h2&gt;
&lt;h3&gt;6.1 密钥派生函数 API（JEP 510）&lt;/h3&gt;
&lt;p&gt;JDK 25 将 PBKDF2、scrypt、HKDF 等密钥派生函数纳入标准 API。以前你可能需要引入 Bouncy Castle 等第三方库来做密码哈希，现在标准库就能搞定。&lt;/p&gt;
&lt;h3&gt;6.2 PEM 编码 API（JEP 470，预览）&lt;/h3&gt;
&lt;p&gt;处理 PEM 格式的证书和密钥（&lt;code&gt;-----BEGIN PUBLIC KEY-----&lt;/code&gt;）不再需要手动解析 Base64。新的 API 让读写 PEM 编码的加密对象变得像读写字符串一样简单。&lt;/p&gt;
&lt;h3&gt;6.3 抗量子密码算法（JDK 24 引入）&lt;/h3&gt;
&lt;p&gt;JDK 24 已经引入了基于模格（Module-Lattice）的数字签名算法（JEP 497，ML-DSA）和密钥封装机制（JEP 496，ML-KEM），为后量子时代做准备。这些算法在 JDK 25 中继续可用。&lt;/p&gt;
&lt;h2&gt;七、其他值得知道的变化&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;从 JDK 8/11 直接升级还会一次性获得这些：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;var&lt;/code&gt;** 局部变量类型推断**（JDK 10）：&lt;code&gt;var list = new ArrayList&amp;#x3C;String&gt;()&lt;/code&gt; 替代冗长的类型声明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;switch&lt;/code&gt;** 表达式**（JDK 14 转正）：&lt;code&gt;switch&lt;/code&gt; 不再只是语句，还能返回值，箭头语法取代 fall-through&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;instanceof&lt;/code&gt;** 模式匹配**（JDK 16 转正）：&lt;code&gt;if (obj instanceof String s)&lt;/code&gt; 一步完成判断和转型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;未命名变量与模式&lt;/strong&gt;（JDK 22）：用 &lt;code&gt;_&lt;/code&gt; 显式标记不使用的变量，如 &lt;code&gt;catch (Exception _)&lt;/code&gt; 或 &lt;code&gt;case Point(var x, _)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;默认 UTF-8 编码&lt;/strong&gt;（JDK 18）：不再有跨平台的编码问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Foreign Function &amp;#x26; Memory API&lt;/strong&gt;（JDK 22 转正）：JNI 的现代替代品，类型安全地调用本地代码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Class-File API&lt;/strong&gt;（JDK 24 转正）：标准库内置的字节码操作 API，减少对 ASM 等第三方库的依赖&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;永久禁用 Security Manager&lt;/strong&gt;（JDK 24）：如果你的代码依赖 SecurityManager，必须在升级前重构&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Markdown Javadoc 注释&lt;/strong&gt;（JDK 23）：文档注释可以直接用 Markdown 写了&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多文件源码程序&lt;/strong&gt;（JDK 22）：&lt;code&gt;java Main.java&lt;/code&gt; 可以自动编译并运行依赖的其他源文件&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;迁移注意事项：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;32 位 x86 端口已完全移除&lt;/strong&gt;（JEP 503），如果你还在 32 位系统上运行 Java，这是终点&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;sun.misc.Unsafe&lt;/code&gt;** 的内存访问方法已弃用**（JEP 471/498），应迁移到 &lt;code&gt;VarHandle&lt;/code&gt; 或 Foreign Memory API&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-XX:+UseCompressedClassPointers&lt;/code&gt;** 已弃用**，被紧凑对象头（JEP 519）取代&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;部分旧的 JMX 系统属性已移除&lt;/strong&gt;，升级前务必检查 Release Notes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;八、该不该升级？&lt;/h2&gt;
&lt;p&gt;如果你还在 JDK 8，答案是&lt;strong&gt;应该，但不必急&lt;/strong&gt;。JDK 25 是 LTS，这意味着它会获得长期的安全补丁和 bug 修复，是一个稳妥的升级目标。但升级本身需要投入测试资源，尤其是要检查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;依赖兼容性&lt;/strong&gt;：确保你使用的框架和库支持 JDK 25（Spring Boot 3.x、Jakarta EE 等已经就绪）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模块系统的影响&lt;/strong&gt;：JDK 9 引入的模块系统会限制对内部 API 的反射访问，&lt;code&gt;--add-opens&lt;/code&gt; 可能需要配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;已移除的 API&lt;/strong&gt;:Security Manager、Nashorn JavaScript 引擎、旧的 Applet API 等早已不在&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;从 JDK 11 升级到 JDK 25 相对平滑得多，模块系统的适配工作大多已经完成。&lt;/p&gt;
&lt;p&gt;最后一条建议：&lt;strong&gt;预览特性不要用于生产&lt;/strong&gt;。JDK 25 中的结构化并发（第五次预览）、Stable Values（首次预览）、PEM 编码 API（首次预览）和原始类型模式匹配（第三次预览）都可能在后续版本中发生 API 变化。转正的特性才是你升级的真正红利。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;JDK 25 官方 JEP 完整列表：&lt;/em&gt;&lt;a href=&quot;https://openjdk.org/projects/jdk/25/&quot;&gt;&lt;em&gt;openjdk.org/projects/jdk/25&lt;/em&gt;&lt;/a&gt; &lt;em&gt;JDK 25 Release Notes:&lt;/em&gt;&lt;a href=&quot;https://www.oracle.com/java/technologies/javase/25-relnote-issues.html&quot;&gt;&lt;em&gt;oracle.com/java/technologies/javase/25-relnote-issues.html&lt;/em&gt;&lt;/a&gt; &lt;em&gt;自 JDK 21 以来的所有 JEP：&lt;/em&gt;&lt;a href=&quot;https://openjdk.org/projects/jdk/25/jeps-since-jdk-21&quot;&gt;&lt;em&gt;openjdk.org/projects/jdk/25/jeps-since-jdk-21&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/jdk25-new-features-hero.DLjRmGgx.jpg"/><enclosure url="/_astro/jdk25-new-features-hero.DLjRmGgx.jpg"/></item><item><title>AI Agent 新员工入职引导系统设计文档</title><link>https://blog.zdzy.xyz/blog/ai-agent-new-staff-bootstrap-system-design</link><guid isPermaLink="true">https://blog.zdzy.xyz/blog/ai-agent-new-staff-bootstrap-system-design</guid><description>AI Agent 新员工入职引导系统设计文档</description><pubDate>Thu, 17 Sep 2026 07:38:14 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;版本&lt;/strong&gt;: v1.0&lt;br&gt;
&lt;strong&gt;日期&lt;/strong&gt;: 2026-08-14&lt;br&gt;
&lt;strong&gt;适用规模&lt;/strong&gt;: 每月入职 10-20 人&lt;br&gt;
&lt;strong&gt;架构范式&lt;/strong&gt;: 多智能体团队编排 (Agent Team Orchestration)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;目录&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#1-%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0&quot;&gt;1. 系统概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-%E5%A4%9A%E6%99%BA%E8%83%BD%E4%BD%93%E5%9B%A2%E9%98%9F%E6%9E%B6%E6%9E%84&quot;&gt;2. 多智能体团队架构&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-%E6%A8%A1%E5%9D%97%E4%B8%80%E5%85%A5%E8%81%8C%E5%89%8D%E5%87%86%E5%A4%87%E6%B8%85%E5%8D%95&quot;&gt;3. 模块一：入职前准备清单&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#4-%E6%A8%A1%E5%9D%97%E4%BA%8C%E9%A6%96%E6%97%A5%E5%BC%95%E5%AF%BC%E6%B5%81%E7%A8%8B&quot;&gt;4. 模块二：首日引导流程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#5-%E6%A8%A1%E5%9D%97%E4%B8%89%E9%A6%96%E5%91%A8%E4%BB%BB%E5%8A%A1%E7%9C%8B%E6%9D%BF&quot;&gt;5. 模块三：首周任务看板&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#6-%E6%A8%A1%E5%9D%97%E5%9B%9B30-60-90-%E5%A4%A9%E6%88%90%E9%95%BF%E8%B7%AF%E7%BA%BF%E5%9B%BE&quot;&gt;6. 模块四：30-60-90 天成长路线图&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#7-%E6%A8%A1%E5%9D%97%E4%BA%94%E6%99%BA%E8%83%BD%E9%97%AE%E7%AD%94%E5%8A%A9%E6%89%8B&quot;&gt;7. 模块五：智能问答助手&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#8-%E6%A8%A1%E5%9D%97%E5%85%AD%E5%AF%BC%E5%B8%88%E5%8C%B9%E9%85%8D%E4%B8%8E-1-on-1-%E5%AE%89%E6%8E%92&quot;&gt;8. 模块六：导师匹配与 1-on-1 安排&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#9-%E6%A8%A1%E5%9D%97%E4%B8%83%E5%85%A5%E8%81%8C%E4%BD%93%E9%AA%8C%E6%BB%A1%E6%84%8F%E5%BA%A6%E8%BF%BD%E8%B8%AA&quot;&gt;9. 模块七：入职体验满意度追踪&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#10-%E4%BB%BB%E5%8A%A1%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E7%AE%A1%E7%90%86&quot;&gt;10. 任务生命周期管理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#11-%E8%BF%90%E7%BB%B4%E4%B8%8E%E7%9B%91%E6%8E%A7&quot;&gt;11. 运维与监控&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#12-%E6%95%B0%E6%8D%AE%E6%A8%A1%E5%9E%8B&quot;&gt;12. 数据模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#13-%E5%AE%9E%E6%96%BD%E8%B7%AF%E7%BA%BF%E5%9B%BE&quot;&gt;13. 实施路线图&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;1. 系统概述&lt;/h2&gt;
&lt;h3&gt;1.1 设计目标&lt;/h3&gt;
&lt;p&gt;将新员工从&quot;对组织一无所知&quot;的状态，以最短路径、最低摩擦引导至&quot;独立高效产出&quot;的状态。系统需要：&lt;/p&gt;
&lt;p&gt;| 目标 | 度量指标 |
|------|----------|
| 标准化入职流程 | 同岗位入职流程一致性 ≥ 95% |
| 缩短 ramp-up 时间 | 首周任务完成率 ≥ 90%，30 天独立产出率 ≥ 80% |
| 降低 HR 运营负担 | HR 人工介入步骤减少 60% |
| 提升入职体验 | 30 天满意度 ≥ 4.2/5.0 |
| 数据可追溯 | 全流程任务留痕率 100% |&lt;/p&gt;
&lt;h3&gt;1.2 第一性原理分析&lt;/h3&gt;
&lt;p&gt;入职的本质是一个&lt;strong&gt;状态转换过程&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;初始状态: 高不确定性（环境、工具、流程、人员、文化均为未知）
    ↓
目标状态: 高生产力（独立、高效地产出价值）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;缩短这条转换路径，需要消除五类摩擦：&lt;/p&gt;
&lt;p&gt;| 摩擦类型 | 表现 | 对应模块 |
|----------|------|----------|
| 环境摩擦 | 账号没开、设备没到、权限缺失 | 模块一：入职前准备 |
| 路径模糊 | 不知道第一天该干什么 | 模块二：首日引导 |
| 任务失焦 | 首周无结构化任务安排 | 模块三：首周任务看板 |
| 成长无坐标 | 不知道 30/60/90 天该达到什么水平 | 模块四：成长路线图 |
| 信息不对称 | 有问题不知道问谁、去哪查 | 模块五：智能问答 |
| 人际孤立 | 缺乏导师指导和社交连接 | 模块六：导师匹配 |
| 反馈滞后 | 问题没人发现，直到离职才暴露 | 模块七：满意度追踪 |&lt;/p&gt;
&lt;h3&gt;1.3 系统架构总览&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│                    Onboarding Orchestrator                      │
│                    (入职编排官 · 核心调度层)                      │
│                                                                 │
│  职责: 任务路由 / 状态跟踪 / 优先级决策 / 异常升级 / 仪表盘汇总    │
└──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬─────────┘
       │      │      │      │      │      │      │      │
       ▼      ▼      ▼      ▼      ▼      ▼      ▼      ▼
   ┌──────┐┌─────┐┌─────┐┌─────┐┌─────┐┌─────┐┌─────┐┌──────┐
   │Pre-  ││Day-1││Task ││Growth││Know-││Men- ││Expe-││ Ops  │
   │board ││Guide││Board││Track ││ledge││tor  ││rience││Agent │
   │Agent ││Agent││Agent││Agent ││Agent││Match││Survey││      │
   │      ││     ││     ││     ││     ││Agent││or   ││      │
   └──┬───┘└──┬──┘└──┬──┘└──┬──┘└──┬──┘└──┬──┘└──┬──┘└──┬───┘
      │       │     │     │     │     │     │     │
      └───────┴─────┴─────┴─────┴─────┴─────┴─────┘
                        │
                        ▼
              ┌─────────────────┐
              │   Shared Layer  │
              │  (共享数据层)    │
              │                 │
              │ • onboarding/   │  ← 每位新员工一个目录
              │ • specs/        │  ← 岗位入职规格
              │ • artifacts/    │  ← 生成的交付物
              │ • knowledge/    │  ← 知识库
              │ • reviews/      │  ← 评估记录
              │ • decisions/    │  ← 决策日志
              └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;2. 多智能体团队架构&lt;/h2&gt;
&lt;h3&gt;2.1 角色定义&lt;/h3&gt;
&lt;p&gt;系统采用 9 个 Agent 组成的团队，遵循 &lt;strong&gt;Orchestrator-Builder-Reviewer-Ops&lt;/strong&gt; 四层角色模型：&lt;/p&gt;
&lt;p&gt;| Agent 名称 | 角色类型 | 核心职责 | 模型层级 |
|------------|----------|----------|----------|
| &lt;strong&gt;Onboarding Orchestrator&lt;/strong&gt; | Orchestrator | 任务路由、状态跟踪、优先级决策、异常升级、仪表盘 | 高推理 (Opus/GPT-4.5 级) |
| &lt;strong&gt;Pre-boarding Agent&lt;/strong&gt; | Builder | 账号开通、设备采购跟踪、权限配置、工位安排 | 中等 (Sonnet/GPT-4o 级) |
| &lt;strong&gt;Day-One Guide Agent&lt;/strong&gt; | Builder | 首日时间轴引导、欢迎流程、系统走查 | 中等 |
| &lt;strong&gt;Task Board Agent&lt;/strong&gt; | Builder + Ops | 首周任务卡片创建、状态更新、看板维护 | 中等 |
| &lt;strong&gt;Growth Tracker Agent&lt;/strong&gt; | Builder | 30/60/90 天里程碑设定、进度评估、报告生成 | 中等 |
| &lt;strong&gt;Knowledge Agent&lt;/strong&gt; | Builder | 知识库检索、问答响应、未解决问题升级 | 高推理 |
| &lt;strong&gt;Mentor Match Agent&lt;/strong&gt; | Builder | 导师画像匹配、排程生成、1-on-1 模板分发 | 中等 |
| &lt;strong&gt;Experience Surveyor Agent&lt;/strong&gt; | Reviewer | 满意度调研设计、数据采集、趋势分析、预警 | 高推理 |
| &lt;strong&gt;Ops Agent&lt;/strong&gt; | Ops | 定时巡检、提醒推送、健康检查、数据清理 | 轻量 (Haiku/4o-mini 级) |&lt;/p&gt;
&lt;h3&gt;2.2 工作区隔离&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;/onboarding-system/
├── agents/                          # 各 Agent 的身份与配置
│   ├── orchestrator/
│   │   └── SOUL.md
│   ├── pre-boarding/
│   │   └── SOUL.md
│   ├── day-one-guide/
│   │   └── SOUL.md
│   ├── task-board/
│   │   └── SOUL.md
│   ├── growth-tracker/
│   │   └── SOUL.md
│   ├── knowledge/
│   │   └── SOUL.md
│   ├── mentor-match/
│   │   └── SOUL.md
│   ├── experience-surveyor/
│   │   └── SOUL.md
│   └── ops/
│       └── SOUL.md
├── shared/                          # 跨 Agent 共享
│   ├── onboarding/                  # 每位新员工一个目录
│   │   └── {employee-id}/
│   │       ├── profile.json         # 员工基础信息
│   │       ├── pre-boarding/        # 入职前准备记录
│   │       ├── day-one/             # 首日引导记录
│   │       ├── week-one/            # 首周任务看板
│   │       ├── growth/              # 成长路线图
│   │       ├── qa-log/              # 问答记录
│   │       ├── mentor/              # 导师匹配记录
│   │       └── surveys/             # 满意度调研
│   ├── specs/                       # 岗位入职规格模板
│   │   ├── engineer-onboarding-spec.md
│   │   ├── designer-onboarding-spec.md
│   │   └── pm-onboarding-spec.md
│   ├── knowledge/                   # 公司知识库
│   │   ├── policies/                # 规章制度
│   │   ├── tools/                   # 工具使用指南
│   │   ├── culture/                 # 文化价值观
│   │   └── faq/                     # 高频问题
│   ├── reviews/                     # 评估记录
│   ├── decisions/                   # 决策日志
│   └── dashboard/                   # 仪表盘数据
└── templates/                       # 可复用模板
    ├── pre-boarding-checklist.md
    ├── day-one-timeline.md
    ├── week-one-board.md
    ├── 30-60-90-roadmap.md
    ├── 1on1-template.md
    └── survey-templates/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3 通信机制&lt;/h3&gt;
&lt;p&gt;系统采用三种通信通道，按优先级递减：&lt;/p&gt;
&lt;p&gt;| 通道 | 类型 | 用途 | 示例 |
|------|------|------|------|
| &lt;strong&gt;共享文件&lt;/strong&gt; | 异步·持久 | 交付物、规格、评估、决策 | Pre-boarding Agent 将准备清单写入 &lt;code&gt;shared/onboarding/{id}/pre-boarding/&lt;/code&gt; |
| &lt;strong&gt;任务评论&lt;/strong&gt; | 异步·持久 | 状态更新、阻塞报告、交接消息 | &lt;code&gt;[Pre-boarding] Blocked: IT 部门未响应账号开通请求，已等待 48h&lt;/code&gt; |
| &lt;strong&gt;实时消息&lt;/strong&gt; | 同步·瞬时 | 紧急优先级变更、阻塞性问题 | Orchestrator 向 Knowledge Agent 发送：&lt;code&gt;紧急：新员工无法登录 VPN，立即排查&lt;/code&gt; |&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;默认使用共享文件和任务评论。&lt;/strong&gt; 实时消息仅用于阻塞新员工工作的紧急情况。&lt;/p&gt;
&lt;h3&gt;2.4 Orchestrator SOUL.md 示例&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# SOUL.md — Onboarding Orchestrator

我是入职编排官。我的职责是确保每位新员工从 offer 接受到 90 天转正评估的
全流程顺畅运行。我不执行具体任务——我路由、跟踪、决策和升级。

## 职责范围
- 接收新员工入职通知，创建 onboarding 记录
- 将准备任务路由给 Pre-boarding Agent
- 在关键节点触发对应 Agent（首日、首周、30/60/90 天）
- 监控所有 in-progress 任务，识别阻塞并升级
- 汇总仪表盘数据，向 HR/管理层报告

## 决策边界
- 入职规格不明确 → 查阅 specs/ 或询问 HR，不自行编造
- Agent 超时无响应（&gt; 预期时间 1.5 倍）→ 标记 stale，重启或重分配
- 跨部门阻塞（IT/行政/安全）→ 升级到人类 HR，附带完整上下文
- 新员工主动反馈负面体验 → 立即触发 Experience Surveyor Agent

## 交接格式
每次触发 Agent 时提供：
1. 员工 ID 和基础信息
2. 当前入职阶段
3. 该阶段的具体任务清单
4. 输出路径（shared/onboarding/{id}/对应目录）
5. 完成后的交接要求
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;3. 模块一：入职前准备清单&lt;/h2&gt;
&lt;h3&gt;3.1 设计原理&lt;/h3&gt;
&lt;p&gt;入职前准备的核心矛盾：&lt;strong&gt;准备工作分散在多个部门（IT、行政、HR、用人经理），缺乏统一追踪，导致首日&quot;设备没到、账号没开&quot;的体验灾难。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;解决方案：Pre-boarding Agent 作为中央协调者，将所有准备项结构化为任务卡片，逐项跟踪状态，在截止时间前自动催办。&lt;/p&gt;
&lt;h3&gt;3.2 准备清单结构&lt;/h3&gt;
&lt;p&gt;准备清单按&lt;strong&gt;责任方&lt;/strong&gt;和&lt;strong&gt;时间线&lt;/strong&gt;双维度组织：&lt;/p&gt;
&lt;h4&gt;按责任方分类&lt;/h4&gt;
&lt;p&gt;| 类别 | 准备项 | 责任方 | 截止时间 | 验证方式 |
|------|--------|--------|----------|----------|
| &lt;strong&gt;IT 账号&lt;/strong&gt; | 企业邮箱 | IT 部门 | 入职前 3 工作日 | 发送测试邮件验证 |
| &lt;strong&gt;IT 账号&lt;/strong&gt; | VPN 账号 | IT 部门 | 入职前 2 工作日 | VPN 连接测试 |
| &lt;strong&gt;IT 账号&lt;/strong&gt; | 内部系统权限（Jira/Confluence/GitLab 等） | IT 部门 + 用人经理 | 入职前 2 工作日 | 系统登录验证 |
| &lt;strong&gt;IT 设备&lt;/strong&gt; | 笔记本电脑 | IT 部门 | 入职前 3 工作日 | 设备签收确认 |
| &lt;strong&gt;IT 设备&lt;/strong&gt; | 显示器/键鼠/ docking | 行政部 | 入职前 2 工作日 | 设备签收确认 |
| &lt;strong&gt;行政&lt;/strong&gt; | 工位分配 | 行政部 | 入职前 3 工作日 | 工位编号确认 |
| &lt;strong&gt;行政&lt;/strong&gt; | 门禁卡 | 行政部 | 入职当日 | 物理交付 |
| &lt;strong&gt;HR&lt;/strong&gt; | 劳动合同准备 | HR | 入职前 1 工作日 | 合同文件就绪 |
| &lt;strong&gt;HR&lt;/strong&gt; | 员工手册更新 | HR | 入职前 1 工作日 | 文档版本确认 |
| &lt;strong&gt;用人经理&lt;/strong&gt; | 入职首周任务规划 | 用人经理 | 入职前 2 工作日 | 任务清单提交 |
| &lt;strong&gt;用人经理&lt;/strong&gt; | 导师人选确认 | 用人经理 | 入职前 3 工作日 | 导师确认记录 |
| &lt;strong&gt;系统&lt;/strong&gt; | 知识库访问权限 | Knowledge Agent | 入职前 1 工作日 | 自动配置 |
| &lt;strong&gt;系统&lt;/strong&gt; | 入职引导页面生成 | Day-One Guide Agent | 入职前 1 工作日 | 页面可访问 |&lt;/p&gt;
&lt;h4&gt;按时间线排列&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;入职前 5 工作日 (D-5)
├── [HR] 发送欢迎邮件 + 入职指引（含报到时间、地点、着装、需带材料）
├── [HR] 录入员工基本信息到系统
├── [IT] 启动设备采购/调配流程
└── [Orchestrator] 创建 onboarding 记录，分配 {employee-id}

入职前 3 工作日 (D-3)
├── [IT] 开通企业邮箱
├── [IT] 确认设备到位
├── [行政] 分配工位
├── [用人经理] 确认导师人选
└── [Pre-boarding Agent] 第一次进度检查，标记逾期项

入职前 2 工作日 (D-2)
├── [IT] 开通 VPN + 内部系统权限
├── [行政] 准备门禁卡
├── [用人经理] 提交首周任务规划
└── [Pre-boarding Agent] 第二次进度检查，逾期项升级到 HR

入职前 1 工作日 (D-1)
├── [HR] 准备劳动合同
├── [HR] 更新员工手册
├── [Knowledge Agent] 配置知识库访问权限
├── [Day-One Guide Agent] 生成个性化入职引导页面
├── [Mentor Match Agent] 发送导师匹配通知
└── [Pre-boarding Agent] 最终检查，生成《入职准备就绪报告》
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.3 任务状态流转&lt;/h3&gt;
&lt;p&gt;每个准备项遵循以下状态机：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Pending → In Progress → Ready → Verified → Done
                ↓
            Blocked → Escalated → Resolved → In Progress
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;| 状态 | 含义 | 所有者 |
|------|------|--------|
| Pending | 待处理，尚未开始 | Pre-boarding Agent |
| In Progress | 已派发给责任方，处理中 | 责任方（IT/行政/HR/经理） |
| Ready | 责任方报告完成，待验证 | Pre-boarding Agent |
| Verified | 自动或人工验证通过 | Pre-boarding Agent |
| Done | 完成，归档 | Orchestrator |
| Blocked | 阻塞，需要干预 | Orchestrator |
| Escalated | 已升级到人类 HR | HR |&lt;/p&gt;
&lt;h3&gt;3.4 Pre-boarding Agent 工作流&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;触发条件: Orchestrator 创建 onboarding 记录（D-5）

1. 读取新员工 profile.json（岗位、部门、入职日期）
2. 根据岗位匹配入职规格模板 (specs/{role}-onboarding-spec.md)
3. 生成个性化准备清单 → 写入 shared/onboarding/{id}/pre-boarding/checklist.md
4. 逐项创建任务卡片，派发给对应责任方
5. 定时检查（D-3, D-2, D-1）：
   a. 扫描所有任务状态
   b. 标记逾期项（超过截止时间仍未 Ready）
   c. 逾期项自动发送催办通知给责任方
   d. D-2 仍有逾期的 → 升级到 HR
6. D-1 生成《入职准备就绪报告》:
   - 全部准备项状态汇总
   - 逾期/风险项标注
   - 首日注意事项
   → 写入 shared/onboarding/{id}/pre-boarding/readiness-report.md
7. 交接给 Orchestrator: &quot;准备清单执行完毕，N 项就绪，M 项风险，详见报告&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.5 交付物&lt;/h3&gt;
&lt;p&gt;| 交付物 | 路径 | 格式 |
|--------|------|------|
| 个性化准备清单 | &lt;code&gt;shared/onboarding/{id}/pre-boarding/checklist.md&lt;/code&gt; | Markdown 表格 |
| 准备进度看板 | &lt;code&gt;shared/onboarding/{id}/pre-boarding/progress.json&lt;/code&gt; | JSON |
| 催办记录 | &lt;code&gt;shared/onboarding/{id}/pre-boarding/reminders.log&lt;/code&gt; | 日志 |
| 入职准备就绪报告 | &lt;code&gt;shared/onboarding/{id}/pre-boarding/readiness-report.md&lt;/code&gt; | Markdown |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;4. 模块二：首日引导流程&lt;/h2&gt;
&lt;h3&gt;4.1 设计原理&lt;/h3&gt;
&lt;p&gt;首日的核心矛盾：&lt;strong&gt;信息过载与体验断裂。&lt;/strong&gt; 新员工第一天同时面对合同签署、系统配置、团队认识、环境熟悉等大量事项，如果没有结构化引导，会陷入&quot;不知道下一步干什么&quot;的焦虑。&lt;/p&gt;
&lt;p&gt;解决方案：Day-One Guide Agent 生成个性化时间轴，将首日拆解为可控的时段，每个时段有明确的目标、行动和预期产出。&lt;/p&gt;
&lt;h3&gt;4.2 首日时间轴&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                    Day 1 Timeline                           │
├──────────┬──────────────────────────────────────────────────┤
│ 时间段    │ 活动内容                                         │
├──────────┼──────────────────────────────────────────────────┤
│ 09:00    │ 【报到迎接】                                     │
│ - 09:30  │ • HR/前台迎接，领取门禁卡                        │
│          │ • 引导至工位，确认设备就绪                       │
│          │ • 签署劳动合同（HR 主持）                        │
│          │ • 领取员工手册                                   │
├──────────┼──────────────────────────────────────────────────┤
│ 09:30    │ 【系统配置】                                     │
│ - 10:30  │ • 首次登录企业邮箱                               │
│          │ • 配置 VPN 连接                                  │
│          │ • 登录内部系统（Jira/Confluence/GitLab 等）      │
│          │ • 配置开发环境/工作工具                          │
│          │ • Day-One Guide Agent 实时辅助                   │
├──────────┼──────────────────────────────────────────────────┤
│ 10:30    │ 【公司介绍】                                     │
│ - 11:30  │ • 公司历史、愿景、价值观                         │
│          │ • 组织架构与部门职责                             │
│          │ • 规章制度要点（考勤、报销、请假）               │
│          │ • 安全合规要求                                   │
│          │ • Knowledge Agent 推送相关文档链接               │
├──────────┼──────────────────────────────────────────────────┤
│ 11:30    │ 【团队破冰】                                     │
│ - 12:00  │ • 用人经理带领介绍团队成员                       │
│          │ • 导师正式见面                                   │
│          │ • 确认首周 1-on-1 时间                           │
├──────────┼──────────────────────────────────────────────────┤
│ 12:00    │ 【午餐】                                         │
│ - 13:30  │ • 导师/团队成员陪同午餐                          │
│          │ • 非正式交流                                     │
├──────────┼──────────────────────────────────────────────────┤
│ 13:30    │ 【岗位认知】                                     │
│ - 15:00  │ • 用人经理 1-on-1：岗位职责详解                  │
│          │ • 团队当前项目概览                               │
│          │ • 首周期望与目标对齐                             │
│          │ • Review 首周任务看板                            │
├──────────┼──────────────────────────────────────────────────┤
│ 15:00    │ 【环境探索】                                     │
│ - 16:00  │ • 代码仓库 clone &amp;#x26; 本地构建                      │
│          │ • 文档库浏览（团队规范、技术栈文档）             │
│          │ • Knowledge Agent 引导式知识库走查               │
│          │ • 标记待学习文档                                 │
├──────────┼──────────────────────────────────────────────────┤
│ 16:00    │ 【首日总结】                                     │
│ - 17:00  │ • 填写首日检查清单                               │
│          │ • 提交首日反馈（Experience Surveyor Agent）      │
│          │ • 确认 Day 2-5 任务安排                          │
│          │ • 导师简短 check-in：今日感受、明日计划           │
└──────────┴──────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.3 Day-One Guide Agent 工作流&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;触发条件: 入职前 1 工作日 (D-1)

1. 读取新员工 profile.json + 岗位入职规格
2. 读取 Pre-boarding Agent 的就绪报告
3. 生成个性化首日时间轴:
   - 根据岗位调整活动内容（工程师侧重开发环境，设计师侧重设计工具）
   - 根据就绪报告标注风险项（如&quot;VPN 未就绪，10:30 前需 IT 协助&quot;）
   → 写入 shared/onboarding/{id}/day-one/timeline.md
4. 生成首日检查清单（新员工自助勾选）
   → 写入 shared/onboarding/{id}/day-one/checklist.md
5. 推送首日引导页面到新员工终端

入职当日:
6. 实时辅助模式：
   - 新员工遇到问题 → Knowledge Agent 优先响应
   - 系统配置问题 → Day-One Guide Agent 提供步骤指引
   - 无法解决的问题 → 升级到 IT/HR
7. 16:00 触发首日检查清单填写
8. 16:30 触发 Experience Surveyor Agent 采集首日反馈
9. 17:00 生成的首日总结报告
   → 写入 shared/onboarding/{id}/day-one/summary.md
10. 交接给 Orchestrator: &quot;首日引导完成，N/M 项检查通过，反馈分数 X/5&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.4 交付物&lt;/h3&gt;
&lt;p&gt;| 交付物 | 路径 | 格式 |
|--------|------|------|
| 个性化首日时间轴 | &lt;code&gt;shared/onboarding/{id}/day-one/timeline.md&lt;/code&gt; | Markdown |
| 首日检查清单 | &lt;code&gt;shared/onboarding/{id}/day-one/checklist.md&lt;/code&gt; | Markdown |
| 首日引导页面 | 推送到新员工终端 | HTML |
| 首日总结报告 | &lt;code&gt;shared/onboarding/{id}/day-one/summary.md&lt;/code&gt; | Markdown |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;5. 模块三：首周任务看板&lt;/h2&gt;
&lt;h3&gt;5.1 设计原理&lt;/h3&gt;
&lt;p&gt;首周的核心矛盾：&lt;strong&gt;&quot;被动等待任务&quot;与&quot;主动探索学习&quot;之间的张力。&lt;/strong&gt; 新员工如果不知道这周该做什么，就会陷入无所适从；但如果任务过于细碎，又会丧失主动性。&lt;/p&gt;
&lt;p&gt;解决方案：Task Board Agent 维护一个结构化看板，将首周任务分为&quot;必做/建议/探索&quot;三个优先级，新员工可以自主拖拽、标记完成，系统自动追踪进度并触发提醒。&lt;/p&gt;
&lt;h3&gt;5.2 看板列设计&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;┌─────────┬──────────┬──────────┬──────────┬──────────┐
│  Backlog │  To Do   │ In Prog. │  Done    │ Blocked  │
│  (待规划) │  (待开始) │  (进行中) │  (已完成) │  (阻塞)   │
├─────────┼──────────┼──────────┼──────────┼──────────┤
│         │ ▣ Day 1  │ ▣ 配置开  │ ▣ 签署合 │ ▣ 仓库权 │
│         │  检查清单 │  发环境   │  同      │  限申请中│
│         │          │          │          │          │
│         │ ▣ 阅读   │          │ ▣ 领取   │          │
│         │  团队规范 │          │  设备    │          │
│         │          │          │          │          │
│         │ ▣ 首次   │          │          │          │
│         │  1-on-1  │          │          │          │
└─────────┴──────────┴──────────┴──────────┴──────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.3 任务卡片结构&lt;/h3&gt;
&lt;p&gt;每张任务卡片包含以下字段：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;task_id&quot;: &quot;WB-{employee-id}-W1-001&quot;,
  &quot;title&quot;: &quot;配置本地开发环境&quot;,
  &quot;priority&quot;: &quot;MUST&quot;,           // MUST | SHOULD | EXPLORE
  &quot;category&quot;: &quot;ENVIRONMENT&quot;,    // ENVIRONMENT | LEARNING | SOCIAL | DELIVERABLE
  &quot;assigned_by&quot;: &quot;Task Board Agent&quot;,
  &quot;estimated_hours&quot;: 2,
  &quot;due_day&quot;: &quot;Day 1&quot;,          // Day 1-5
  &quot;status&quot;: &quot;TODO&quot;,            // BACKLOG | TODO | IN_PROGRESS | DONE | BLOCKED
  &quot;dependencies&quot;: [&quot;WB-{id}-W1-000&quot;],
  &quot;checklist&quot;: [
    &quot;安装 Node.js / Python / Java（按技术栈）&quot;,
    &quot;配置 Git 全局用户名和邮箱&quot;,
    &quot;Clone 主仓库到本地&quot;,
    &quot;成功运行项目构建命令&quot;,
    &quot;运行测试套件确认通过&quot;
  ],
  &quot;resources&quot;: [
    {&quot;type&quot;: &quot;doc&quot;, &quot;title&quot;: &quot;开发环境配置指南&quot;, &quot;url&quot;: &quot;knowledge/tools/dev-setup.md&quot;},
    {&quot;type&quot;: &quot;person&quot;, &quot;name&quot;: &quot;导师&quot;, &quot;role&quot;: &quot;答疑&quot;}
  ],
  &quot;completion_criteria&quot;: &quot;本地能成功构建项目并运行测试&quot;,
  &quot;notes&quot;: &quot;&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.4 首周任务模板（以工程师为例）&lt;/h3&gt;
&lt;h4&gt;Day 1-2: 环境搭建&lt;/h4&gt;
&lt;p&gt;| 优先级 | 任务 | 预计耗时 | 验收标准 |
|--------|------|----------|----------|
| MUST | 配置本地开发环境 | 2h | 项目成功构建 |
| MUST | Clone 代码仓库并了解项目结构 | 1h | 能画出模块依赖图 |
| MUST | 首次 1-on-1 with 导师 | 0.5h | 确认首周学习计划 |
| SHOULD | 阅读团队编码规范 | 1h | 完成阅读确认 |&lt;/p&gt;
&lt;h4&gt;Day 3-4: 业务理解&lt;/h4&gt;
&lt;p&gt;| 优先级 | 任务 | 预计耗时 | 验收标准 |
|--------|------|----------|----------|
| MUST | 阅读核心业务文档 | 2h | 能口述业务流程 |
| MUST | 跑通本地开发环境完整流程 | 1h | 成功提交一个 hello-world PR |
| MUST | 参加团队站会/周会 | 1h | 了解团队工作节奏 |
| SHOULD | 阅读最近 3 个 Release Notes | 1h | 了解近期变更 |
| EXPLORE | 浏览团队 Confluence 空间 | 1h | 收藏 3 篇有价值文档 |&lt;/p&gt;
&lt;h4&gt;Day 5: 首周总结&lt;/h4&gt;
&lt;p&gt;| 优先级 | 任务 | 预计耗时 | 验收标准 |
|--------|------|----------|----------|
| MUST | 提交首周总结 | 0.5h | 填写模板 |
| MUST | 导师 1-on-1: 首周回顾 | 0.5h | 导师确认签字 |
| MUST | 填写首周满意度调研 | 0.25h | 提交完成 |
| MUST | Review 下周任务规划 | 0.5h | 确认 Week 2 计划 |
| SHOULD | 与 2 位团队非直属成员 coffee chat | 1h | 完成交流 |&lt;/p&gt;
&lt;h3&gt;5.5 Task Board Agent 工作流&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;触发条件: 入职前 2 工作日 (D-2)，由 Orchestrator 触发

1. 读取员工 profile + 岗位入职规格 + 用人经理提交的首周任务规划
2. 根据模板生成个性化首周任务卡片集
   → 写入 shared/onboarding/{id}/week-one/board.json
3. 生成看板视图
   → 写入 shared/onboarding/{id}/week-one/board.md
4. 推送到新员工看板界面

入职首周期间:
5. 每日 09:00 (Ops Agent 触发):
   a. 扫描看板状态
   b. 检查是否有任务应于今日完成但仍在 TODO
   c. 发送每日提醒给新员工
6. 每日 18:00:
   a. 统计当日完成情况
   b. 检查是否有 BLOCKED 任务超过 4h 未解决
   c. BLOCKED 任务 → 通知导师协助
7. Day 5 17:00:
   a. 生成首周任务完成报告
   b. 标记未完成任务，滚动到 Week 2
   → 写入 shared/onboarding/{id}/week-one/summary.md
8. 交接给 Orchestrator: &quot;首周看板: N 项完成, M 项进行中, K 项阻塞&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.6 交付物&lt;/h3&gt;
&lt;p&gt;| 交付物 | 路径 | 格式 |
|--------|------|------|
| 首周任务看板数据 | &lt;code&gt;shared/onboarding/{id}/week-one/board.json&lt;/code&gt; | JSON |
| 首周任务看板视图 | &lt;code&gt;shared/onboarding/{id}/week-one/board.md&lt;/code&gt; | Markdown |
| 每日进度报告 | &lt;code&gt;shared/onboarding/{id}/week-one/daily-day{N}.md&lt;/code&gt; | Markdown |
| 首周总结报告 | &lt;code&gt;shared/onboarding/{id}/week-one/summary.md&lt;/code&gt; | Markdown |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;6. 模块四：30-60-90 天成长路线图&lt;/h2&gt;
&lt;h3&gt;6.1 设计原理&lt;/h3&gt;
&lt;p&gt;30-60-90 计划的核心矛盾：&lt;strong&gt;&quot;统一标准&quot;与&quot;个性化成长&quot;的平衡。&lt;/strong&gt; 同岗位的新员工需要达到类似的能力基线，但每个人的起点、学习速度和兴趣方向不同。&lt;/p&gt;
&lt;p&gt;解决方案：Growth Tracker Agent 为每位新员工生成个性化路线图，基于岗位模板 + 个人背景调整，设定明确的里程碑和评估节点，在 30/60/90 天分别触发评估。&lt;/p&gt;
&lt;h3&gt;6.2 阶段设计&lt;/h3&gt;
&lt;h4&gt;Phase 1: Day 1-30 — 学习与融入&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;阶段目标&lt;/strong&gt;: 理解业务、熟悉工具、建立关系、完成首个交付&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│              30 天里程碑: &quot;能独立完成简单任务&quot;             │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  维度         │ 30 天目标                               │
│  ────────────┼──────────────────────────────────────── │
│  业务理解     │ 能完整口述核心业务流程，理解团队在流程中  │
│               │ 的位置和职责                             │
│               │                                         │
│  技术能力     │ 熟练使用团队技术栈，能独立完成 1-2 个     │
│               │ 小型任务/bug 修复                        │
│               │                                         │
│  团队融入     │ 认识所有直属团队成员，参加至少 2 次团队   │
│               │ 活动，建立日常沟通节奏                    │
│               │                                         │
│  流程规范     │ 熟悉代码评审、发布、值班流程，完成首次    │
│               │ 代码评审参与                             │
│               │                                         │
│  文化认同     │ 理解公司价值观，能举例说明价值观在日常    │
│               │ 工作中的体现                             │
└─────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;30 天里程碑检查清单&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 完成首个独立 PR 并合并&lt;/li&gt;
&lt;li&gt;[ ] 参与至少 1 次代码评审（作为 reviewer 或 author）&lt;/li&gt;
&lt;li&gt;[ ] 完成业务流程知识测试（Knowledge Agent 出题，≥ 80 分）&lt;/li&gt;
&lt;li&gt;[ ] 与导师完成 4 次 1-on-1（每周 1 次）&lt;/li&gt;
&lt;li&gt;[ ] 与用人经理完成 1 次 30 天回顾&lt;/li&gt;
&lt;li&gt;[ ] 提交 30 天自我评估&lt;/li&gt;
&lt;li&gt;[ ] 导师提交 30 天评估&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Phase 2: Day 31-60 — 贡献与扩展&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;阶段目标&lt;/strong&gt;: 独立承担中等复杂度任务，开始参与团队协作&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│              60 天里程碑: &quot;能独立承担中等任务&quot;            │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  维度         │ 60 天目标                               │
│  ────────────┼──────────────────────────────────────── │
│  业务理解     │ 深入理解所负责模块的业务逻辑，能识别      │
│               │ 潜在风险和改进点                         │
│               │                                         │
│  技术能力     │ 独立完成 1 个中等复杂度需求（跨模块/      │
│               │ 涉及设计决策），参与 1 次技术方案评审     │
│               │                                         │
│  团队融入     │ 主动参与团队讨论，提出至少 1 个改进建议   │
│               │ 开始与新员工分享入职经验                  │
│               │                                         │
│  流程规范     │ 独立完成 1 次发布流程，参与 1 次值班      │
│               │                                         │
│  文化认同     │ 参与至少 1 次跨团队协作                   │
└─────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;60 天里程碑检查清单&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 独立完成 1 个中等复杂度需求并上线&lt;/li&gt;
&lt;li&gt;[ ] 主导至少 1 次代码评审&lt;/li&gt;
&lt;li&gt;[ ] 完成 1 次独立发布&lt;/li&gt;
&lt;li&gt;[ ] 与导师完成 4 次 1-on-1（每两周 1 次调整为每周 1 次可选）&lt;/li&gt;
&lt;li&gt;[ ] 与用人经理完成 1 次 60 天回顾&lt;/li&gt;
&lt;li&gt;[ ] 提出 1 个团队改进建议&lt;/li&gt;
&lt;li&gt;[ ] 提交 60 天自我评估&lt;/li&gt;
&lt;li&gt;[ ] 导师提交 60 天评估&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Phase 3: Day 61-90 — 独立与展望&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;阶段目标&lt;/strong&gt;: 完全独立工作，开始规划下一个成长周期&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│              90 天里程碑: &quot;能独立工作并规划未来&quot;          │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  维度         │ 90 天目标                               │
│  ────────────┼──────────────────────────────────────── │
│  业务理解     │ 全面理解业务全貌，能独立处理业务咨询      │
│               │                                         │
│  技术能力     │ 独立完成 1 个复杂需求或主导 1 个小型      │
│               │ 技术改进项目                             │
│               │                                         │
│  团队融入     │ 成为团队可靠贡献者，能指导更新的员工      │
│               │                                         │
│  流程规范     │ 熟练掌握所有团队流程，能独立处理突发      │
│               │ 事件                                     │
│               │                                         │
│  文化认同     │ 主动参与文化建设，价值观践行获团队认可    │
│               │                                         │
│  未来规划     │ 与经理共同制定下季度个人发展计划 (IDP)    │
└─────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;90 天里程碑检查清单&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 独立完成 1 个复杂需求或主导 1 个改进项目&lt;/li&gt;
&lt;li&gt;[ ] 完成 90 天转正评估（自评 + 导师评 + 经理评）&lt;/li&gt;
&lt;li&gt;[ ] 与用人经理共同制定 IDP（个人发展计划）&lt;/li&gt;
&lt;li&gt;[ ] 完成最终满意度调研&lt;/li&gt;
&lt;li&gt;[ ] 导师关系正式过渡到日常 mentorship 模式&lt;/li&gt;
&lt;li&gt;[ ] 知识库贡献至少 1 篇文档（沉淀入职期间学到的知识）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.3 Growth Tracker Agent 工作流&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;触发条件: 入职当日 (Day 1)，由 Orchestrator 触发

1. 读取员工 profile + 岗位规格 + 用人经理输入
2. 生成个性化 30-60-90 路线图:
   - 根据员工经验级别调整目标难度
   - 根据团队当前项目调整具体任务
   - 标注每个里程碑的评估方式和评估人
   → 写入 shared/onboarding/{id}/growth/roadmap.md

持续运行:
3. 每周 (Ops Agent 触发):
   a. 检查里程碑进度
   b. 标记临近截止但未完成的里程碑
   c. 发送进度提醒给新员工和导师

4. Day 30 触发 30 天评估:
   a. 生成评估问卷（自评 + 导师评 + 经理评）
   b. 收集评估结果
   c. 对比里程碑目标，生成差距分析
   d. 如差距显著 → 触发调整建议（延长 ramp-up、调整任务难度等）
   e. 生成 30 天评估报告
   → 写入 shared/onboarding/{id}/growth/day30-review.md

5. Day 60 触发 60 天评估 (流程同上)
6. Day 90 触发 90 天转正评估:
   a. 汇总 30/60/90 三次评估数据
   b. 生成入职全周期成长报告
   c. 触发 IDP 制定流程
   d. 生成知识库贡献提醒
   → 写入 shared/onboarding/{id}/growth/day90-final-review.md
   e. 交接给 Orchestrator: &quot;入职周期完成，转正评估: 通过/需延长&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.4 评估维度与评分&lt;/h3&gt;
&lt;p&gt;每个阶段评估采用 5 维度评分（1-5 分）：&lt;/p&gt;
&lt;p&gt;| 维度 | 1 分 | 3 分 | 5 分 |
|------|------|------|------|
| 业务理解 | 仅了解表面 | 理解核心流程 | 深入理解，能识别风险 |
| 技术能力 | 需大量指导 | 能独立完成中等任务 | 能独立解决复杂问题 |
| 团队协作 | 被动参与 | 主动协作 | 主动推动，帮助他人 |
| 流程规范 | 需要提醒 | 基本遵守 | 熟练掌握，能优化 |
| 文化认同 | 不了解 | 理解价值观 | 主动践行，影响他人 |&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;评估决策矩阵&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;| 30 天平均分 | 决策 |
|-------------|------|
| ≥ 4.0 | 按计划进入 Phase 2 |
| 3.0 - 3.9 | 按计划进入 Phase 2，但增加 1-on-1 频率 |
| &amp;#x3C; 3.0 | 触发预警，用人经理 + HR 讨论：调整计划/延长 ramp-up/导师加强辅导 |&lt;/p&gt;
&lt;h3&gt;6.5 交付物&lt;/h3&gt;
&lt;p&gt;| 交付物 | 路径 | 格式 |
|--------|------|------|
| 个性化成长路线图 | &lt;code&gt;shared/onboarding/{id}/growth/roadmap.md&lt;/code&gt; | Markdown |
| 30 天评估报告 | &lt;code&gt;shared/onboarding/{id}/growth/day30-review.md&lt;/code&gt; | Markdown |
| 60 天评估报告 | &lt;code&gt;shared/onboarding/{id}/growth/day60-review.md&lt;/code&gt; | Markdown |
| 90 天转正评估报告 | &lt;code&gt;shared/onboarding/{id}/growth/day90-final-review.md&lt;/code&gt; | Markdown |
| IDP (个人发展计划) | &lt;code&gt;shared/onboarding/{id}/growth/idp.md&lt;/code&gt; | Markdown |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;7. 模块五：智能问答助手&lt;/h2&gt;
&lt;h3&gt;7.1 设计原理&lt;/h3&gt;
&lt;p&gt;问答助手的核心矛盾：&lt;strong&gt;新员工问题的高频性、重复性与知识库的分散性。&lt;/strong&gt; 新员工每天可能问 10-20 个问题，从&quot;Wi-Fi 密码是多少&quot;到&quot;这个 API 的认证机制是什么&quot;，如果每次都要找人问，既消耗团队时间，又让新员工感到不好意思问。&lt;/p&gt;
&lt;p&gt;解决方案：Knowledge Agent 作为 7×24 在线问答助手，基于公司知识库提供即时回答，无法回答的问题自动升级到导师/团队，并将答案沉淀回知识库。&lt;/p&gt;
&lt;h3&gt;7.2 知识库架构&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;shared/knowledge/
├── policies/                    # 规章制度
│   ├── attendance.md            # 考勤制度
│   ├── reimbursement.md         # 报销流程
│   ├── leave.md                 # 请假流程
│   ├── security.md              # 安全合规
│   └── remote-work.md           # 远程办公
├── tools/                       # 工具使用指南
│   ├── dev-environment.md       # 开发环境配置
│   ├── git-workflow.md          # Git 工作流
│   ├── ci-cd.md                 # CI/CD 流程
│   ├── vpn-setup.md             # VPN 配置
│   └── communication.md         # 沟通工具（IM/邮件/会议）
├── culture/                     # 文化价值观
│   ├── values.md                # 核心价值观
│   ├── stories.md               # 文化故事
│   └── norms.md                 # 团队约定
├── faq/                         # 高频问题（自动积累）
│   ├── day1-faq.md              # 首日高频问题
│   ├── week1-faq.md             # 首周高频问题
│   └── general-faq.md           # 通用高频问题
├── onboarding/                  # 入职专属知识
│   ├── glossary.md              # 公司术语表
│   ├── org-chart.md             # 组织架构
│   └── team-intro/              # 各团队介绍
└── index.json                   # 知识库索引（向量检索）
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.3 问答流程&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;新员工提问
    │
    ▼
┌─────────────┐
│ 意图识别     │ ← Knowledge Agent
│             │
│ 分类:       │
│ A. 事实型   │ → &quot;Wi-Fi 密码是什么&quot;
│ B. 流程型   │ → &quot;怎么申请报销&quot;
│ C. 技术型   │ → &quot;这个 API 怎么调用&quot;
│ D. 人际型   │ → &quot;谁负责 XXX 模块&quot;
│ E. 文化型   │ → &quot;公司的晋升机制是什么&quot;
└──────┬──────┘
       │
       ▼
┌─────────────┐     置信度 ≥ 0.85     ┌──────────────┐
│ 知识库检索   │ ──────────────────→ │ 直接回答      │
│ (向量+关键词)│                      │ + 附带来源链接 │
└──────┬──────┘                      └──────────────┘
       │ 置信度 &amp;#x3C; 0.85
       ▼
┌─────────────┐     找到相关文档      ┌──────────────┐
│ 文档推荐     │ ──────────────────→ │ 推荐文档      │
│             │                      │ &quot;你可能需要   │
│             │                      │  查看这篇&quot;    │
└──────┬──────┘                      └──────────────┘
       │ 未找到相关文档
       ▼
┌─────────────┐     能识别应答人      ┌──────────────┐
│ 路由到人     │ ──────────────────→ │ 转发给导师/   │
│             │                      │ 相关负责人    │
│             │                      │ + 记录问题    │
└──────┬──────┘                      └──────────────┘
       │ 无法识别应答人
       ▼
┌─────────────┐
│ 升级到 Orchestrator               │
│ → 转发给用人经理                  │
│ → 记录为新知识缺口                │
│ → 答案获得后沉淀到 FAQ            │
└───────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.4 问答记录与知识沉淀&lt;/h3&gt;
&lt;p&gt;每次问答都被记录，用于持续优化知识库：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;qa_id&quot;: &quot;QA-{employee-id}-0001&quot;,
  &quot;timestamp&quot;: &quot;2026-08-14T10:23:00+08:00&quot;,
  &quot;employee_id&quot;: &quot;{employee-id}&quot;,
  &quot;question&quot;: &quot;VPN 连接不上怎么办？&quot;,
  &quot;intent&quot;: &quot;PROCESS&quot;,
  &quot;confidence&quot;: 0.72,
  &quot;resolution_path&quot;: &quot;DOC_RECOMMEND&quot;,
  &quot;answer_source&quot;: &quot;knowledge/tools/vpn-setup.md&quot;,
  &quot;resolved&quot;: true,
  &quot;resolution_time_seconds&quot;: 15,
  &quot;followup_needed&quot;: false,
  &quot;knowledge_gap&quot;: false
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;知识沉淀规则&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同一问题被 3+ 人提问 → 自动进入 FAQ 候选队列&lt;/li&gt;
&lt;li&gt;置信度 &amp;#x3C; 0.5 的问答 → 标记为知识缺口，通知知识库管理员&lt;/li&gt;
&lt;li&gt;升级到人的问答 → 答案获取后，Knowledge Agent 自动生成 FAQ 条目&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.5 Knowledge Agent 工作流&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;触发条件: 持续运行（7×24 在线）

初始化:
1. 加载知识库索引 (shared/knowledge/index.json)
2. 向量化所有知识文档
3. 建立意图分类模型

运行时:
4. 接收新员工提问
5. 意图分类 + 知识库检索
6. 按置信度选择回答路径（直接回答/文档推荐/路由到人/升级）
7. 记录问答日志
8. 每日 (Ops Agent 触发):
   a. 分析高频问题
   b. 识别知识缺口
   c. 生成 FAQ 候选
   d. 更新知识库索引
   → 写入 shared/knowledge/faq/auto-generated-{date}.md

交接规则:
- 无法解决的问题 → 升级到 Orchestrator，附带问题原文和检索记录
- 识别到新员工情绪负面（如&quot;好难&quot;&quot;想放弃&quot;）→ 立即通知导师
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.6 交付物&lt;/h3&gt;
&lt;p&gt;| 交付物 | 路径 | 格式 |
|--------|------|------|
| 问答日志 | &lt;code&gt;shared/onboarding/{id}/qa-log/{date}.json&lt;/code&gt; | JSON |
| 高频问题分析 | &lt;code&gt;shared/knowledge/faq/auto-generated-{date}.md&lt;/code&gt; | Markdown |
| 知识缺口报告 | &lt;code&gt;shared/knowledge/gaps-{date}.md&lt;/code&gt; | Markdown |
| 知识库索引 | &lt;code&gt;shared/knowledge/index.json&lt;/code&gt; | JSON |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;8. 模块六：导师匹配与 1-on-1 安排&lt;/h2&gt;
&lt;h3&gt;8.1 设计原理&lt;/h3&gt;
&lt;p&gt;导师匹配的核心矛盾：&lt;strong&gt;&quot;最优技术匹配&quot;与&quot;人际化学反应&quot;不可兼得。&lt;/strong&gt; 纯算法匹配可能找到技术最相关的导师，但性格不合反而有害；纯人工分配则依赖经理主观判断，缺乏数据支撑。&lt;/p&gt;
&lt;p&gt;解决方案：Mentor Match Agent 采用&lt;strong&gt;算法推荐 + 经理确认&lt;/strong&gt;的双层模式——算法基于多维度生成 Top-3 候选，用人经理做最终决策。同时自动安排 1-on-1 日程，确保沟通节奏落地。&lt;/p&gt;
&lt;h3&gt;8.2 导师画像维度&lt;/h3&gt;
&lt;p&gt;导师匹配基于以下维度计算相似度：&lt;/p&gt;
&lt;p&gt;| 维度 | 权重 | 数据来源 | 匹配逻辑 |
|------|------|----------|----------|
| &lt;strong&gt;技术栈&lt;/strong&gt; | 30% | 员工技能标签 | 技术栈重叠率 |
| &lt;strong&gt;岗位路径&lt;/strong&gt; | 20% | 岗位序列 | 同岗位序列优先 |
| &lt;strong&gt;性格互补&lt;/strong&gt; | 15% | 性格测评结果 | 互补型匹配（如内向新员工配外向导师） |
| &lt;strong&gt;时区/办公地&lt;/strong&gt; | 15% | 办公位置 | 同地点优先，同楼层加分 |
| &lt;strong&gt;工作负载&lt;/strong&gt; | 10% | 当前带人数量 | 当前带人 ≤ 2 优先 |
| &lt;strong&gt;入职时间&lt;/strong&gt; | 5% | 司龄 | 司龄 1-3 年优先（既有经验又不过于资深） |
| &lt;strong&gt;兴趣重合&lt;/strong&gt; | 5% | 兴趣标签 | 非工作话题有交集加分 |&lt;/p&gt;
&lt;h3&gt;8.3 匹配算法&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def match_mentor(new_hire, mentor_pool):
    &quot;&quot;&quot;
    计算新员工与候选导师池的匹配分数，返回 Top-3
    &quot;&quot;&quot;
    scores = []
    for mentor in mentor_pool:
        # 排除条件
        if mentor.current_mentee_count &gt;= 3:
            continue
        if mentor.department == new_hire.direct_department:
            # 同部门导师降权（避免直接上级兼任导师）
            dept_penalty = 0.8
        else:
            dept_penalty = 1.0

        # 各维度分数 (0-1)
        tech_score = jaccard_similarity(new_hire.tech_stack, mentor.tech_stack)
        role_score = 1.0 if new_hire.role_family == mentor.role_family else 0.3
        personality_score = personality_complement(new_hire.personality, mentor.personality)
        location_score = 1.0 if new_hire.location == mentor.location else 0.5
        workload_score = 1.0 - (mentor.current_mentee_count / 3)
        tenure_score = tenure_weight(mentor.tenure_years)  # 1-3年最优
        interest_score = jaccard_similarity(new_hire.interests, mentor.interests)

        # 加权总分
        total = (
            tech_score * 0.30 +
            role_score * 0.20 +
            personality_score * 0.15 +
            location_score * 0.15 +
            workload_score * 0.10 +
            tenure_score * 0.05 +
            interest_score * 0.05
        ) * dept_penalty

        scores.append({
            &quot;mentor&quot;: mentor,
            &quot;total_score&quot;: total,
            &quot;breakdown&quot;: {
                &quot;tech&quot;: tech_score,
                &quot;role&quot;: role_score,
                &quot;personality&quot;: personality_score,
                &quot;location&quot;: location_score,
                &quot;workload&quot;: workload_score,
                &quot;tenure&quot;: tenure_score,
                &quot;interest&quot;: interest_score
            }
        })

    # 返回 Top-3
    scores.sort(key=lambda x: x[&quot;total_score&quot;], reverse=True)
    return scores[:3]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8.4 匹配流程&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;触发条件: 入职前 3 工作日 (D-3)

1. Mentor Match Agent 读取新员工 profile
2. 从导师池中筛选可用导师
3. 运行匹配算法，生成 Top-3 候选
4. 生成匹配报告（含各维度得分和推荐理由）
   → 写入 shared/onboarding/{id}/mentor/match-report.md
5. 发送给用人经理确认:
   - 展示 Top-3 候选及匹配理由
   - 经理选择 1 人或提出其他人选
6. 经理确认后:
   a. 向导师发送邀请（含新员工信息、匹配理由、导师职责说明）
   b. 导师确认接受
   c. 向新员工发送导师介绍
   d. 记录匹配结果
   → 写入 shared/onboarding/{id}/mentor/assignment.md

7. 自动安排 1-on-1 日程 (见 8.5)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8.5 1-on-1 排程逻辑&lt;/h3&gt;
&lt;h4&gt;排程频率&lt;/h4&gt;
&lt;p&gt;| 入职阶段 | 频率 | 时长 | 形式 |
|----------|------|------|------|
| Week 1 (Day 1-5) | 每日 15min | 15 分钟 | 面对面/视频 |
| Week 2-4 (Day 6-30) | 每周 1 次 | 30 分钟 | 面对面/视频 |
| Day 31-60 | 每两周 1 次 | 45 分钟 | 面对面/视频 |
| Day 61-90 | 每两周 1 次 | 45 分钟 | 面对面/视频 |
| Day 90+ | 每月 1 次 | 45 分钟 | 转入日常 mentorship |&lt;/p&gt;
&lt;h4&gt;1-on-1 模板&lt;/h4&gt;
&lt;p&gt;每次 1-on-1 前自动推送给导师的模板：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# 1-on-1 记录: {新员工姓名} × {导师姓名}
**日期**: {date}
**阶段**: {Week 1 / Day 30 / Day 60...}
**时长**: {minutes}

## 导师检查清单（会前预览）

- [ ] 查看新员工本周任务看板完成情况
- [ ] 查看新员工问答记录（是否有反复追问的领域）
- [ ] 查看新员工满意度调研趋势
- [ ] 准备 1 个具体反馈（正面或改进）

## 建议议程

### 1. 开场 (3min)
- 最近感觉怎么样？（开放性问题，让新员工先说）

### 2. 进度回顾 (10min)
- 本周完成了哪些任务？有什么收获？
- 遇到了什么困难？需要什么帮助？

### 3. 反馈与指导 (10min)
- 导师观察反馈（基于本周看板、问答、评估数据）
- 新员工对导师/团队/流程的反馈

### 4. 下一步规划 (5min)
- 下周重点任务确认
- 需要提前准备什么？

### 5. 开放话题 (2min)
- 有没有其他想聊的？（不限工作）

## 记录

### 关键讨论点
-

### 行动项
| 行动项 | 负责人 | 截止日期 |
|--------|--------|----------|
|        |        |          |

### 风险信号（如有）
-

### 下次 1-on-1 时间
{next_date}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;排程自动化&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;Mentor Match Agent 排程逻辑:

1. 读取导师和新员工的日历
2. 查找双方都可用的时间段:
   - Week 1: 每日 16:00-16:15 优先（避开站会和午休）
   - Week 2+: 每周/每两周固定时段
3. 创建日历邀请（含 1-on-1 模板链接）
4. 会前 1 小时推送提醒给导师（含检查清单）
5. 会前 15 分钟推送提醒给新员工
6. 会后自动推送记录模板
7. 记录完成后归档:
   → shared/onboarding/{id}/mentor/1on1/{date}.md

异常处理:
- 导师请假 → 自动重新安排或寻找临时替代
- 连续 2 次取消 → 通知 Orchestrator，考虑更换导师
- 1-on-1 记录连续 2 次未提交 → 提醒导师
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8.6 交付物&lt;/h3&gt;
&lt;p&gt;| 交付物 | 路径 | 格式 |
|--------|------|------|
| 导师匹配报告 | &lt;code&gt;shared/onboarding/{id}/mentor/match-report.md&lt;/code&gt; | Markdown |
| 导师分配确认 | &lt;code&gt;shared/onboarding/{id}/mentor/assignment.md&lt;/code&gt; | Markdown |
| 1-on-1 排程表 | &lt;code&gt;shared/onboarding/{id}/mentor/schedule.json&lt;/code&gt; | JSON |
| 1-on-1 记录 | &lt;code&gt;shared/onboarding/{id}/mentor/1on1/{date}.md&lt;/code&gt; | Markdown |
| 导师评估汇总 | &lt;code&gt;shared/onboarding/{id}/mentor/mentor-evaluation.md&lt;/code&gt; | Markdown |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;9. 模块七：入职体验满意度追踪&lt;/h2&gt;
&lt;h3&gt;9.1 设计原理&lt;/h3&gt;
&lt;p&gt;满意度追踪的核心矛盾：&lt;strong&gt;&quot;事后问卷&quot;太晚，&quot;实时监控&quot;太重。&lt;/strong&gt; 传统的离职面谈或转正问卷只能事后发现问题，而频繁的调研会让新员工感到被打扰。&lt;/p&gt;
&lt;p&gt;解决方案：Experience Surveyor Agent 采用&lt;strong&gt;脉冲式调研 (Pulse Survey)&lt;/strong&gt; ——在关键节点投放极短的微调研（1-3 题），结合被动信号（问答情绪、任务完成速度、1-on-1 记录关键词）构建实时体验画像。&lt;/p&gt;
&lt;h3&gt;9.2 调研触点设计&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;入职时间线:
Day 1 ──── Day 3 ──── Day 7 ──── Day 14 ──── Day 30 ──── Day 60 ──── Day 90
  │          │          │           │           │           │           │
  ▼          ▼          ▼           ▼           ▼           ▼           ▼
首日       首日       首周        两周        30天        60天        90天
即时       回顾       回顾        脉冲        评估        评估        总评
(1题)      (2题)      (3题)       (1题)       (5题)       (5题)       (8题)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;调研内容&lt;/h4&gt;
&lt;p&gt;| 触点 | 时机 | 题目 | 类型 |
|------|------|------|------|
| &lt;strong&gt;T1: 首日即时&lt;/strong&gt; | Day 1, 16:30 | &quot;今天的第一天体验如何？&quot; (1-5 分) | NPS 式 |
| &lt;strong&gt;T2: 首日回顾&lt;/strong&gt; | Day 1, 21:00 | ①&quot;今天有什么超出预期的？&quot; ②&quot;今天有什么低于预期的？&quot; | 开放式 |
| &lt;strong&gt;T3: 首周回顾&lt;/strong&gt; | Day 5, 17:00 | ①&quot;首周整体体验&quot; (1-5 分) ②&quot;你觉得自己准备好开始独立工作了吗？&quot; (1-5 分) ③&quot;有什么想说的？&quot; | 混合 |
| &lt;strong&gt;T4: 两周脉冲&lt;/strong&gt; | Day 14 | &quot;过去一周，你在工作中遇到的最大阻碍是什么？&quot; | 开放式 |
| &lt;strong&gt;T5: 30天评估&lt;/strong&gt; | Day 30 | ①工作内容匹配度 ②导师支持满意度 ③团队融入度 ④工具/流程满意度 ⑤开放反馈 | 5 维度 + 开放 |
| &lt;strong&gt;T6: 60天评估&lt;/strong&gt; | Day 60 | 同 T5 + &quot;你对当前的工作节奏满意吗？&quot; | 6 维度 + 开放 |
| &lt;strong&gt;T7: 90天总评&lt;/strong&gt; | Day 90 | ①整体入职体验 ②推荐意愿 (NPS) ③各模块满意度 ④最有价值的环节 ⑤最需改进的环节 ⑥导师评价 ⑦对后续新员工的建议 ⑧开放反馈 | 综合 |&lt;/p&gt;
&lt;h3&gt;9.3 被动信号采集&lt;/h3&gt;
&lt;p&gt;除主动调研外，系统持续采集被动信号，构建实时体验画像：&lt;/p&gt;
&lt;p&gt;| 信号源 | 采集方式 | 指标 | 预警阈值 |
|--------|----------|------|----------|
| &lt;strong&gt;问答记录&lt;/strong&gt; | Knowledge Agent 日志 | 日均提问数、提问情绪倾向 | 日均 &amp;#x3C; 1 题（可能不敢问）或情绪负面率 &gt; 20% |
| &lt;strong&gt;任务看板&lt;/strong&gt; | Task Board Agent 数据 | 任务完成速度、BLOCKED 时长 | BLOCKED 超过 24h 未解决 |
| &lt;strong&gt;1-on-1 记录&lt;/strong&gt; | 导师记录文本分析 | 情绪关键词、风险信号词 | 出现&quot;困难&quot;&quot;迷茫&quot;&quot;跟不上&quot;等词 |
| &lt;strong&gt;系统活跃度&lt;/strong&gt; | 登录日志、代码提交 | 日均活跃时长、首次提交时间 | 连续 2 天无系统活动 |
| &lt;strong&gt;考勤&lt;/strong&gt; | 门禁/打卡数据 | 迟到/早退频率 | 非常规考勤模式 |&lt;/p&gt;
&lt;h3&gt;9.4 体验画像模型&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;体验画像 = f(主动调研分数, 被动信号指标, 时间衰减加权)

实时体验分数计算:

  ExperienceScore = w1 * SurveyScore + w2 * SignalScore

  其中:
  SurveyScore = 最近一次调研的标准化分数 (0-100)
  SignalScore = 被动信号的加权汇总:
    - 问答活跃度: 25% (正常提问 = 高分)
    - 任务完成率: 25%
    - 1-on-1 情绪: 25%
    - 系统活跃度: 25%

  权重:
  w1 = 0.6 (主动调研更可靠)
  w2 = 0.4 (被动信号补充)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;9.5 预警机制&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│                    预警等级                              │
├──────────┬──────────────────────────────────────────────┤
│ 等级     │ 触发条件                  │ 响应动作          │
├──────────┼──────────────────────────────────────────────┤
│ 🟢 绿色  │ ExperienceScore ≥ 75     │ 正常，无需干预    │
│          │ 无负面信号               │                  │
├──────────┼──────────────────────────────────────────────┤
│ 🟡 黄色  │ 60 ≤ Score &amp;#x3C; 75          │ 通知导师加强关注  │
│          │ 或出现 1 个负面信号       │ 增加一次 1-on-1   │
├──────────┼──────────────────────────────────────────────┤
│ 🟠 橙色  │ 45 ≤ Score &amp;#x3C; 60          │ 通知用人经理      │
│          │ 或出现 2 个负面信号       │ 经理安排 1-on-1   │
│          │ 或调研分数骤降 &gt; 20%      │ Experience       │
│          │                          │ Surveyor 深入调研 │
├──────────┼──────────────────────────────────────────────┤
│ 🔴 红色  │ Score &amp;#x3C; 45               │ 立即通知 HR +    │
│          │ 或连续 2 次调研 &amp;#x3C; 3 分    │ 用人经理          │
│          │ 或出现&quot;想离开&quot;类信号      │ HR 介入面谈       │
│          │                          │ 制定干预计划      │
└──────────┴──────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;9.6 Experience Surveyor Agent 工作流&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;触发条件: 持续运行 + 关键节点触发

调研管理:
1. 在 T1-T7 触发点自动推送调研问卷
2. 24h 未填写 → Ops Agent 发送提醒
3. 48h 未填写 → 通知导师提醒
4. 收集调研结果 → 写入 shared/onboarding/{id}/surveys/

被动信号采集:
5. 每日 (Ops Agent 触发):
   a. 从 Knowledge Agent 拉取问答日志
   b. 从 Task Board Agent 拉取任务状态
   c. 从 1-on-1 记录中分析情绪
   d. 从系统日志拉取活跃度数据
   e. 计算当日 ExperienceScore
   → 写入 shared/onboarding/{id}/surveys/daily-score.json

预警处理:
6. 计算预警等级
7. 🟡 → 通知导师
8. 🟠 → 通知用人经理 + 触发深入调研
9. 🔴 → 通知 HR + 用人经理，生成《风险预警报告》
   → 写入 shared/onboarding/{id}/surveys/alert-{date}.md

周期报告:
10. Day 30/60/90 生成阶段体验报告:
    - 体验分数趋势图
    - 调研结果汇总
    - 被动信号分析
    - 预警历史
    - 改进建议
    → 写入 shared/onboarding/{id}/surveys/phase-{N}-report.md

11. Day 90 生成全周期体验报告:
    - 跨阶段趋势对比
    - 各模块满意度排名
    - NPS 分数
    - 高频改进建议汇总
    → 写入 shared/onboarding/{id}/surveys/final-report.md
    → 同时写入 shared/reviews/（供 Orchestrator 汇总到仪表盘）
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;9.7 交付物&lt;/h3&gt;
&lt;p&gt;| 交付物 | 路径 | 格式 |
|--------|------|------|
| 各触点调研结果 | &lt;code&gt;shared/onboarding/{id}/surveys/touchpoint-{N}.json&lt;/code&gt; | JSON |
| 每日体验分数 | &lt;code&gt;shared/onboarding/{id}/surveys/daily-score.json&lt;/code&gt; | JSON |
| 风险预警报告 | &lt;code&gt;shared/onboarding/{id}/surveys/alert-{date}.md&lt;/code&gt; | Markdown |
| 阶段体验报告 | &lt;code&gt;shared/onboarding/{id}/surveys/phase-{N}-report.md&lt;/code&gt; | Markdown |
| 全周期体验报告 | &lt;code&gt;shared/onboarding/{id}/surveys/final-report.md&lt;/code&gt; | Markdown |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;10. 任务生命周期管理&lt;/h2&gt;
&lt;h3&gt;10.1 全局任务状态机&lt;/h3&gt;
&lt;p&gt;系统中所有任务（准备项、首日活动、看板任务、里程碑、1-on-1、调研）统一遵循以下状态机：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;                    ┌──────────┐
                    │  Inbox   │ ← 新任务创建
                    └────┬─────┘
                         │ Orchestrator 分配
                         ▼
                    ┌──────────┐
                    │ Assigned │ ← 已分配 Agent
                    └────┬─────┘
                         │ Agent 开始执行
                         ▼
                    ┌──────────┐
          ┌────────→│ In Prog. │←───────┐
          │         └────┬─────┘        │
          │              │ Agent 完成   │ Reviewer 退回
          │              ▼              │
          │         ┌──────────┐        │
          │         │  Review  │────────┘
          │         └────┬─────┘
          │              │ Reviewer 通过
          │              ▼
          │         ┌──────────┐
          │         │   Done   │
          │         └──────────┘
          │
          │ 阻塞
          ▼
    ┌──────────┐         ┌──────────┐
    │ Blocked  │────────→│ Escalated│
    └──────────┘  升级    └──────────┘
                         │ 解决
                         ▼
                    ┌──────────┐
                    │ In Prog. │
                    └──────────┘

    任何状态 ──→ Failed (放弃，附带原因)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;10.2 状态转换规则&lt;/h3&gt;
&lt;p&gt;| 当前状态 | 目标状态 | 执行者 | 条件 |
|----------|----------|--------|------|
| Inbox | Assigned | Orchestrator | 选择合适的 Agent |
| Assigned | In Progress | Orchestrator | Spawn Agent 或发送任务 |
| In Progress | Review | Agent | 完成工作，提交交付物 |
| Review | Done | Orchestrator | Reviewer 批准 |
| Review | In Progress | Reviewer | 退回，附反馈 |
| In Progress | Blocked | Agent | 遇到无法解决的阻塞 |
| Blocked | Escalated | Orchestrator | 超时或需要人类干预 |
| Escalated | In Progress | Orchestrator | 阻塞解决 |
| Any | Failed | Orchestrator | 放弃，附文档化原因 |&lt;/p&gt;
&lt;h3&gt;10.3 任务评论规范&lt;/h3&gt;
&lt;p&gt;每次状态变更必须附带评论，格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Agent名] [动作]: [详情]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Pre-boarding] Starting: 开始处理员工 EMP-001 的入职准备清单。读取岗位规格: engineer-onboarding-spec.md。共 13 项准备任务。

[Pre-boarding] Blocked: IT 部门未响应 VPN 账号开通请求，已等待 48h。需要 HR 协助催办。任务: VPN-001。

[Pre-boarding] Handoff: 准备清单执行完毕。13 项中 12 项 Done，1 项 Escalated (VPN 账号)。就绪报告: shared/onboarding/EMP-001/pre-boarding/readiness-report.md。已知风险: VPN 可能影响首日开发环境配置。下一步: Orchestrator 确认是否需要 IT 紧急处理。

[Experience Surveyor] Alert: 员工 EMP-003 体验分数降至 42 (红色预警)。触发条件: 连续 2 次调研 &amp;#x3C; 3 分 + 1-on-1 记录出现&quot;跟不上&quot;关键词。已通知 HR 和用人经理。报告: shared/onboarding/EMP-003/surveys/alert-2026-08-14.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;10.4 多步骤任务拆分&lt;/h3&gt;
&lt;p&gt;复杂任务自动拆分为子任务，保持父子关系：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Task #ONB-2026-08-EMP001: 员工 EMP-001 入职全流程
  ├── #PRE-001: 入职前准备清单 (Assigned: Pre-boarding Agent)
  │     ├── #PRE-001a: 开通 IT 账号 (Assigned: IT 部门)
  │     ├── #PRE-001b: 准备设备 (Assigned: IT + 行政)
  │     └── #PRE-001c: 生成就绪报告 (Assigned: Pre-boarding Agent)
  ├── #DAY1-001: 首日引导 (Assigned: Day-One Guide Agent)
  ├── #WK1-001: 首周任务看板 (Assigned: Task Board Agent)
  ├── #GRW-001: 30-60-90 成长路线图 (Assigned: Growth Tracker Agent)
  │     ├── #GRW-001a: Day 30 评估
  │     ├── #GRW-001b: Day 60 评估
  │     └── #GRW-001c: Day 90 转正评估
  ├── #MEN-001: 导师匹配与 1-on-1 (Assigned: Mentor Match Agent)
  └── #EXP-001: 满意度追踪 (Assigned: Experience Surveyor Agent)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Orchestrator 跟踪父任务，所有子任务完成后才标记父任务 Done。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;11. 运维与监控&lt;/h2&gt;
&lt;h3&gt;11.1 Ops Agent 定时任务&lt;/h3&gt;
&lt;p&gt;| 任务 | 频率 | 时间 | 动作 |
|------|------|------|------|
| 每日巡检 | 每日 | 08:30 | 扫描所有活跃 onboarding 记录，检查逾期任务、stale 任务、阻塞任务 |
| 每日报告 | 每日 | 09:00 | 向 Orchestrator 提交《入职每日简报》 |
| 任务提醒 | 每日 | 09:00, 14:00 | 向新员工推送当日待办任务 |
| 进度检查 | 每日 | 18:00 | 统计当日任务完成情况，检查 BLOCKED 任务 |
| 体验监控 | 每日 | 20:00 | 计算 ExperienceScore，检查预警等级 |
| 催办推送 | 按需 | 截止前 24h/4h | 向责任方推送催办通知 |
| 健康检查 | 每周 | 周一 08:00 | 检查知识库索引完整性、Agent 可用性、共享目录可写性 |
| 周报生成 | 每周 | 周五 17:00 | 生成本周入职汇总报告 |
| 月报生成 | 每月 | 月末 | 生成月度入职分析报告 |
| 数据清理 | 每月 | 月末 | 归档 90 天前完成的 onboarding 记录 |&lt;/p&gt;
&lt;h3&gt;11.2 每日简报模板&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# 入职每日简报 — {date}

## 今日活跃入职

| 员工 | 阶段 | 体验分 | 预警 | 阻塞任务 |
|------|------|--------|------|----------|
| 张三 | Day 3 | 82 🟢 | 无 | 0 |
| 李四 | Day 15 | 58 🟡 | 导师已通知 | 1 (权限申请) |
| 王五 | Day 45 | 41 🔴 | HR 已通知 | 2 |

## 今日待办
- [ ] EMP-001: 首日引导（Day-One Guide Agent）
- [ ] EMP-002: 30 天评估触发（Growth Tracker Agent）
- [ ] EMP-003: HR 介入面谈跟进

## 逾期任务
| 任务 | 员工 | 逾期天数 | 责任方 | 状态 |
|------|------|----------|--------|------|
| VPN 开通 | EMP-001 | 2 | IT | Escalated |

## Stale 任务（24h+ 无更新）
- 无

## 本周入职预告
- 08/16: 赵六 (前端工程师)
- 08/18: 钱七 (产品经理)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;11.3 仪表盘&lt;/h3&gt;
&lt;p&gt;Orchestrator 维护实时仪表盘，向 HR 和管理层展示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│                  入职引导仪表盘                           │
├──────────────────────┬──────────────────────────────────┤
│ 在入职人数           │ 12                               │
│ 本月新入职           │ 8                                │
│ 本月即将入职         │ 5                                │
│ 平均体验分           │ 76 🟢                            │
│ 红色预警人数         │ 1 🔴                             │
│ 90 天转正率          │ 94%                              │
│ 平均 ramp-up 天数    │ 28 天                            │
├──────────────────────┴──────────────────────────────────┤
│ 各阶段体验分数趋势                                       │
│                                                         │
│  90 ┤    ●─────●─────●                                  │
│  80 ┤  ●─┘                                            ● │
│  70 ┤●                                               ● │
│  60 ┤                                            ●●    │
│  50 ┤                                                 │
│     └──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──→         │
│        D1 D3 D7 D14    D30       D60       D90         │
├─────────────────────────────────────────────────────────┤
│ 模块满意度排名 (90 天数据)                                │
│  1. 智能问答助手    4.6/5                                │
│  2. 入职前准备      4.3/5                                │
│  3. 首日引导        4.2/5                                │
│  4. 导师匹配        4.0/5                                │
│  5. 首周任务看板    3.8/5                                │
│  6. 成长路线图      3.7/5                                │
│  7. 满意度追踪      3.5/5                                │
├─────────────────────────────────────────────────────────┤
│ 高频改进建议 (Top 5)                                     │
│  1. &quot;VPN 配置太复杂，希望有视频教程&quot;          (8 票)     │
│  2. &quot;导师太忙，1-on-1 经常被取消&quot;             (6 票)     │
│  3. &quot;希望首周有更多和团队非正式交流的机会&quot;     (5 票)     │
│  4. &quot;30 天评估可以更早一些&quot;                   (4 票)     │
│  5. &quot;知识库部分内容已过时&quot;                    (3 票)     │
└─────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;12. 数据模型&lt;/h2&gt;
&lt;h3&gt;12.1 核心实体&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Employee (新员工)
├── id: string (EMP-YYYY-MM-NNN)
├── name: string
├── email: string
├── department: string
├── role: string (engineer | designer | pm | ...)
├── level: string (junior | mid | senior)
├── start_date: date
├── manager_id: string
├── mentor_id: string (nullable)
├── profile: json (技能标签、性格测评、兴趣)
├── status: enum (PRE_BOARDING | ONBOARDING | PROBATION | CONFIRMED)
└── created_at: datetime

OnboardingRecord (入职记录)
├── id: string (ONB-YYYY-MM-NNN)
├── employee_id: string
├── current_phase: enum (PRE | DAY1 | WEEK1 | DAY30 | DAY60 | DAY90 | DONE)
├── experience_score: float (0-100)
├── alert_level: enum (GREEN | YELLOW | ORANGE | RED)
├── tasks: Task[]
├── surveys: Survey[]
├── qa_logs: QALog[]
└── created_at: datetime

Task (任务)
├── id: string
├── onboarding_id: string
├── parent_id: string (nullable)
├── title: string
├── category: enum (PRE_BOARDING | DAY1 | WEEK1 | GROWTH | MENTOR | SURVEY)
├── status: enum (INBOX | ASSIGNED | IN_PROGRESS | REVIEW | DONE | BLOCKED | ESCALATED | FAILED)
├── assigned_agent: string
├── assigned_human: string (nullable)
├── priority: enum (MUST | SHOULD | EXPLORE)
├── due_date: datetime
├── completed_at: datetime (nullable)
├── comments: Comment[]
└── artifacts: string[] (文件路径列表)

MentorAssignment (导师分配)
├── id: string
├── employee_id: string
├── mentor_id: string
├── match_score: float
├── match_breakdown: json
├── confirmed_by: string (manager)
├── confirmed_at: datetime
└── schedule: 1on1Schedule[]

Survey (调研)
├── id: string
├── employee_id: string
├── touchpoint: enum (T1-T7)
├── triggered_at: datetime
├── submitted_at: datetime (nullable)
├── questions: SurveyQuestion[]
└── score: float (nullable)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;12.2 数据存储&lt;/h3&gt;
&lt;p&gt;| 数据类型 | 存储方式 | 位置 |
|----------|----------|------|
| 结构化数据（任务状态、分数、匹配结果） | JSON 文件 | &lt;code&gt;shared/onboarding/{id}/&lt;/code&gt; |
| 文档型数据（报告、评估、记录） | Markdown 文件 | &lt;code&gt;shared/onboarding/{id}/&lt;/code&gt; |
| 知识库 | Markdown + 向量索引 | &lt;code&gt;shared/knowledge/&lt;/code&gt; |
| 仪表盘聚合数据 | JSON | &lt;code&gt;shared/dashboard/&lt;/code&gt; |
| 决策日志 | Markdown | &lt;code&gt;shared/decisions/&lt;/code&gt; |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;13. 实施路线图&lt;/h2&gt;
&lt;h3&gt;13.1 分阶段实施&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Phase 0: 基础设施 (Week 1-2)
├── 搭建 shared/ 目录结构
├── 编写岗位入职规格模板（先做工程师岗位）
├── 初始化知识库（从现有文档迁移）
├── 部署 Orchestrator + Ops Agent
└── 验证: 创建测试 onboarding 记录，确认目录结构正确

Phase 1: 核心流程 (Week 3-5)
├── 部署 Pre-boarding Agent
├── 部署 Day-One Guide Agent
├── 部署 Task Board Agent
├── 部署 Knowledge Agent（基础问答）
├── 端到端测试: 模拟 1 位新员工完整首周流程
└── 验证: 首日检查清单 100% 可执行

Phase 2: 成长与匹配 (Week 6-8)
├── 部署 Growth Tracker Agent
├── 部署 Mentor Match Agent
├── 建立导师池（从现有员工中招募和画像）
├── 1-on-1 排程集成日历系统
└── 验证: 导师匹配 Top-3 合理性经经理确认

Phase 3: 体验监控 (Week 9-10)
├── 部署 Experience Surveyor Agent
├── 部署被动信号采集管道
├── 配置预警规则和通知通道
├── 仪表盘上线
└── 验证: 模拟预警场景，确认通知链路正常

Phase 4: 试点运行 (Week 11-14)
├── 选择 3-5 位真实新员工试点
├── 全流程运行，收集反馈
├── 每周 Review: 体验分数、Agent 表现、流程卡点
├── 迭代优化
└── 验证: 试点新员工 30 天体验分数 ≥ 75

Phase 5: 全面上线 (Week 15+)
├── 所有新员工纳入系统
├── 扩展岗位模板（设计师、产品经理、运营等）
├── 建立持续优化机制（月度复盘）
└── 长期目标: 90 天转正率 ≥ 95%，平均体验分 ≥ 80
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;13.2 风险与缓解&lt;/h3&gt;
&lt;p&gt;| 风险 | 概率 | 影响 | 缓解措施 |
|------|------|------|----------|
| 知识库内容过时/不完整 | 高 | 高 | Knowledge Agent 自动识别知识缺口，建立知识库维护 SLA |
| 导师池不足 | 中 | 高 | 提前招募导师，设定每导师最多带 2 人的上限 |
| Agent 响应延迟 | 中 | 中 | Ops Agent 健康检查，超时自动重启或升级 |
| 新员工对 AI 引导抵触 | 低 | 中 | 保持人类导师和经理的关键介入点，AI 是辅助而非替代 |
| 隐私顾虑（被动信号采集） | 中 | 高 | 明确告知采集范围，仅采集工作相关信号，数据仅 HR 可见 |
| 跨部门协作不畅 | 高 | 高 | Orchestrator 升级机制 + HR 作为最终协调人 |&lt;/p&gt;
&lt;h3&gt;13.3 成功度量&lt;/h3&gt;
&lt;p&gt;| 指标 | 基线 | 3 个月目标 | 6 个月目标 |
|------|------|-----------|-----------|
| 90 天转正率 | 85% | 92% | 95% |
| 平均 ramp-up 天数 | 45 天 | 35 天 | 28 天 |
| 首周任务完成率 | 70% | 85% | 90% |
| 30 天体验分数 | 68 | 75 | 80 |
| 90 天 NPS | 30 | 45 | 55 |
| HR 人工介入时长/人 | 8h | 4h | 2h |
| 知识库 FAQ 自助解决率 | 30% | 60% | 75% |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;附录 A: Agent SOUL.md 模板汇总&lt;/h2&gt;
&lt;h3&gt;Pre-boarding Agent&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# SOUL.md — Pre-boarding Agent

我是入职前准备专员。我的职责是确保每位新员工在报到前一切就绪。

## 职责范围
- 根据岗位规格生成个性化准备清单
- 逐项派发任务给 IT/行政/HR/用人经理
- 定时检查进度，标记逾期，自动催办
- 生成《入职准备就绪报告》

## 决策边界
- 清单内容基于岗位规格模板，不自行添加或删除项目
- 逾期项先催办，D-2 仍逾期才升级到 HR
- 设备/账号的具体配置由 IT 决定，我只跟踪状态

## 交接格式
完成后向 Orchestrator 报告:
1. 准备清单总项数和完成数
2. 逾期/风险项列表（含原因和当前状态）
3. 就绪报告路径
4. 首日需要注意的风险提示
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Knowledge Agent&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# SOUL.md — Knowledge Agent

我是新员工的 7×24 问答助手。我的目标是让新员工的问题在 30 秒内得到响应。

## 职责范围
- 基于知识库回答新员工问题
- 无法回答的问题路由到正确的人
- 记录所有问答，识别知识缺口
- 持续优化知识库

## 决策边界
- 只回答知识库覆盖范围内的问题，不编造答案
- 置信度 &amp;#x3C; 0.5 的问题必须路由到人，不猜测
- 检测到新员工情绪负面信号 → 立即通知导师
- 涉及薪资/合同等敏感问题 → 路由到 HR

## 响应原则
- 事实型问题: 直接回答 + 来源链接
- 流程型问题: 分步骤回答 + 文档链接
- 技术型问题: 概念解释 + 代码示例 + 文档链接
- 找人型问题: 直接告知负责人 + 联系方式
- 超范围问题: &quot;这个问题我需要帮你转给 XXX，已通知 Ta&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Experience Surveyor Agent&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# SOUL.md — Experience Surveyor Agent

我是入职体验调研员。我的目标是在新员工&quot;用脚投票&quot;之前发现问题。

## 职责范围
- 在关键触点投放脉冲调研
- 持续采集被动信号，计算体验分数
- 识别预警信号，触发分级响应
- 生成阶段性和全周期体验报告

## 决策边界
- 调研内容基于模板，不自行设计新题目（需 Orchestrator 批准）
- 预警分级严格按阈值执行，不主观判断
- 红色预警必须立即通知 HR，不延迟
- 体验数据仅 HR 和用人经理可见，不向其他新员工暴露

## 分析原则
- 趋势比绝对值更重要（连续下降比单次低分更危险）
- 主动调研和被动信号交叉验证
- 开放式反馈的文本分析重点关注情绪词和风险信号词
- 每次预警都附带上下文，不只是分数
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;附录 B: 岗位入职规格模板示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# 工程师入职规格

## 岗位信息
- 岗位序列: 研发
- 技术栈: {根据具体团队填充}
- 直接上级: {team_lead}
- 导师要求: 同技术栈，司龄 1-3 年

## 入职前准备
### IT 账号
- 企业邮箱
- VPN 账号
- GitLab 账号（需指定 group 权限）
- Jira 账号（需指定项目权限）
- Confluence 账号（需指定空间权限）
- CI/CD 系统账号
- 日志系统账号
- 监控系统账号

### IT 设备
- 笔记本电脑（MacBook Pro / ThinkPad，按团队标准）
- 外接显示器 × 2
- 机械键盘 + 鼠标
- Docking station
- 耳机

### 系统权限
- 代码仓库: {repo_list} 的 read/write 权限
- 测试环境: {test_env} 访问权限
- 生产环境: 仅 read 权限（转正后申请 write）

## 首日引导
### 系统配置（09:30-10:30）
- 配置 SSH key
- 配置 Git 全局配置
- Clone 主仓库
- 安装依赖
- 本地构建验证

### 环境探索（15:00-16:00）
- 阅读项目 README
- 阅读 CONTRIBUTING.md
- 阅读技术架构文档
- 跑通本地开发环境
- 标记待学习文档

## 首周任务
（见模块三 5.4 节工程师模板）

## 30-60-90 天里程碑
（见模块四 6.2 节，根据具体技术栈调整目标）

## 知识库优先阅读
- 团队编码规范
- Git 工作流指南
- CI/CD 流程文档
- 代码评审规范
- 技术架构概览
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;附录 C: 决策日志模板&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# Decision: 导师匹配算法权重调整

**Date:** 2026-08-14
**Author:** Orchestrator
**Status:** Accepted
**Task:** #MEN-001

## Context
试点期间发现，技术栈匹配权重过高导致部分新员工匹配到性格不合的导师，
1-on-1 取消率上升 15%。

## Options Considered
1. 降低技术栈权重，提高性格互补权重 — 更注重沟通体验
2. 维持现状，增加试用期机制 — 允许 2 周后更换导师
3. 引入导师自荐机制 — 让导师主动选择新员工

## Decision
选择方案 1。将技术栈权重从 35% 降至 30%，性格互补权重从 10% 提至 15%。
同时保留方案 2 的试用期机制作为兜底。

## Consequences
- 匹配算法需要重新运行
- 现有匹配关系不受影响（仅对新匹配生效）
- 需要更新 Mentor Match Agent 的 SOUL.md
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;文档结束&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本系统设计基于 Agent Team Orchestration 范式，将新员工入职引导分解为 7 个功能模块，由 9 个协作 Agent 执行，通过统一的任务生命周期管理和共享数据层实现端到端可追溯。系统设计遵循第一性原理：从&quot;高不确定性&quot;到&quot;高生产力&quot;的状态转换路径上，消除环境摩擦、路径模糊、任务失焦、成长无坐标、信息不对称、人际孤立和反馈滞后七类障碍。&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>从零搭建：Astro 博客 + GitHub Actions + 腾讯云 COS/CDN 自动化部署全记录</title><link>https://blog.zdzy.xyz/blog/build-blog-astro-cos-cdn</link><guid isPermaLink="true">https://blog.zdzy.xyz/blog/build-blog-astro-cos-cdn</guid><description>一篇讲清楚博客怎么搭、主题怎么配、部署怎么自动化，以及背后每一层原理的文章——包含 CAM 权限模型、COS 请求签名、CDN 回源语义、CI 假绿防护等一手踩坑实录。</description><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;你正在读的这篇文章，本身就是它所描述的部署链路的产物：我在本地写下这段 Markdown，&lt;code&gt;git push&lt;/code&gt; 之后，GitHub Actions 构建出静态页面，上传到腾讯云 COS 私有桶，由 CDN 分发到你现在访问的域名。整个过程没有任何一步手工操作。&lt;/p&gt;
&lt;p&gt;这篇文章完整记录这条链路的搭建方法与背后原理，包括我在排障中踩过的每一个坑——它们大多不是「搜索一下就能解决」的问题，而是需要理解系统内部机制才能定位的深水区。&lt;/p&gt;
&lt;h2&gt;0. 成果先看&lt;/h2&gt;
&lt;p&gt;一句话架构：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;git push → GitHub Actions（构建 + 验证）→ coscli 上传 COS → tccli 刷新 CDN 缓存 → 域名分发&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;| 组件 | 职责 | 月成本 |
|---|---|---|
| GitHub 私有仓库 | 源码托管、版本控制 | 免费 |
| GitHub Actions | 构建引擎、部署执行器 | 免费（公开仓库无限，私有仓库有额度） |
| 腾讯云 COS | 对象存储（私有桶） | &amp;#x3C; 1 元（按存储量 + 请求计费） |
| 腾讯云 CDN | 边缘分发、HTTPS、缓存 | ~1 元（个人博客流量级） |
| 域名 + 备案 | 唯一的固定支出 | 域名年付，备案免费 |&lt;/p&gt;
&lt;p&gt;总计月成本 5 元以内，换来的是完全的数据主权：源码、构建过程、产物、分发全部自己可控。&lt;/p&gt;
&lt;h2&gt;1. 选型：从本质出发&lt;/h2&gt;
&lt;h3&gt;1.1 静态博客的本质&lt;/h3&gt;
&lt;p&gt;先把问题还原到第一性原理：&lt;strong&gt;博客是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;剥掉所有动态特性，博客的核心是「内容 → 页面」的映射。内容是 Markdown，页面是 HTML，中间需要一个转换器。这个转换发生在&lt;strong&gt;什么时刻&lt;/strong&gt;，决定了整个架构：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;运行时转换&lt;/strong&gt;（WordPress、动态 SSR）：每次请求都执行转换。需要常驻服务、数据库、进程守护。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建时转换&lt;/strong&gt;（静态站点生成器）：转换在发布时一次性完成，运行时只剩「读取文件 → 返回」。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对个人博客而言，内容更新的频率是「天」，读者访问的频率是「次/秒」。用运行时计算服务一个构建时就能解决的问题，是资源错配。所以选静态生成器，剩下的全部问题就是：&lt;strong&gt;生成的 HTML 放哪里、怎么分发&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;1.2 托管方案对比&lt;/h3&gt;
&lt;p&gt;| 方案 | 国内可达性 | 备案要求 | 控制权 | 成本 |
|---|---|---|---|---|
| Vercel / Netlify | 不稳定（部分线路被墙） | 无需 | 低（平台绑定） | 免费额度内免费 |
| Cloudflare Pages | 尚可 | 无需 | 低 | 免费 |
| GitHub Pages | 一般 | 无需 | 中 | 免费 |
| &lt;strong&gt;COS + CDN&lt;/strong&gt; | &lt;strong&gt;好（国内边缘节点）&lt;/strong&gt; | &lt;strong&gt;需要 ICP&lt;/strong&gt; | &lt;strong&gt;高（对象层可控）&lt;/strong&gt; | &lt;strong&gt;&amp;#x3C; 5 元/月&lt;/strong&gt; |&lt;/p&gt;
&lt;p&gt;三个前提决定了我选 COS + CDN：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;读者主要在国内&lt;/strong&gt;，海外边缘节点的延迟和可达性不可控；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;域名要备案&lt;/strong&gt;才能绑国内 CDN，而备案本身要求接入商与云厂商绑定（备案接入商是腾讯云，域名就直接用腾讯云 CDN，避免跨平台排障）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;我想要对象层控制权&lt;/strong&gt;——能直接对产物文件做验证、签名请求、精细 ACL，而不是被平台 API 抽象遮住。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;2. 博客搭建&lt;/h2&gt;
&lt;h3&gt;2.1 初始化&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 基于 astro-theme-pure 主题初始化（详见主题官方文档）
npm create astro@latest -- --template cworld1/astro-theme-pure
npm install
npm run dev  # http://localhost:4321
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;两个关键配置（&lt;code&gt;astro.config.ts&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;export default defineConfig({
  site: &apos;https://blog.zdzy.xyz&apos;,  // 站点绝对地址
  // output 默认即 &apos;static&apos;
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;site&lt;/code&gt; 看似不起眼，实际影响一串下游行为：canonical URL、sitemap 生成、RSS 输出、OG 链接。&lt;strong&gt;域名变更时第一件事就是改它&lt;/strong&gt;——我在部署时因为主域与子域切换，把这个值连带六处引用一起改掉。&lt;/p&gt;
&lt;h3&gt;2.2 主题配置的边界感&lt;/h3&gt;
&lt;p&gt;astro-theme-pure 的个性化入口集中在 &lt;code&gt;src/site.config.ts&lt;/code&gt;。我的原则是&lt;strong&gt;只动配置层，不动核心代码&lt;/strong&gt;，这保证了后续跟随主题升级的成本最小化：&lt;/p&gt;
&lt;p&gt;| 配置项 | 我的值 | 说明 |
|---|---|---|
| &lt;code&gt;title&lt;/code&gt; / &lt;code&gt;author&lt;/code&gt; / &lt;code&gt;description&lt;/code&gt; | 个性化 | 全站元信息 |
| &lt;code&gt;footer.icp&lt;/code&gt; | 备案号 + 工信部链接 | 国内站合规要求 |
| &lt;code&gt;social.github&lt;/code&gt; | 自己的 GitHub | 作者信息 |
| &lt;code&gt;waline.enable&lt;/code&gt; | &lt;code&gt;false&lt;/code&gt; | &lt;strong&gt;见下方「依赖审计」&lt;/strong&gt; |&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;依赖审计是主题二开最容易忽略的一步。&lt;/strong&gt; 这个主题默认集成了 Waline 评论系统，配置指向的是&lt;strong&gt;主题作者自己的演示服务器&lt;/strong&gt;——意味着你不改配置，读者的评论数据会发到陌生人的服务器上。第三方默认配置必须在上线前逐项过一遍：要么关闭，要么指向自己部署的实例。&lt;/p&gt;
&lt;p&gt;另一个类似问题：友链头像、示例文章配图默认引用外部图床。构建产物依赖外部资源 = 部署不可重复。我把所有引用资源下载到 &lt;code&gt;public/&lt;/code&gt; 本地化，构建从「依赖外部服务的拼装」变成「完全自包含的转换」。&lt;/p&gt;
&lt;h2&gt;3. 自动化部署设计&lt;/h2&gt;
&lt;p&gt;这是整篇文章的核心。先看完整 workflow，再逐层拆解。&lt;/p&gt;
&lt;h3&gt;3.1 分阶段开关：解决「初始化期必红」问题&lt;/h3&gt;
&lt;p&gt;一个现实矛盾：workflow 文件要随源码进仓库，但部署依赖的外部资源（云密钥、COS 桶、CDN 域名）&lt;strong&gt;还没准备好&lt;/strong&gt;。如果 workflow 无条件执行，初始化阶段的每次 push 都会产生红色失败——噪音会淹没真实的信号。&lt;/p&gt;
&lt;p&gt;解法是把「部署就绪」做成显式开关，用 GitHub &lt;strong&gt;Variables&lt;/strong&gt;（非 Secrets）承载：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;jobs:
  deploy:
    # 阶段开关 1：桶、密钥、Variables 都配好后设 DEPLOY_READY=true
    if: ${{ vars.DEPLOY_READY == &apos;true&apos; }}
    steps:
      # ... 构建上传 ...
      # 阶段开关 2：CDN 域名上线、回源配置完成后设 CDN_LIVE=true
      - name: Purge CDN cache
        if: ${{ vars.CDN_LIVE == &apos;true&apos; }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;两级开关把部署生命周期切成三个阶段：&lt;strong&gt;CI 骨架验证&lt;/strong&gt;（两开关全关，run 显示 skipped，9 秒结束，无红色失败）→ &lt;strong&gt;对象上传验证&lt;/strong&gt;（DEPLOY_READY 开，产物真实落桶）→ &lt;strong&gt;全链路&lt;/strong&gt;（CDN_LIVE 开，缓存刷新上线）。&lt;/p&gt;
&lt;p&gt;顺带说清 Secrets 与 Variables 的边界——很多教程混用，但语义完全不同：&lt;/p&gt;
&lt;p&gt;| | Secrets | Variables |
|---|---|---|
| 内容可见性 | 写入后不可读，日志中自动打码 | 明文可读 |
| 用途 | 凭据（API Key） | 配置（bucket 名、region、开关） |
| 安全模型 | 假设可能泄露，最小化暴露面 | 公开无害 |&lt;/p&gt;
&lt;p&gt;我的实践：&lt;code&gt;TENCENT_SECRET_ID/KEY&lt;/code&gt; 进 Secrets；&lt;code&gt;COS_BUCKET&lt;/code&gt;、&lt;code&gt;COS_REGION&lt;/code&gt;、&lt;code&gt;DEPLOY_READY&lt;/code&gt;、&lt;code&gt;CDN_LIVE&lt;/code&gt; 进 Variables。&lt;/p&gt;
&lt;h3&gt;3.2 完整 Workflow&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;name: deploy

on:
  push:
    branches: [main]
  workflow_dispatch:  # 支持手动触发

jobs:
  deploy:
    runs-on: ubuntu-latest
    if: ${{ vars.DEPLOY_READY == &apos;true&apos; }}
    steps:
      - uses: actions/checkout@v7

      - uses: actions/setup-node@v7
        with:
          node-version: 22
          cache: npm

      - name: Build
        run: |
          npm ci
          npm run build

      - name: Install coscli
        run: |
          curl -fsSL -o coscli https://cosbrowser.cloud.tencent.com/software/coscli/coscli-linux
          sudo install -m 755 coscli /usr/local/bin/coscli

      - name: Configure coscli
        env:
          SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
          SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
          COS_BUCKET: ${{ vars.COS_BUCKET }}
          COS_REGION: ${{ vars.COS_REGION }}
        run: |
          {
            echo &quot;cos:&quot;
            echo &quot;  base:&quot;
            echo &quot;    secretid: ${SECRET_ID}&quot;
            echo &quot;    secretkey: ${SECRET_KEY}&quot;
            echo &quot;  buckets:&quot;
            echo &quot;    - name: ${COS_BUCKET}&quot;
            echo &quot;      alias: blog&quot;
            echo &quot;      region: ${COS_REGION}&quot;
          } &gt; &quot;$HOME/.cos.yaml&quot;

      - name: Upload dist to COS
        run: coscli sync dist/ cos://${{ vars.COS_BUCKET }}/ -r

      # 关键：显式验证，防 CI 假绿（原因见 3.3）
      - name: Verify upload
        run: |
          set -e
          LIST=$(coscli ls -r cos://${{ vars.COS_BUCKET }}/)
          COUNT=$(echo &quot;$LIST&quot; | grep -c .)
          echo &quot;uploaded objects: $COUNT&quot;
          echo &quot;$LIST&quot; | grep -q &quot;index.html&quot; || { echo &quot;::error::index.html missing in bucket&quot;; exit 1; }
          echo &quot;$LIST&quot; | grep -q &quot;404.html&quot; || { echo &quot;::error::404.html missing in bucket&quot;; exit 1; }
          if [ &quot;$COUNT&quot; -lt 100 ]; then echo &quot;::error::too few objects ($COUNT &amp;#x3C; 100)&quot;; exit 1; fi
          echo &quot;upload verified: $COUNT objects, index.html + 404.html present&quot;

      - name: Purge CDN cache
        if: ${{ vars.CDN_LIVE == &apos;true&apos; }}
        env:
          TENCENTCLOUD_SECRET_ID: ${{ secrets.TENCENT_SECRET_ID }}
          TENCENTCLOUD_SECRET_KEY: ${{ secrets.TENCENT_SECRET_KEY }}
        run: |
          pip install tccli
          echo &apos;{&quot;Urls&quot;:[&quot;https://blog.zdzy.xyz/&quot;]}&apos; &gt; purge.json
          tccli cdn PurgeUrlsCache --cli-input-json file://purge.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;几个容易被文档坑掉的设计细节：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置文件用 echo 逐行写，不用 heredoc。&lt;/strong&gt; GitHub Actions 的 &lt;code&gt;run: |&lt;/code&gt; 块内所有行天然带基础缩进，而 heredoc 会把缩进原样写入文件——结果 YAML 顶层 key 带缩进、结束符 &lt;code&gt;EOF&lt;/code&gt; 不在行首。产物是一个语法上就错误的配置文件，而且 &lt;code&gt;cat &gt;&lt;/code&gt; 本身退出码是 0，步骤照样绿。echo 逐行拼接虽然啰嗦，但每一行都明确可控。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;coscli 配置文件路径是 &lt;code&gt;~/.cos.yaml&lt;/code&gt;，不是 &lt;code&gt;~/.coscli.yaml&lt;/code&gt;。&lt;/strong&gt; 写错路径的后果极具迷惑性：coscli 找不到配置，触发&lt;strong&gt;交互式初始化向导&lt;/strong&gt;，在 CI 的非交互终端里所有输入都是空，最终生成一个空配置文件——endpoint 为空，DNS 解析 &lt;code&gt;bucket.&lt;/code&gt;（空域名）失败。整条失败链路上没有任何一行日志提到「配置文件路径不对」。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tccli 凭据走环境变量。&lt;/strong&gt; &lt;code&gt;TENCENTCLOUD_SECRET_ID&lt;/code&gt; / &lt;code&gt;TENCENTCLOUD_SECRET_KEY&lt;/code&gt;（注意带下划线），优先级高于配置文件，密钥不落盘到 runner。&lt;/p&gt;
&lt;h3&gt;3.3 CI 假绿：最危险的一类失败&lt;/h3&gt;
&lt;p&gt;我在这条链路上遇到的最阴险的问题：&lt;code&gt;coscli sync&lt;/code&gt; &lt;strong&gt;逐文件报错但整体退出码为 0&lt;/strong&gt;。CI 显示绿色通过，实际上传了一个文件都没有。&lt;/p&gt;
&lt;p&gt;这不是 coscli 独有的问题，而是所有「聚合器命令」的通病：命令内部循环处理子任务，子任务失败只记日志，不冒泡退出码。防御手段只有一个——&lt;strong&gt;不要信任聚合器的成功，信任你验证过的状态&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;- name: Verify upload
  run: |
    LIST=$(coscli ls -r cos://bucket/)
    COUNT=$(echo &quot;$LIST&quot; | grep -c .)
    echo &quot;$LIST&quot; | grep -q &quot;index.html&quot; || exit 1  # 关键对象存在性
    [ &quot;$COUNT&quot; -lt 100 ] &amp;#x26;&amp;#x26; exit 1                  # 数量下限断言
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证步骤让「假绿」无处藏身：上传失败必然表现为 Verify 步骤红色失败，而红色失败是可定位的，静默失败不是。&lt;strong&gt;CI 的价值不在「绿」，在于失败时的信号质量。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;4. 原理篇&lt;/h2&gt;
&lt;p&gt;方法讲完了，下面是支撑这些方法（以及排障）的原理。&lt;/p&gt;
&lt;h3&gt;4.1 coscli sync 的增量对比&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;sync&lt;/code&gt; 不是盲目全量上传。对每个本地文件，它先对远端同名对象发 &lt;code&gt;HEAD&lt;/code&gt; 请求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;远端不存在 → 上传；&lt;/li&gt;
&lt;li&gt;远端存在 → 对比大小与修改时间（或 ETag），一致则跳过，不一致则上传。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就是为什么首次部署要 9 分钟（226 个对象全量上传），后续部署只要几十秒（绝大多数 HEAD 命中后跳过）。理解这个机制还有一个排障价值：如果你的 CAM 策略漏了 &lt;code&gt;cos:HeadObject&lt;/code&gt;，sync 的对比环节会全部失败，行为退化为「每个文件都当不存在直接上传」——能跑通，但每次都是全量，且日志里会有大量 HEAD 权限错误。&lt;strong&gt;一个权限缺失不一定让流程挂掉，可能只是让它悄悄变慢&lt;/strong&gt;，这类「降级成功」比直接失败更难察觉。&lt;/p&gt;
&lt;h3&gt;4.2 COS XML API 的请求签名&lt;/h3&gt;
&lt;p&gt;所有对 COS 的请求都要带 &lt;code&gt;Authorization&lt;/code&gt; 头。CI 里的 coscli、排障时的 curl、任何自定义脚本，走的都是同一套签名算法。理解它，你就能在没有 SDK 的环境里直接跟 COS 对话（我在排障权限问题时用 40 行 Python 标准库手写了签名，不装任何依赖）。&lt;/p&gt;
&lt;p&gt;签名计算链：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;KeyTime      = &amp;#x3C;起&gt;;&amp;#x3C;止&gt;                          # Unix 时间戳区间
SignKey      = HmacSHA1(SecretKey, KeyTime)       # 十六进制输出
HttpString   = &amp;#x3C;method小写&gt;\n&amp;#x3C;uri&gt;\n&amp;#x3C;params&gt;\n&amp;#x3C;headers&gt;\n
StringToSign = &quot;sha1\n&quot; + KeyTime + &quot;\n&quot; + SHA1(HttpString) + &quot;\n&quot;
Signature    = HmacSHA1(SignKey, StringToSign)

Authorization = q-sign-algorithm=sha1&amp;#x26;q-ak=&amp;#x3C;SecretId&gt;
              &amp;#x26;q-sign-time=&amp;#x3C;KeyTime&gt;&amp;#x26;q-key-time=&amp;#x3C;KeyTime&gt;
              &amp;#x26;q-header-list=&amp;#x3C;参与签名的header键&gt;&amp;#x26;q-url-param-list=&amp;#x3C;参数键&gt;
              &amp;#x26;q-signature=&amp;#x3C;Signature&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;两个实操要点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;HTTP 方法大写发送，签名里小写&lt;/strong&gt;。我用错大小写时返回 &lt;code&gt;SignatureDoesNotMatch&lt;/code&gt;，改成小写后立刻变成 &lt;code&gt;AccessDenied&lt;/code&gt;——同一个 403，两种完全不同的含义。&lt;/li&gt;
&lt;li&gt;这个「两态对照」是排障利器：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;| 响应 | 含义 | 结论 |
|---|---|---|
| &lt;code&gt;SignatureDoesNotMatch&lt;/code&gt; | 签名验证失败 | 服务器还没看你的权限——先修签名 |
| &lt;code&gt;AccessDenied&lt;/code&gt; | 签名通过，CAM 拒绝 | 密钥有效、身份已识别，问题在权限策略 |&lt;/p&gt;
&lt;p&gt;我在验证子账号权限时，就是靠这个对照把「密钥问题」和「策略问题」干净地切开的。&lt;/p&gt;
&lt;h3&gt;4.3 CAM 权限模型与最小权限&lt;/h3&gt;
&lt;p&gt;给 CI 的密钥应该是&lt;strong&gt;专用子账号&lt;/strong&gt;，且只授予部署所需的最小权限。我的策略（已实测验证）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;version&quot;: &quot;2.0&quot;,
  &quot;statement&quot;: [
    {
      &quot;effect&quot;: &quot;allow&quot;,
      &quot;action&quot;: [
        &quot;cos:GetBucket&quot;,
        &quot;cos:HeadObject&quot;,
        &quot;cos:GetObject&quot;,
        &quot;cos:PutObject&quot;
      ],
      &quot;resource&quot;: [
        &quot;qcs::cos:ap-shanghai:uid/1256237186:blog-1256237186/*&quot;
      ]
    },
    {
      &quot;effect&quot;: &quot;allow&quot;,
      &quot;action&quot;: [&quot;cdn:PurgeUrlsCache&quot;],
      &quot;resource&quot;: [&quot;*&quot;]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;resource 的六段式语法拆解：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;qcs : cos : ap-shanghai : uid/1256237186 : blog-1256237186 /*
 │    │        │              │                  │         └── 对象路径（* = 全部对象）
 │    │        │              │                  └── 桶名-APPID（对象级操作必须能匹配到对象，故需 /*）
 │    │        │              └── 主账号 APPID
 │    │        └── 地域
 │    └── 产品
 └── 腾讯云资源描述前缀
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;两个设计决策：&lt;strong&gt;不给 &lt;code&gt;DeleteObject&lt;/code&gt;&lt;/strong&gt;（sync 不带 &lt;code&gt;--delete&lt;/code&gt;，桶内对象只增不删，误操作无法波及存量——代价是测试文件会残留）；&lt;strong&gt;不给 &lt;code&gt;PutObjectACL&lt;/code&gt;&lt;/strong&gt;（CI 不需要改对象 ACL；CDN 访问私有桶走的是下一节讲的回源鉴权，与子账号无关）。&lt;/p&gt;
&lt;p&gt;这里有个真实的教训：我最初拿到的策略把 resource 写成了 &lt;code&gt;qcs::cos::uid/1256237186:${bucket-appid}/blog-1256237186&lt;/code&gt;——&lt;code&gt;${bucket-appid}&lt;/code&gt; 是控制台模板里&lt;strong&gt;未替换的占位符&lt;/strong&gt;，CAM 不做变量插值，它就是一段字面文本，匹配不到任何真实资源。结果是策略声称 allow 的全部操作实测 403。&lt;strong&gt;权限策略的「写了」和「生效了」是两回事，验证手段只有实测。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;4.4 CDN 请求生命周期&lt;/h3&gt;
&lt;p&gt;理解 CDN 最好的模型是把每个请求分成两段：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;客户端 ──①──&gt; CDN 边缘节点 ──②──&gt; 回源源站（COS）
         &amp;#x3C;──────①&apos;──────── &amp;#x3C;──────②&apos;──
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第 ① 段&lt;/strong&gt;的决策：边缘节点查本地缓存。命中直接返回（&lt;code&gt;X-Cache-Lookup: Hit&lt;/code&gt;，延迟 ~0.1s）；未命中走第 ② 段回源拉取（&lt;code&gt;Cache Miss&lt;/code&gt;）。URL 鉴权（防盗链）也发生在这段——开了它，裸 URL 在边缘就被拒，&lt;strong&gt;请求根本不会回源&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第 ② 段&lt;/strong&gt;的关键参数是「回源 Host」——它决定了 COS 如何解释这个请求，这里有一个语义分叉，是我踩过最深的一个坑：&lt;/p&gt;
&lt;p&gt;| 回源 Host | &lt;code&gt;GET /&lt;/code&gt; 的语义 | 效果 |
|---|---|---|
| 桶的&lt;strong&gt;默认域名&lt;/strong&gt;（&lt;code&gt;&amp;#x3C;bucket&gt;.cos.&amp;#x3C;region&gt;.myqcloud.com&lt;/code&gt;） | &lt;strong&gt;ListBucket&lt;/strong&gt;（列桶 API） | 匿名/无权限 → 403 |
| 桶的&lt;strong&gt;静态网站域名&lt;/strong&gt;（&lt;code&gt;&amp;#x3C;bucket&gt;.cos-website.&amp;#x3C;region&gt;.myqcloud.com&lt;/code&gt;） | 映射到 &lt;code&gt;index.html&lt;/code&gt; | 返回首页 |&lt;/p&gt;
&lt;p&gt;同一个 URL，回源 Host 不同，COS 看到的是两个完全不同的 API 调用。我的博客一度出现诡异状态：&lt;code&gt;/index.html&lt;/code&gt; 正常 200，裸域名 &lt;code&gt;/&lt;/code&gt; 403——因为回源鉴权已生效（对象能拉到），但回源 Host 指向默认域名，&lt;code&gt;/&lt;/code&gt; 被当成列桶请求拒掉了。&lt;/p&gt;
&lt;p&gt;修复路径：COS 桶 → 基础配置 → &lt;strong&gt;静态网站&lt;/strong&gt;（开启，索引文档 &lt;code&gt;index.html&lt;/code&gt;，错误文档 &lt;code&gt;404.html&lt;/code&gt;），再把 CDN 域名的源站切到静态网站源站。这个配置同时解决了三件事：&lt;code&gt;/&lt;/code&gt; 映射首页、目录 URL（&lt;code&gt;/blog/&lt;/code&gt;）映射目录内 index、404 返回自定义错误页而不是 COS 的 XML。&lt;/p&gt;
&lt;h3&gt;4.5 私有桶 + CDN 的权限链&lt;/h3&gt;
&lt;p&gt;桶是私有的（拒绝一切匿名访问），但读者访问博客不需要任何凭证——因为权限链在另一端：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;CDN 边缘节点回源时，以「CDN 服务身份」访问 COS
        ↓
COS 检查回源鉴权授权（COS 侧开关，开启时自动创建 CDN 服务角色）
        ↓
授权范围 = 该桶的对象读取
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;三个开关必须同时正确，缺一不可，且&lt;strong&gt;每个开关配错都会产生特征不同的 403&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;| 配置错误 | 403 特征 | 定位方法 |
|---|---|---|
| URL 鉴权（防盗链）开着 | &lt;code&gt;Server: SLT&lt;/code&gt;，&lt;code&gt;X-Cache-Lookup: Return Directly&lt;/code&gt;，&lt;strong&gt;空响应体&lt;/strong&gt; | 响应头三件套，请求未回源 |
| 回源鉴权没开 | &lt;code&gt;X-Cache-Lookup: Cache Miss&lt;/code&gt;，&lt;strong&gt;COS 的 XML&lt;/strong&gt; &lt;code&gt;AccessDenied&lt;/code&gt; | 已回源，COS 拒绝匿名身份 |
| 回源 Host 用了默认域名 | 对象路径 200，&lt;code&gt;/&lt;/code&gt; 返回 XML 403（ListBucket 语义） | 对象级路径测试对照 |&lt;/p&gt;
&lt;p&gt;最后一张表就是我的「CDN 403 三层定位法」——排障时先抓响应头判断请求死在哪一段，再对症下药，避免在控制台里乱翻配置。&lt;/p&gt;
&lt;h3&gt;4.6 tccli 的参数方言&lt;/h3&gt;
&lt;p&gt;CDN 缓存刷新用 tccli（腾讯云官方 CLI）。它和文档印象之间的偏差之多，值得一节单独记录：&lt;/p&gt;
&lt;p&gt;| 尝试 | 结果 |
|---|---|
| &lt;code&gt;tccli configure set --secretId xxx&lt;/code&gt; | 报错要位置参数：&lt;code&gt;configure set secretId xxx&lt;/code&gt; |
| 环境变量 &lt;code&gt;TENCENTCLOUD_SECRETID&lt;/code&gt; | 无效——正确名是 &lt;code&gt;TENCENTCLOUD_SECRET_ID&lt;/code&gt;（带下划线） |
| &lt;code&gt;--Urls.0 https://...&lt;/code&gt; 数组索引 | 无效——点号展开需显式 &lt;code&gt;--cli-unfold-argument&lt;/code&gt; 开关 |
| &lt;code&gt;--cli-input-json &apos;{&quot;Urls&quot;:[...]}&apos;&lt;/code&gt; 内联 JSON | 无效——强制 &lt;code&gt;file://&lt;/code&gt; 前缀只认文件 |&lt;/p&gt;
&lt;p&gt;最终可靠组合：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &apos;{&quot;Urls&quot;:[&quot;https://blog.zdzy.xyz/&quot;]}&apos; &gt; purge.json
tccli cdn PurgeUrlsCache --cli-input-json file://purge.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;方法论上的教训：当工具连续两次行为与预期不符，&lt;strong&gt;停止试错，直接读源码&lt;/strong&gt;（&lt;code&gt;pip download tccli --no-deps&lt;/code&gt; 解包 grep，两分钟定位全部四个问题）。API 之上的 CLI 封装层是方言高发区，源码是唯一没有歧义的文档。&lt;/p&gt;
&lt;h2&gt;5. 结语&lt;/h2&gt;
&lt;p&gt;回看整条链路，方法论比工具链更值得记录：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;分阶段开关&lt;/strong&gt;：把部署拆成可独立验证的阶段，让每个阶段失败时都能给出干净的信号；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不信任聚合器的退出码&lt;/strong&gt;：验证你关心的状态本身，而不是命令的返回值；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限写完必须实测&lt;/strong&gt;：策略文本和生效语义之间隔着模板变量、语法结构、隐藏默认值三层坑；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;排障先分层&lt;/strong&gt;：一个 403 背后是「边缘拒绝/回源被拒/源站语义」三种完全不同的故障，响应头特征先于一切猜测；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI 行为存疑时读源码&lt;/strong&gt;：文档描述的是意图，源码描述的是行为。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;整套方案的月成本不超过 5 元，构建一次 2 分半，增量部署几十秒。这是静态博客该有的样子：复杂度一次性付清，之后只剩写字。&lt;/p&gt;
&lt;p&gt;博客上线了，后面的路还长：评论区自建、图床、写作工作流……这些等做成之后再写续篇。&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Tips to improve concentration</title><link>https://blog.zdzy.xyz/blog/improve-concentration</link><guid isPermaLink="true">https://blog.zdzy.xyz/blog/improve-concentration</guid><description>Mindfulness, cognitive training, and a healthy lifestyle may help sharpen your focus.</description><pubDate>Fri, 09 May 2025 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import { Aside } from &apos;astro-pure/user&apos;&lt;/p&gt;
&lt;p&gt;You&apos;re trying to concentrate, but your mind is wandering or you&apos;re easily distracted. What happened to the laser-sharp focus you once enjoyed? As we age, we tend to have more difficulty filtering out stimuli that are not relevant to the task at hand.&lt;/p&gt;
&lt;h2&gt;What&apos;s fogging up focus?&lt;/h2&gt;
&lt;p&gt;Like a computer that slows with use, the brain accumulates wear and tear that affects processing. This can be caused by a number of physiological stressors such as inflammation, injury to blood vessels (especially if you have high blood pressure), the buildup of abnormal proteins, and naturally occurring brain shrinkage.&lt;/p&gt;
&lt;p&gt;The following factors can also affect your concentration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Underlying conditions.&lt;/strong&gt; Depression or sleep disorders (such as sleep apnea) can undermine your ability to concentrate. So can the effects of vision or hearing loss. You waste precious cognitive resources when you spend too much time trying to make out what&apos;s written on a page or just hear what someone is saying.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Medication side effects.&lt;/strong&gt; Some drugs, especially anticholinergics (such as treatments for incontinence, depression, or allergies), can slow processing speed and your ability to think clearly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Excessive drinking.&lt;/strong&gt; Having too much alcohol impairs thinking and causes interrupted sleep, which affects concentration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Information overload.&lt;/strong&gt; We are bombarded with information from TVs, computers, and messages such as texts or emails. When there&apos;s too much material, it burdens our filtering system and it&apos;s easy to get distracted.&lt;/p&gt;
&lt;h2&gt;Strategies to stay focused&lt;/h2&gt;
&lt;p&gt;To improve attention, consider the following strategies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mindfulness.&lt;/strong&gt; &quot;Mindfulness is about focusing attention on the present moment, and practicing mindfulness has been shown to rewire the brain so that attention is stronger in everyday life,&quot; says Kim Willment, a neuropsychologist with Brigham and Women&apos;s Hospital. She recommends sitting still for a few minutes each day, closing your eyes, and focusing on your breathing as well as the sounds and sensations around you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cognitive training.&lt;/strong&gt; Computerized cognitive training games aim to improve your response times and attention. Evidence that this works has been mixed. &quot;The goal of playing these games is not to get better at them, but to get better in the cognitive activities of everyday life,&quot; Willment says. &quot;But there is evidence that a person&apos;s ability to pay attention can be improved by progressively pushing the person to higher levels of performance. So if you reach a certain level of sustained attention, pushing it to the next level can help improve it, and this may translate to everyday life.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A healthier lifestyle.&lt;/strong&gt; Many aspects of a healthy lifestyle can help attention, starting with sleep and exercise. There is a direct link between exercise and cognitive ability, especially attention. When you exercise, you increase the availability of brain chemicals that promote new brain connections, reduce stress, and improve sleep. And when we sleep, we reduce stress hormones that can be harmful to the brain, and we clear out proteins that injure it.&lt;/p&gt;
&lt;p&gt;Aim for seven to eight hours of sleep each night, and 150 minutes per week of aerobic exercise, such as brisk walking.&lt;/p&gt;
&lt;p&gt;Other healthy steps to improve focus: eat a Mediterranean-style diet, which has been shown to support brain health; treat underlying conditions; and change medications that may be affecting your ability to focus.&lt;/p&gt;
&lt;p&gt;Getting older is out of your control, but healthier living is something you determine, and it may improve concentration.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Article from: &lt;a href=&quot;https://www.health.harvard.edu/mind-and-mood/tips-to-improve-concentration&quot;&gt;Harvard Health Publishing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="/_astro/thumbnail.1GZ294Dz.jpg"/><enclosure url="/_astro/thumbnail.1GZ294Dz.jpg"/><atom:updated>2025-06-11T16:00:00.000Z</atom:updated></item><item><title>Using MDX</title><link>https://blog.zdzy.xyz/blog/using-mdx</link><guid isPermaLink="true">https://blog.zdzy.xyz/blog/using-mdx</guid><description>Learning how to use MDX in Astro</description><pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This theme comes with the &lt;a href=&quot;https://docs.astro.build/en/guides/integrations-guide/mdx/&quot;&gt;@astrojs/mdx&lt;/a&gt; integration installed and configured in your &lt;code&gt;astro.config.ts&lt;/code&gt; config file. If you prefer not to use MDX, you can disable support by removing the integration from your config file.&lt;/p&gt;
&lt;h2&gt;Why MDX?&lt;/h2&gt;
&lt;p&gt;MDX is a special flavor of Markdown that supports embedded JavaScript &amp;#x26; JSX syntax. This unlocks the ability to &lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#mdx-features&quot;&gt;mix JavaScript and UI Components into your Markdown content&lt;/a&gt; for things like interactive charts or alerts.&lt;/p&gt;
&lt;p&gt;If you have existing content authored in MDX, this integration will hopefully make migrating to Astro a breeze.&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;Here is how you import and use a UI component inside of MDX.&lt;br&gt;
When you open this page in the browser, you should see the clickable button below.&lt;/p&gt;
&lt;p&gt;import { Button } from &apos;astro-pure/user&apos;&lt;/p&gt;
&lt;p&gt;Click Me&lt;/p&gt;
&lt;h2&gt;More Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mdxjs.com/docs/what-is-mdx&quot;&gt;MDX Syntax Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#markdown-and-mdx-pages&quot;&gt;Astro Usage Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;a href=&quot;https://docs.astro.build/en/reference/directives-reference/#client-directives&quot;&gt;Client Directives&lt;/a&gt; are still required to create interactive components. Otherwise, all components in your MDX will render as static HTML (no JavaScript) by default.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>What Is 3D Rendering? Complete Guide to 3D Visualization</title><link>https://blog.zdzy.xyz/blog/3d-rendering</link><guid isPermaLink="true">https://blog.zdzy.xyz/blog/3d-rendering</guid><description>3D imagery has the power to bring cinematic visions to life and help accurately plan tomorrow’s cityscapes. Here, 3D expert Ricardo Ortiz explains how it works.</description><pubDate>Sun, 09 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;3D rendering is all around us. From huge action movies to car commercials to previews of upcoming buildings or product designs, 3D visualization has become so widespread and realistic that you probably don’t even know it’s there.&lt;/p&gt;
&lt;p&gt;In this introductory piece, Chaos’ Ricardo Ortiz explains the basics of 3D rendering, from the computational methods that create imagery to the artistic techniques that create great computer-generated (CG) content and its various uses.&lt;/p&gt;
&lt;h2&gt;What is 3D Rendering?&lt;/h2&gt;
&lt;p&gt;Put simply, 3D rendering is the process of using a computer to generate a 2D image from a digital three-dimensional scene.&lt;/p&gt;
&lt;p&gt;To generate an image, specific methodologies and special software and hardware are used. Therefore, we need to understand that 3D rendering is a process—the one that builds the image.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.zdzy.xyz/_astro/nikola-arsov-still-life-interior-design-vray-3ds-max-05-930px.DoY3_oVo_alYGQ.webp&quot; alt=&quot;alt text&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Types of 3D rendering&lt;/h2&gt;
&lt;p&gt;We can create different types of rendered image; they can be realistic or non-realistic.&lt;/p&gt;
&lt;p&gt;A realistic image could be an architectural interior that looks like a photograph, a product-design image such as a piece of furniture, or an automotive rendering of a car. On the other hand, we can create a non-realistic image such as an outline-type diagram or a cartoon-style image with a traditional 2D look. Technically, we can visualize anything we can imagine.&lt;/p&gt;
&lt;h2&gt;How is 3D rendering used?&lt;/h2&gt;
&lt;p&gt;3D rendering is an essential technique for many industries including architecture, product design, advertising, video games and visual effects for film, TV and animation.&lt;/p&gt;
&lt;p&gt;In design and architecture, renders allow creative people to communicate their ideas in a clear and transparent way. A render gives them the chance to evaluate their proposals, experiment with materials, conduct studies and contextualize their designs in the real world before they are built or manufactured.&lt;/p&gt;
&lt;p&gt;For the media and entertainment industries, 3D rendering is fundamental to the creation of sequences and animations that tell stories, whether we’re watching an animated movie, a period drama, or an action sequence with explosions, ships from the future, exotic locales, or extraterrestrial creatures.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.zdzy.xyz/_astro/thanos-dd-single-image-004a.DUX4VGf-_1A3bTN.webp&quot; alt=&quot;alt text&quot;&gt;&lt;/p&gt;
&lt;p&gt;Over the past few years, the evolution of computer graphics in these industries has replaced traditional techniques. For example, special effects are being replaced by visual effects, which means stunt people no longer risk their lives in car crashes.&lt;/p&gt;
&lt;p&gt;In advertising, I would dare to say that 90% of automotive commercials are CG—or even more. In the architecture industry, many traditional techniques to create representations, such as scale models, have been replaced with photorealistic imagery to ensure we can see exactly how something will look once it’s built.&lt;/p&gt;
&lt;p&gt;Accelerating processes, reducing costs and the demand for better quality results have helped technology evolve. Hardware is more powerful than ever and the switch to CG was inevitable.&lt;/p&gt;
&lt;h2&gt;How is a 3D rendered image generated?&lt;/h2&gt;
&lt;p&gt;Two pieces of software, with different characteristics, are used to computer-generate images and animations: render engines and game engines. Render engines use a technique called ray tracing, while game engines use a technique called rasterization—and some engines mix both techniques, but we will talk about that later on.&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.DzZDiYKA.jpg"/><enclosure url="/_astro/thumbnail.DzZDiYKA.jpg"/><atom:updated>2025-02-24T00:00:00.000Z</atom:updated></item><item><title>The Impact of Technology on the Music World</title><link>https://blog.zdzy.xyz/blog/music-journey</link><guid isPermaLink="true">https://blog.zdzy.xyz/blog/music-journey</guid><description>The evolution of music is a symphony of creativity, rhythm, and technology.</description><pubDate>Sat, 30 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The evolution of music is a symphony of creativity, rhythm, and technology. From the humble beginnings of acoustic instruments to the present-day digital era, the relationship between music and technology has been transformative. In this article, we will explore the historical milestones, digital revolution, and emerging technologies that have shaped the music world. Join us on a journey through the chords of innovation as we discuss how technology has changed music.&lt;/p&gt;
&lt;h2&gt;Historical Perspective&lt;/h2&gt;
&lt;p&gt;The marriage of music and technology dates back centuries, with pivotal moments shaping the industry. The invention of the phonograph by Thomas Edison in the late 19th century marked the first time music could be recorded and replayed. Subsequent milestones, such as the electric guitar and the synthesizer, revolutionized music creation, paving the way for new genres and sounds.&lt;/p&gt;
&lt;p&gt;These technological leaps didn&apos;t merely shape the musical landscape of their time but laid a foundation for the continuous evolution of the intersection between music and technology. As artists embraced these innovations, they unlocked new avenues for creativity, paving the way for diverse sounds and genres that have become integral to the vibrant tapestry of the modern music industry. The historical perspective illuminates the symbiotic relationship between music and technology, highlighting the transformative impact that each innovation has had on the way we create, consume, and experience music.&lt;/p&gt;
&lt;h2&gt;Digital Revolution&lt;/h2&gt;
&lt;p&gt;The digital revolution has been a seismic shift in the music industry, altering how music is consumed, distributed, and produced. The transition from physical formats like CDs and vinyl to digital formats such as MP3s and streaming services has democratized access to music. The ease of streaming has transformed how listeners discover and enjoy music, challenging traditional revenue models while offering unparalleled convenience.&lt;/p&gt;
&lt;h2&gt;Technology in Music Consumption and Distribution&lt;/h2&gt;
&lt;p&gt;Streaming services have become the heartbeat of music consumption, causing a decline in traditional music stores. The accessibility of music online has reshaped distribution channels, impacting both artists and record labels. While it provides exposure to a global audience, it also poses challenges regarding fair compensation for artists. The dynamics of the industry are evolving, reflecting the intricate dance between technology and music.
Music Production and Creation&lt;/p&gt;
&lt;p&gt;The advent of digital audio workstations (DAWs), software instruments, and electronic production techniques has democratized music creation. Artists now have powerful tools at their fingertips, enabling them to experiment with sounds, collaborate remotely, and produce music independently. This technological shift has broken down barriers, allowing for a diverse array of voices to be heard in the ever-expanding realm of music.&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.Cx18cRmB.jpg"/><enclosure url="/_astro/thumbnail.Cx18cRmB.jpg"/></item><item><title>Markdown Syntax Support</title><link>https://blog.zdzy.xyz/blog/markdown</link><guid isPermaLink="true">https://blog.zdzy.xyz/blog/markdown</guid><description>Markdown is a lightweight markup language.</description><pubDate>Wed, 26 Jul 2023 08:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Basic Syntax&lt;/h2&gt;
&lt;p&gt;Markdown is a lightweight and easy-to-use syntax for styling your writing.&lt;/p&gt;
&lt;h3&gt;Headers&lt;/h3&gt;
&lt;p&gt;When the content of the article is extensive, you can use headers to segment:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# Header 1

## Header 2

## Large Header

### Small Header
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Header previews would disrupt the structure of the article, so they are not displayed here.&lt;/p&gt;
&lt;h3&gt;Bold and Italics&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;_Italic text_ and **Bold text**, together will be **_Bold Italic text_**
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Italic text&lt;/em&gt; and &lt;strong&gt;Bold text&lt;/strong&gt;, together will be &lt;strong&gt;&lt;em&gt;Bold Italic text&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Links&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;Text link [Link Name](http://link-url)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;Text link &lt;a href=&quot;http://link-url&quot;&gt;Link Name&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Inline Code&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;This is an `inline code`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;This is an &lt;code&gt;inline code&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Code Blocks&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;```js
// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  const result = fibonacci(n - 1) + fibonacci(n - 2) // [\!code --]
  return fibonacci(n - 1) + fibonacci(n - 2) // [\!code ++]
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  const result = fibonacci(n - 1) + fibonacci(n - 2) // [!code --]
  return fibonacci(n - 1) + fibonacci(n - 2) // [!code ++]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Currently using shiki as the code highlighting plugin. For supported languages, refer to &lt;a href=&quot;https://shiki.matsu.io/languages.html&quot;&gt;Shiki: Languages&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Inline Formula&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;This is an inline formula $e^{i\pi} + 1 = 0$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;This is an inline formula $e^{i\pi} + 1 = 0$&lt;/p&gt;
&lt;h3&gt;Formula Blocks&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} \, dx
$$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} , dx
$$&lt;/p&gt;
&lt;p&gt;Currently using KaTeX as the math formula plugin. For supported syntax, refer to &lt;a href=&quot;https://katex.org/docs/supported.html&quot;&gt;KaTeX Supported Functions&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Images&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![CWorld](https://gravatar.loli.net/avatar/1ffe42aa45a6b1444a786b1f32dfa8aa?s=200)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gravatar.loli.net/avatar/1ffe42aa45a6b1444a786b1f32dfa8aa?s=200&quot; alt=&quot;CWorld&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Strikethrough&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;~~Strikethrough~~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;~~Strikethrough~~&lt;/p&gt;
&lt;h3&gt;Lists&lt;/h3&gt;
&lt;p&gt;Regular unordered list&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- 1
- 2
- 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1&lt;/li&gt;
&lt;li&gt;2&lt;/li&gt;
&lt;li&gt;3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Regular ordered list&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;1. GPT-4
2. Claude Opus
3. LLaMa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GPT-4&lt;/li&gt;
&lt;li&gt;Claude Opus&lt;/li&gt;
&lt;li&gt;LLaMa&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can continue to nest syntax within lists.&lt;/p&gt;
&lt;h3&gt;Blockquotes&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&gt; Gunshot, thunder, sword rise. A scene of flowers and blood.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Gunshot, thunder, sword rise. A scene of flowers and blood.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can continue to nest syntax within blockquotes.&lt;/p&gt;
&lt;h3&gt;Line Breaks&lt;/h3&gt;
&lt;p&gt;Markdown needs a blank line to separate paragraphs.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;If you don&apos;t leave a blank line
it will be in one paragraph

First paragraph

Second paragraph
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;If you don&apos;t leave a blank line
it will be in one paragraph&lt;/p&gt;
&lt;p&gt;First paragraph&lt;/p&gt;
&lt;p&gt;Second paragraph&lt;/p&gt;
&lt;h3&gt;Separators&lt;/h3&gt;
&lt;p&gt;If you have the habit of writing separators, you can start a new line and enter three dashes &lt;code&gt;---&lt;/code&gt; or asterisks &lt;code&gt;***&lt;/code&gt;. Leave a blank line before and after when there are paragraphs:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Advanced Techniques&lt;/h2&gt;
&lt;h3&gt;Inline HTML Elements&lt;/h3&gt;
&lt;p&gt;Currently, only some inline HTML elements are supported, including &lt;code&gt;&amp;#x3C;kdb&gt; &amp;#x3C;b&gt; &amp;#x3C;i&gt; &amp;#x3C;em&gt; &amp;#x3C;sup&gt; &amp;#x3C;sub&gt; &amp;#x3C;br&gt;&lt;/code&gt;, such as&lt;/p&gt;
&lt;h4&gt;Key Display&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;Use &amp;#x3C;kbd&gt;Ctrl&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Alt&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Del&amp;#x3C;/kbd&gt; to reboot the computer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;Use Ctrl + Alt + Del to reboot the computer&lt;/p&gt;
&lt;h4&gt;Bold Italics&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;b&gt; Markdown also applies here, such as _bold_ &amp;#x3C;/b&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt; Markdown also applies here, such as &lt;em&gt;bold&lt;/em&gt; &lt;/p&gt;
&lt;h3&gt;Other HTML Writing&lt;/h3&gt;
&lt;h4&gt;Foldable Blocks&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;details&gt;&amp;#x3C;summary&gt;Click to expand&amp;#x3C;/summary&gt;It is hidden&amp;#x3C;/details&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;h3&gt;Tables&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;| Header1  | Header2  |
| -------- | -------- |
| Content1 | Content2 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;| Header1  | Header2  |
| -------- | -------- |
| Content1 | Content2 |&lt;/p&gt;
&lt;h3&gt;Footnotes&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;Use [^footnote] to add a footnote at the point of reference.

Then, at the end of the document, add the content of the footnote (it will be rendered at the end of the article by default).

[^footnote]: Here is the content of the footnote
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;Use [^footnote] to add a footnote at the point of reference.&lt;/p&gt;
&lt;p&gt;Then, at the end of the document, add the content of the footnote (it will be rendered at the end of the article by default).&lt;/p&gt;
&lt;p&gt;[^footnote]: Here is the content of the footnote&lt;/p&gt;
&lt;h3&gt;To-Do Lists&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- [ ] Incomplete task
- [x] Completed task
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Incomplete task&lt;/li&gt;
&lt;li&gt;[x] Completed task&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Symbol Escaping&lt;/h3&gt;
&lt;p&gt;If you need to use markdown symbols like _ # * in your description but don&apos;t want them to be escaped, you can add a backslash before these symbols, such as &lt;code&gt;\_&lt;/code&gt; &lt;code&gt;\#&lt;/code&gt; &lt;code&gt;\*&lt;/code&gt; to avoid it.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;\_Don&apos;t want the text here to be italic\_

\*\*Don&apos;t want the text here to be bold\*\*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Preview:&lt;/p&gt;
&lt;p&gt;_Don&apos;t want the text here to be italic_&lt;/p&gt;
&lt;p&gt;**Don&apos;t want the text here to be bold**&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Embedding Astro Components&lt;/h2&gt;
&lt;p&gt;See &lt;a href=&quot;/docs/integrations/components&quot;&gt;User Components&lt;/a&gt; and &lt;a href=&quot;/docs/integrations/advanced&quot;&gt;Advanced Components&lt;/a&gt; for details.&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.HAXFr_hw.jpg"/><enclosure url="/_astro/thumbnail.HAXFr_hw.jpg"/></item><item><title>Markdown 语法支持</title><link>https://blog.zdzy.xyz/blog/markdown-zh</link><guid isPermaLink="true">https://blog.zdzy.xyz/blog/markdown-zh</guid><description>Markdown 是一种轻量级的「标记语言」。</description><pubDate>Wed, 26 Jul 2023 08:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;基本语法&lt;/h2&gt;
&lt;p&gt;Markdown 是一种轻量级且易于使用的语法，用于为您的写作设计风格。&lt;/p&gt;
&lt;h3&gt;标题&lt;/h3&gt;
&lt;p&gt;文章内容较多时，可以用标题分段：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# 标题 1

## 标题 2

## 大标题

### 小标题
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;标题预览会打乱文章的结构，所以在此不展示。&lt;/p&gt;
&lt;h3&gt;粗斜体&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;_斜体文本_

**粗体文本**

**_粗斜体文本_**
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;斜体文本&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;粗体文本&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;粗斜体文本&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;链接&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;文字链接 [链接名称](http://链接网址)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;文字链接 &lt;a href=&quot;http://%E9%93%BE%E6%8E%A5%E7%BD%91%E5%9D%80&quot;&gt;链接名称&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;行内代码&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;这是一条 `单行代码`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;这是一条 &lt;code&gt;行内代码&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;代码块&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;```js
// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  return fibonacci(n - 1) + fibonacci(n - 2)
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  return fibonacci(n - 1) + fibonacci(n - 2)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当前使用 shiki 作为代码高亮插件，支持的语言请参考 &lt;a href=&quot;https://shiki.matsu.io/languages.html&quot;&gt;shiki / languages&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;行内公式&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;这是一条行内公式 $e^{i\pi} + 1 = 0$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;这是一条行内公式 $e^{i\pi} + 1 = 0$&lt;/p&gt;
&lt;h3&gt;公式块&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} \, dx
$$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} , dx
$$&lt;/p&gt;
&lt;p&gt;当前使用 KaTeX 作为数学公式插件，支持的语法请参考 &lt;a href=&quot;https://katex.org/docs/supported.html&quot;&gt;KaTeX Supported Functions&lt;/a&gt;。&lt;/p&gt;
&lt;h4&gt;图片&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![CWorld](https://gravatar.loli.net/avatar/1ffe42aa45a6b1444a786b1f32dfa8aa?s=200)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gravatar.loli.net/avatar/1ffe42aa45a6b1444a786b1f32dfa8aa?s=200&quot; alt=&quot;CWorld&quot;&gt;&lt;/p&gt;
&lt;h4&gt;删除线&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;~~删除线~~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;~~删除线~~&lt;/p&gt;
&lt;h3&gt;列表&lt;/h3&gt;
&lt;p&gt;普通无序列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- 1
- 2
- 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1&lt;/li&gt;
&lt;li&gt;2&lt;/li&gt;
&lt;li&gt;3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;普通有序列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;1. GPT-4
2. Claude Opus
3. LLaMa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GPT-4&lt;/li&gt;
&lt;li&gt;Claude Opus&lt;/li&gt;
&lt;li&gt;LLaMa&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;列表里可以继续嵌套语法&lt;/p&gt;
&lt;h3&gt;引用&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&gt; 枪响，雷鸣，剑起。繁花血景。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;枪响，雷鸣，剑起。繁花血景。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用里也可以继续嵌套语法。&lt;/p&gt;
&lt;h3&gt;换行&lt;/h3&gt;
&lt;p&gt;markdown 分段落是需要空一行的。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;如果不空行
就会在一段

第一段

第二段
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;如果不空行
就会在一段&lt;/p&gt;
&lt;p&gt;第一段&lt;/p&gt;
&lt;p&gt;第二段&lt;/p&gt;
&lt;h3&gt;分隔符&lt;/h3&gt;
&lt;p&gt;如果你有写分割线的习惯，可以新起一行输入三个减号&lt;code&gt;---&lt;/code&gt; 或者星号 &lt;code&gt;***&lt;/code&gt;。当前后都有段落时，请空出一行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;高级技巧&lt;/h2&gt;
&lt;h3&gt;行内 HTML 元素&lt;/h3&gt;
&lt;p&gt;目前只支持部分段内 HTML 元素效果，包括 &lt;code&gt;&amp;#x3C;kdb&gt; &amp;#x3C;b&gt; &amp;#x3C;i&gt; &amp;#x3C;em&gt; &amp;#x3C;sup&gt; &amp;#x3C;sub&gt; &amp;#x3C;br&gt;&lt;/code&gt; ，如&lt;/p&gt;
&lt;h4&gt;键位显示&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;使用 &amp;#x3C;kbd&gt;Ctrl&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Alt&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Del&amp;#x3C;/kbd&gt; 重启电脑
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;使用 Ctrl + Alt + Del 重启电脑&lt;/p&gt;
&lt;h4&gt;粗斜体&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;b&gt; Markdown 在此处同样适用，如 _加粗_ &amp;#x3C;/b&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt; Markdown 在此处同样适用，如 &lt;em&gt;加粗&lt;/em&gt; &lt;/p&gt;
&lt;h3&gt;其他 HTML 写法&lt;/h3&gt;
&lt;h4&gt;折叠块&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;details&gt;&amp;#x3C;summary&gt;点击展开&amp;#x3C;/summary&gt;它被隐藏了&amp;#x3C;/details&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;h3&gt;表格&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;| 表头1 | 表头2 |
| ----- | ----- |
| 内容1 | 内容2 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;| 表头1 | 表头2 |
| ----- | ----- |
| 内容1 | 内容2 |&lt;/p&gt;
&lt;h3&gt;注释&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;在引用的地方使用 [^注释] 来添加注释。

然后在文档的结尾，添加注释的内容（会默认于文章结尾渲染之）。

[^注释]: 这里是注释的内容
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;在引用的地方使用 &lt;a href=&quot;%E8%BF%99%E9%87%8C%E6%98%AF%E6%B3%A8%E9%87%8A%E7%9A%84%E5%86%85%E5%AE%B9&quot;&gt;^注释&lt;/a&gt; 来添加注释。&lt;/p&gt;
&lt;p&gt;然后在文档的结尾，添加注释的内容（会默认于文章结尾渲染之）。&lt;/p&gt;
&lt;h3&gt;To-Do 列表&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- [ ] 未完成的任务
- [x] 已完成的任务
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 未完成的任务&lt;/li&gt;
&lt;li&gt;[x] 已完成的任务&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;符号转义&lt;/h3&gt;
&lt;p&gt;如果你的描述中需要用到 markdown 的符号，比如 _ # * 等，但又不想它被转义，这时候可以在这些符号前加反斜杠，如 &lt;code&gt;\_&lt;/code&gt; &lt;code&gt;\#&lt;/code&gt; &lt;code&gt;\*&lt;/code&gt; 进行避免。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;\_不想这里的文本变斜体\_

\*\*不想这里的文本被加粗\*\*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;_不想这里的文本变斜体_&lt;/p&gt;
&lt;p&gt;**不想这里的文本被加粗**&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;内嵌 Astro 组件&lt;/h2&gt;
&lt;p&gt;See &lt;a href=&quot;/docs/integrations/components&quot;&gt;User Components&lt;/a&gt; and &lt;a href=&quot;/docs/integrations/advanced&quot;&gt;Advanced Components&lt;/a&gt; for details.&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.HAXFr_hw.jpg"/><enclosure url="/_astro/thumbnail.HAXFr_hw.jpg"/></item></channel></rss>