---
name: project-knowledge
description: >
  Navigate EnsoCode's long-term engineering conventions, layer boundaries, testing rules,
  historical decisions, and high-cost pitfalls. Use before non-trivial or cross-layer changes,
  when adding IPC or session/worker behavior, when debugging state/history/input issues,
  when a fix reveals a reusable rule, or when the user asks to search or capture project knowledge.
  项目知识导航、踩坑检索、根因沉淀、TDD 和工程约定。
---

# Project Knowledge

这是项目知识的导航和维护入口，不替代权威文档，也不恢复任务状态机或工作流。先按下面的场景选择最相关的文档，避免无目的地通读整个知识库。

## 动手前：先读什么

| 场景 | 必读资料 |
| --- | --- |
| 任意非平凡改动 | `AGENTS.md`、`docs/engineering-guidelines.md` |
| 跨主进程 / preload / renderer | `docs/engineering-reference/guides/cross-layer-thinking-guide.md`、`main/ipc.md` |
| Main、worker、child、session | `docs/engineering-reference/main/services.md`、`renderer/state.md` |
| 新增或修改 IPC | `docs/engineering-reference/main/ipc.md` |
| provider、skill、MCP、指令扫描 | `docs/engineering-reference/main/services.md`、`testing.md` |
| React、Zustand、持久化 | `docs/engineering-reference/renderer/state.md`、`renderer/components.md` |
| UI、弹窗、窗口、样式 | `docs/engineering-reference/renderer/components.md`、`dialogs.md`、`styling.md`、`main/windows.md` |
| 纯逻辑、协议、解析器、路径校验 | `docs/engineering-reference/testing.md` |
| 怀疑已有类似实现 | `docs/engineering-reference/guides/code-reuse-thinking-guide.md` |

动手前至少回答：行为差距是什么、行为真正属于哪一层、哪些文件必须改、哪些相邻问题明确不做。

## 排障时：先查症状和根因

先看 `docs/engineering-reference/big-question/index.md`，再打开与症状最接近的条目：

| 症状 | 优先检查 |
| --- | --- |
| preload 改动后应用启动失败 | `big-question/preload-externalization.md` |
| 状态不更新、一直加载、推送无效 | `main/ipc.md`、`main/windows.md` |
| 同一个资源被导入多份 | `big-question/dedupe-identity.md` |
| 冷会话 / 历史为空，先发消息后正文消失 | `big-question/optimistic-echo-blocks-snapshot.md` |
| 多轮后历史消息消失 | `big-question/agent-end-run-scoped-messages.md` |
| worktree 切换后文件写错位置 | `big-question/worktree-move-races.md` |
| CDP 点击、拖拽或输入时好时坏 | `big-question/cdp-hidden-window-input.md` |
| retry、回退、恢复行为异常 | `big-question/pi-auto-retry-willretry.md`、`checkpoint-cross-session-wipe.md` |
| 弹窗或下拉无响应 | `big-question/dialog-layering.md`、`ui-component-classname.md` |

排查应沿完整链路验证可观察事实：

```text
UI → store/reducer → preload → IPC → Main → worker / 文件 / 网络
```

优先检查 IPC 返回值、持久化文件、worker 事件和 CDP 运行时状态，不要只根据症状所在的组件猜根因。

历史设计、研究和开发日志位于 `docs/project-history/`。它们用于找背景和已有决策，不是当前规范；如果历史资料和当前源码或工程规范冲突，以当前源码、`AGENTS.md` 和 `docs/engineering-reference/` 为准。

## 测试与验证

改动纯函数、解析器、协议校验、路径校验或 reducer 时必须遵循：

1. 先写测试并确认它因缺少功能而失败（RED）。
2. 写最小实现使其通过（GREEN）。
3. 跑全量测试后提交。

修 bug 同样先写复现测试。测试应断言可观察行为，不要只断言内部调用或错误文案。涉及模型自主调用工具的链路，至少用两个不同厂商的模型真机验证。

提交前运行：

```bash
pnpm typecheck && pnpm lint && pnpm test
```

## 发现新知识后：如何沉淀

完成实现或排障后，只有具备复用价值的结论才写入文档。判断标准：

- 是否是一个其他模块也可能遇到的根因或边界条件？
- 是否改变了以后实现、测试或排查的默认做法？
- 是否有明确的回归测试、真机证据或可观察现象？

按类型选择落点：

| 知识类型 | 落点 |
| --- | --- |
| 高频、稳定的硬规则 | `AGENTS.md` |
| 项目级开发约定或跨层规则 | `docs/engineering-guidelines.md` |
| 某一层或某一模块的详细契约 | `docs/engineering-reference/main/`、`renderer/`、`shared/` 或 `guides/` |
| 真实踩坑、症状与根因错位、排查成本高 | `docs/engineering-reference/big-question/` |
| 一次性设计背景、方案比较、历史决策 | `docs/project-history/` |
| 纯回归防线 | 对应测试文件；必要时加简短背景注释 |

新增高代价陷阱使用以下结构，务必写清真实症状和回归防线：

```md
# 问题标题

## 症状

## 根因

## 修法

## 回归防线

## 相关代码
```

更新文档后同步检查相邻规范和已有链接，避免把同一规则复制成互相漂移的多份内容。不要把一次性的聊天总结、未经验证的猜测或完整任务日志直接写进长期规范。

## 知识库上限与压缩清理

本项目暂不自动删除或自动改写知识文档；压缩清理采用人工审计，避免误删有价值的根因和回归证据。每次新增知识前，以及完成一组相关任务后，按下面的规则检查：

| 内容 | 建议上限 | 超限处理 |
| --- | ---: | --- |
| `AGENTS.md` | 约 100 行 | 只保留高频硬规则，其余移到 `docs/engineering-guidelines.md` 或 reference |
| `docs/engineering-guidelines.md` | 约 250 行 | 按主题拆到 `docs/engineering-reference/` |
| 单个 `big-question` 条目 | 约 150–250 行 | 删除过程日志，只保留症状、根因、修法、回归防线和相关代码 |
| `project-knowledge/SKILL.md` | 约 150 行 | 只保留导航、检索、沉淀和维护规则，不复制规范正文 |
| `docs/engineering-reference/big-question/` | 不设硬上限 | 合并重复问题，按症状和根因去重 |
| `docs/project-history/` | 不设硬上限 | 按日期归档；只保留仍有背景价值的设计和研究结论 |

### 新增前去重

1. 先搜索 `AGENTS.md`、`docs/engineering-guidelines.md`、`docs/engineering-reference/` 和 `docs/project-history/`。
2. 已有同一规则时更新原文，不新建相似条目。
3. 同一根因导致多个症状时，保留一个根因条目，并在症状表中列出表现。
4. 只有具备可观察证据、回归测试或明确设计决策的内容才进入长期知识库。

### 手动压缩

- `AGENTS.md` 只保留贡献者每天需要看到的规则。
- 工程规范保留当前行为契约；旧实现细节和一次性方案比较移入 `project-history/`。
- `big-question` 条目删除聊天过程、重复代码片段和无结论尝试，保留最短可复用解释。
- 历史任务保留最终 PRD / design / research 结论；纯 context manifest、重复验收过程和临时日志可以删除。
- 规则被当前代码淘汰时，不要直接抹掉证据：先在文档中标注已过期及替代规则，确认无引用后再删除。

### 自动维护命令

项目提供三条命令：

```bash
pnpm knowledge:check
pnpm knowledge:clean
pnpm knowledge:clean -- --apply
pnpm knowledge:compact
```

- `knowledge:check` 只读检查文档行数、Markdown 链接和踩坑条目结构；发现问题时返回非零状态，不修改文件。
- `knowledge:clean` 默认 dry-run，列出历史目录中的临时 `.jsonl` 文件；只有显式传 `-- --apply` 才移动到 `docs/knowledge-review/archive/`。
- `knowledge:compact` 检查超长 `big-question` 条目，在 `docs/knowledge-review/compact/` 生成源文件副本和压缩提示；原文不变。
- 设置 `OPENAI_API_KEY` 后，`knowledge:compact` 可调用兼容 Chat Completions 的模型生成草案；可选 `OPENAI_BASE_URL` 和 `OPENAI_MODEL`，模型输出仍只写入审阅目录。
- 自动命令不会直接覆盖、删除或合并当前知识。应用模型草案前必须人工检查 diff，并确认根因、证据、风险和源码链接没有丢失。

### 安全原则

压缩清理只能减少重复和过程噪声，不能删除：

- 真实 bug 的根因和症状；
- 回归测试、真机验证或安全边界证据；
- 仍被源码、测试或其他文档引用的内容；
- 尚未完成的设计决策和风险记录。

## 维护边界

- 本 skill 只负责知识检索和知识沉淀。
- 不创建或维护任务状态，不引入 workflow、session pointer、JSONL manifest 或平台 hook。
- 不把 `docs/project-history/` 当作当前行为契约。
- 不为重复已有规则而新增抽象；优先更新最接近权威来源的文档。
