diff --git a/docs/conversation/the-loop.mdx b/docs/conversation/the-loop.mdx
index 976a57a869..5757a92ce6 100644
--- a/docs/conversation/the-loop.mdx
+++ b/docs/conversation/the-loop.mdx
@@ -13,7 +13,7 @@ Claude Code 不一样:你说一个需求,它可能连续执行十几步操
这背后的机制叫做 **Agentic Loop**(智能体循环),核心实现在 `src/query.ts` 的 `queryLoop()` 异步生成器函数(第 241 行)。它是一个 `while(true)` 无限循环,每次迭代代表一次"思考→行动→观察"周期。
-> 图示:[`Agentic Loop 循环图(PNG)`](/docs/images/agentic-loop.png)
+> 图示:[`Agentic Loop 循环图(PNG)`](../../images/agentic-loop.png)
## 循环的完整结构
diff --git a/docs/internals/three-tier-gating.mdx b/docs/internals/three-tier-gating.mdx
index d639faa56b..578e6fc2ec 100644
--- a/docs/internals/three-tier-gating.mdx
+++ b/docs/internals/three-tier-gating.mdx
@@ -72,16 +72,16 @@ keywords: ["门禁系统", "功能门控", "feature flag", "灰度发布", "可
后续四篇文章将分别深入每一层门禁的细节:
-
+
构建时 Feature Flags 的完整分类与解读
-
+
GrowthBook A/B 测试体系的运作机制
-
+
KAIROS、PROACTIVE 等 8 大隐藏功能深度解析
-
+
Anthropic 员工专属的工具、命令与 API
diff --git a/docs/introduction/architecture-overview.mdx b/docs/introduction/architecture-overview.mdx
index 62279198a5..a5b44c4206 100644
--- a/docs/introduction/architecture-overview.mdx
+++ b/docs/introduction/architecture-overview.mdx
@@ -10,7 +10,7 @@ keywords: ["Claude Code 架构", "五层架构", "QueryEngine", "Agentic Loop",
Claude Code 从上到下分为五个层次,每一层职责清晰、边界分明:
-> 图示:[`Claude Code 五层架构图(PNG)`](/docs/images/architecture-layers.png)
+> 图示:[`Claude Code 五层架构图(PNG)`](../../images/architecture-layers.png)
| 层次 | 职责 | 入口源码 | 关键词 |
|------|------|---------|--------|
@@ -22,7 +22,7 @@ Claude Code 从上到下分为五个层次,每一层职责清晰、边界分
## 一条主数据流的源码追踪
-> 图示:[`Claude Code 核心数据流图(PNG)`](/docs/images/data-flow.png)
+> 图示:[`Claude Code 核心数据流图(PNG)`](../../images/data-flow.png)
整个系统的运转可以浓缩为一条核心数据流,以下是每一步对应的源码路径:
diff --git a/docs/research/project-capability-atlas.mdx b/docs/research/project-capability-atlas.mdx
index f5f59c1c16..693f1f7578 100644
--- a/docs/research/project-capability-atlas.mdx
+++ b/docs/research/project-capability-atlas.mdx
@@ -24,7 +24,7 @@ keywords: ["Claude Code", "reverse engineering", "能力图谱", "skills", "MCP"
## 核心图谱区
-> 图示:[`Claude Code 能力全景图(SVG)`](/docs/images/research/capability-overview.svg)
+> 图示:[`Claude Code 能力全景图(SVG)`](../../images/research/capability-overview.svg)
```mermaid
flowchart LR
@@ -48,7 +48,7 @@ flowchart LR
## 模块地图区
-> 图示:[`Claude Code 能力矩阵图(SVG)`](/docs/images/research/capability-matrix.svg)
+> 图示:[`Claude Code 能力矩阵图(SVG)`](../../images/research/capability-matrix.svg)
```mermaid
flowchart TD
@@ -99,7 +99,7 @@ flowchart TD
## 社区核验区
-> 图示:[`Claude Code 社区观点核验图(SVG)`](/docs/images/research/community-verdicts.svg)
+> 图示:[`Claude Code 社区观点核验图(SVG)`](../../images/research/community-verdicts.svg)
| 社区共识 | Verdict | 当前仓库里的证据 |
|---|---|---|
@@ -118,10 +118,10 @@ flowchart TD
建议按 `cli.tsx -> main.tsx -> query.ts -> QueryEngine.ts -> tools.ts -> commands.ts -> loadSkillsDir.ts -> mcp/client.ts -> AppStateStore.ts -> REPL.tsx` 进入。
-
+
继续看 `query.ts` 的 agentic loop 状态机。
-
+
继续看 feature gate、GrowthBook 与 ant-only 的层次关系。
diff --git a/scripts/docs-static-compat.test.mjs b/scripts/docs-static-compat.test.mjs
index 2fae23d8cd..c008502e95 100644
--- a/scripts/docs-static-compat.test.mjs
+++ b/scripts/docs-static-compat.test.mjs
@@ -37,4 +37,20 @@ describe('docs static export compatibility', () => {
expect(offenders).toEqual([]);
});
+
+ it('avoids root-relative /docs links inside MDX content', async () => {
+ const files = await listMdxFiles(join(process.cwd(), 'docs'));
+ const offenders = [];
+ const rootRelativeDocsPattern = /(\]\(\/docs\/|href="\/docs\/|src="\/docs\/)/;
+
+ for (const file of files) {
+ const content = await readFile(file, 'utf8');
+
+ if (rootRelativeDocsPattern.test(content)) {
+ offenders.push(file);
+ }
+ }
+
+ expect(offenders).toEqual([]);
+ });
});