AGENTS.md@src/host/graph · git:20260922.9fb2358 · 2026-09-22 · sha256 b310376187508585
AGENTS.md@src/host/graph git:20260922.9fb2358A
Immutable. This exact content never changes and is served at /api/v1/blob/b310376187508585.
# Graph Module Rules ## 适用范围 适用于 `src/host/graph/`。本文件定义图契约模块特有的稳定治理边界与修改规则;通用规范遵循根 `AGENTS.md`,测试规范遵循 `tests/AGENTS.md`。 本文件描述治理原则,不是源码结构说明。文件移动、重命名或内部重构后,只要职责、事实源、依赖方向与对外契约未变,本文件不随之修改。 ## 核心职责 提供「工作流图」的确定性契约与判定:图的形状与连接点语义、图的构造与只读查询、结构合法性校验与规范化、编排质量检查(问题清单)、组织元参数的归一化与规模护栏。 判断归属:该修改是否改变**图契约、图判定口径或图的规模约束**?若主要属于其他领域(运行推进、Agent 语义、Tool 协议、UI 展示、持久化),应放到对应模块。 ## 非职责 - 不读写持久化、文件、网络或数据库,不管理运行锁与运行状态; - 不推进生命周期,不拥有任何跨调用存活的状态; - 不做 Agent 语义判断(是否重规划、是否汇报、是否改变执行策略); - 不注册 Tool、不定义 Tool Schema、不渲染界面; - 不直接修改其他模块的内部状态。 ## 纯函数契约 判定与计算一律为纯函数:相同输入 → 相同输出,不修改入参,不依赖全局可变状态、当前时间、随机源、文件系统或运行时实例。 - 唯一例外是节点/连线标识工厂:其唯一性需要随机来源,该来源必须封闭在工厂内部,不得扩散进任何判定或校验逻辑; - 需要时间等外部因素时,通过显式参数传入; - 数据必须是「传入即全部事实」:不得从环境或全局读取图状态。 ## 单一事实源 同一图概念只允许一处本体。流转通道判定、可执行单元口径、问题级别、问题 code 全集等,必须有唯一来源。 - 禁止以「两份字面量」「结构镜像 + 列表断言」的方式重复维护同一契约; - 同一口径被多处使用时,使用方引用本体,而不是各自重写; - 跨半区(Client)因程序隔离**必须**另行实现同一口径时,两侧语义必须由**契约测试**分别锁定同一行为,不得靠跨半区 import 消除重复。 ## 子域边界 本模块内部存在变化原因不同的子域:图契约与结构校验、编排质量检查、组织元参数与规模护栏。 - 子域之间只通过明确的输入输出协作,不得互相承担对方职责; - 结构校验判定「图是否合法」(形状、连接点、拓扑);质量检查判定「图是否编排得当」(设计提醒),不得互相重新定义对方的结论; - 元参数护栏只约束**代理**改图,不约束用户手工改图——是否启用由调用方按变更来源决定,本模块不做来源判定; - 新增能力先判断属于哪个子域,再放到该子域的职责中,不得为了就近而堆进已有文件。 ## 问题级别与稳定 code - 级别语义固定:阻断级即调用方拒绝落盘;提示级只提醒、不阻断; - 问题 code 属对外契约:发布后不得改名或改级别;新增规则必须登记到 code 注册表; - 阻断级问题必须给出可执行的修复建议(这是失败方自我修正的唯一通道); - 新增或修改 code 时同步检查:注册表、规则实现、聚合层、修复建议、测试。 ## 公共边界 - 模块外只允许经模块的**公共入口**导入,禁止直接引用模块内部文件; - 只把真实、稳定、可维护的契约放进公共入口,禁止「全量 barrel」把内部实现一并暴露; - 内部实现(单条规则、内部遍历助手、自检工具等)不进入公共入口; - 新增公共符号前先判断它是否表达对外稳定契约;放宽入口比收紧入口的代价更高。 ## 依赖边界 - 只允许依赖共享契约层(Host/Client 共享的形状与协议常量); - 不得依赖 orchestrator / tools / agent / storage / service / remote / client; - 依赖方向单向:调用方依赖本模块的判定,本模块不反向依赖任何调用方。 ## 契约稳定性 - 校验问题码、检查器 code、字段语义与级别属公共契约,修改必须同步调用方、测试与文档; - 字段增删遵循兼容优先:新增字段默认可选;删除或改义必须说明旧数据的读取行为与兼容路径; - 判定口径变化(例如「什么算流程线」「什么算参与流程」)属于行为变化,必须记录:旧行为 → 新行为 → 原因 → 影响范围 → 测试变化。 ## 模块内部组织 - 文件结构不是架构契约,禁止为「看起来模块化」机械拆分;拆分依据只能是职责、变化原因、依赖边界与测试边界; - 文件命名必须表达**稳定职责与所属维度**,同族文件保持一致命名维度;名称失真的文件应立即重命名并同步全部引用; - 不得创建 `utils.ts`、`helpers.ts`、`common.ts`、`shared.ts`、`misc.ts` 等无明确职责的聚合文件; - 内部文件之间使用相对路径导入,公共入口不含实现。 ## 修改前检查 1. 改动属于图契约、结构校验、质量检查还是元参数? 2. 是否改变判定口径?受影响的上层调用方与测试是哪些? 3. 是否新增/修改稳定 code、级别或字段?注册表与测试是否同步? 4. 是否引入非纯依赖(时钟 / 随机 / IO / 全局状态)? 5. 是否产生第二份事实源? 6. 是否越界进入其他模块职责? ## 验证 至少执行: ```text pnpm typecheck pnpm test pnpm build ``` 同时确认:公共入口导出面未意外扩大、无旧路径残留、无循环依赖、无重复实现、判定口径变化已按契约记录。 ## 核心原则 1. 图判定确定性优先,纯函数不可含隐藏依赖。 2. 同一图概念只有一处本体,禁止双份维护。 3. 结构合法性、编排质量与规模约束各守其责。 4. 问题 code 与级别是契约,新增必须登记。 5. 模块外只经公共入口协作,内部实现不外溢。 6. 依赖单向,不反向依赖调用方。 7. 判定口径变化必须显式记录并锁定测试。