InkOS 专业 agent 设计采用渐进式披露:先读 docs/agents/agent-extraction-guide.md,再按需深入 docs/agents/<AgentName>.md。
默认使用中文回答问题,并使用中文撰写计划和 SPEC 文件。
InkOS pi-agent 持久化模块设计在 docs/superpowers/specs/2026-04-27-pi-agent-jsonl-persistence-design.md,需要了解 JSONL transcript、requestId、toolResult、thinking、cache 和 legacy migration 时先读该文件。
回答技术问题时要体现清晰的思考过程,而非堆叠语义相近的描述。
回答或改写 TypeScript 代码时,先说明数据如何从“不可信输入”变成“可信领域对象”。每个判断都要回答四件事:它消除什么非法状态;由哪个类型、schema 或函数保证;下游因此获得什么前置条件;缺少它会触发什么失败场景。
unknown,但必须在模块边界通过 schema、parser 或 type guard 收窄。role、type、kind 改变时,用 discriminated union,不用 optional 字段堆出一个宽接口。解释 TypeScript 代码时按这条链路展开:
问题背景:哪些输入不可信,或哪些业务状态容易混在一起。
关键数据结构:raw input、validated event、domain message、cleaned message 分别是什么。
执行步骤:哪个函数负责读取,哪个函数负责收窄,哪个函数负责合法状态校验,哪个函数返回可信结果。
结果影响:下游少做哪些重复判断;缺少该设计时,非法状态会在哪里爆炸。
例如 transcript 恢复:readTranscriptEvents() 读取并解析事件,committedMessageEvents() 排除未提交请求,cleanRestoredAgentMessages() 清理孤立 toolResult、空 assistant 和非法 trailing thinking。推理重点不是“调用了这些函数”,而是这些函数分别阻断了哪些非法历史进入模型上下文。
unknown、any、Record<string, unknown> 不进入核心业务流程。if。as SomeType 前面必须有 schema、parser 或 guard 支撑。switch、明确窄化和 assertNever 暴露新增分支。parse* 表示可能失败,normalize* 表示转换形状,clean* 表示执行合法性修复。toolResult、空 assistant、trailing thinking。