起点
传统个人知识库的目标用户是人。你用 Obsidian、Notion 或 Logseq 记笔记,偶尔回头翻看,大部分笔记成为数字废墟。
但如果目标用户是 AI Agent 呢?
Agent 能记住上下文,能主动关联,能遵循指令执行复杂操作。把经验交给 Agent 管理,意味着知识库从”被动存档”变成”主动调用的可执行资产”。
Praxis 就是围绕这个前提设计的。
核心设计:经验编译链
系统的核心是一条价值链:
真实问题 → 调查 + 决策 → 行动 → 反馈 → 可复用认知/skill → 可兑换资产
每个阶段对应一个目录和一种笔记类型:
| 阶段 | 目录 | type | 说明 |
|---|---|---|---|
| 灵感 | 00-inbox/ | inbox | 原始输入,无格式要求 |
| 问题 | 01-problems/ | problem | 自包含:现象+调查+决策+反馈写在一个文件 |
| 项目 | 02-projects/ | project | 由明确问题驱动,不得凭空创建 |
| 认知 | 03-knowledge/ | knowledge | L2 起步,提炼后可升级到 L3 |
| 产出 | 04-assets/ | asset | 可复用内容,如 Agent Skill |
关键约束:
- 项目不能凭空创建。你要构建一个东西,必须先有一个
01-problems/下的问题描述它要解决什么。 - 反馈不单建文件。调查结果、决策理由、事后验证全部追加在同一个 problem 文件里。一条时间线,读完就知道来龙去脉。
- 认知升级有门槛。L1 是假设(存 inbox),L2 是经过一次外部验证(存 knowledge),L3 是经过多次个人经验证实(可以输出为 asset)。
- 不收外部知识做 L3。外部框架只能 L2 封顶,升级 L3 必须经过自己踩过坑。
入口:为什么是 MOC 而非目录树
Agent 不需要 Sidebar。遍历目录树找文件既不高效也不优雅。
Praxis 的入口是 +.md —— 一个 Map of Content:
## 活跃问题
- [[01-problems/跨 Agent 会话连续性挑战]] `[investigating]`
## 知识
- [[03-knowledge/models/Agent 扩展的三层隔离]]
- [[03-knowledge/methods/混沌输入-结构化输出]]
所有笔记通过 frontmatter 的 status 字段声明状态,MOC 上的链接和状态标签由 Agent 自动维护。人用 Obsidian 打开这个文件,看到的是完整的知识地图;Agent 读到的是结构化的导航指令。
会话协议:Agent 如何记住上一次对话
Praxis 有一个核心痛点:你换了 Agent 运行环境(从 Codex 切到 opencode,或者换了一台机器),Agent 怎么知道上次聊到哪里?
解决方案是一个三层协议:
会话记录 (session-history.json) ← 通用事实源,由 track-agent-sessions skill 维护
↕
Agent 状态投影 (core/agent-state.md) ← Praxis 自己的视图
↕
MOC (+.md) ← 当前焦点,wikilink 入口
每次新会话启动时,Agent 按以下流程操作:
- 读取
core/agent-state.md++.md,获取上次焦点 - 通过
praxis-sessionskill 登记当前会话(包括运行时标识和原生 session ID) - 完成工作后,回写终态(ended / interrupted)
- 同步 MOC 和状态文件
中断恢复的场景也被考虑在内:如果检测到上次会话是 active 但没有可靠证据证明异常中断,Agent 把它标记为 interrupted 并新建一条记录,不丢失历史。
Agent 行为准则:不是你的回声壁
Praxis 的 AGENTS.md 里有一条规定特别重要:
指正优先于迎合。当用户判断与既有原则、目标或已知事实冲突时,Agent 必须指正;当用户结论缺乏支撑时,Agent 必须追问。
这意味着 Agent 在 Praxis 中不是一个执行机器,而是一个校正器。它有权质疑用户的判断,有权指出知识库内部的矛盾。
这个设计的出发点是:如果知识库的目标是”产生复利”,那错误积累就是在产生”负复利”。让 Agent 有指正的权限,比让用户舒服地犯错更重要。
目录设计的取舍:为什么用数字前缀
目录名是 00-inbox/、01-problems/ 而不是 inbox/、problems/。
这不是给 Agent 看的——Agent 靠 frontmatter 的 type 字段识别类型。数字前缀纯粹是为了 Obsidian 的文件列表排序。同一套文件,人用 Obsidian 浏览时看到的是有序列表,Agent 读取时走 wikilink 跳转,互不干扰。
类似的取舍:
- 不用 Dataview 插件。所有状态查询由 Agent 直接读文件完成,不依赖 Obsidian 插件。
- 不用模板。Agent 创建文件时根据 type 自动填充 frontmatter,不需要模板系统。
- Wikilink 格式统一为
[[路径/文件名]],不带.md后缀,不用 markdown 链接。
从问题到可复用资产:一个实例
最早的问题是:“Agent 会话记录缺少原生 ID,导致无法精确追踪与回溯”。
这个问题经历了完整的转化链:
问题: 会话缺少唯一 ID → 调查: Codex 有 CODEX_THREAD_ID,opencode 有 session ID
→ 方案: 封装为跨 Agent 的通用会话历史 Skill
→ 实现: track-agent-sessions skill(独立 npm 包)
→ 验证: 在 Codex 和 opencode 两个环境下跑通安装验收
→ 沉淀: 04-assets/通用 Agent 会话历史 Skill
→ 认知: 03-knowledge/models/机器事实源与人类投影分离
一个问题驱动了一个可复用 Skill 的诞生,同时产生了一条可复用的认知模型。这正是 Praxis 的核心价值。
当前状态
Praxis 目前处于 v2.4.1,核心架构冻结。已经解决了数个基础问题(会话协议、跨 Agent 兼容、状态一致性),但还在等待更多真实问题来驱动下一步演化。
如果你也在用 AI Agent 来管理知识,以下问题值得思考:
- 你的知识库目标用户是谁?如果是人,那 Agent 只是辅助工具;如果是 Agent,那文件结构要为机器解析优化。
- 你对 Agent 的期望是什么?执行工具还是思考伙伴?这决定了行为准则的写法。
- 经验如何验证?L2 和 L3 的区别在于”是否经过个人经验证实”,这条分界线是知识质量的保证。