• ## 问题 1:work 节点只有 agent.md 进提示词
    
    graph-engine 驱动 work 节点走 PromptBuilder.build(),只读 protocol + agent.md +
    companyContextPath + user.md/memory.md/近期记忆。交互式的 agent-chat.js
    (buildSystemPrompt)另有一条独立实现,会读 soul.md/identity.md/tools.md/
    heartbeat.md/OKR 目标/hippocampus 检索/main_skill/SKILL.md/其它 skills——两条链路
    从未同步过。静默到什么程度:agent 照样跑、照样成功,只是少了人格/工具约束/长期
    记忆检索,没有任何报错能看出原因。
    
    新增 identity-context.js,抽出 agent-chat 那份逻辑里「读哪些文件」的等价实现(不
    读 agent.md/user.md/memory.md/近期记忆——那五样已经被 PromptBuilder 覆盖,避免
    重复),接进 PromptBuilder.build() 的非 SKILL.md 分支(scoped skill 那类不是完整
    身份,不适用)。用户明确选择「全量对齐」:soul/identity/tools/heartbeat/OKR/
    hippocampus/skills 一次性全补,不做裁剪版。
    
    ponytail:没有反过来改 agent-chat.js 去调用这份共享实现——两处现在是「同构但
    独立」的两份代码。agent-chat.js 是长期稳定的高频路径,为这次修复去动它风险和
    收益不成比例,见 identity-context.js 头注的升级路径。
    
    ## 问题 2:org node 角色定义截断到 2000 字,切没切完全不可见
    
    describeRoleDefinition 给 workgraph-planning 的角色定义摘录一直硬切前 2000 字
    (有意为之,规划要的是「职能」不是全文)。但切没切、切掉了多少,规划 agent
    一无所知——agent.md 写得长一点、职能说明排在后半段,这句关键描述可能根本没
    进提示词,且没有任何信号。截断上限不变,改成截断时附一句 ⚠️ 提示 + 完整路径,
    给它一条自己去读全文的退路。
    
    ## 测试
    
    identity-context.test.js(10 条):文件读取的每个条件分支、OKR/hippocampus
    只在有 agentId 时才查、OKR 抛错不拖累其它内容、skills 目录扫描排除 main_skill。
    两个依赖(OkrService/retrieveRelevantPlans)用直接换 CJS module.exports 属性
    的手法隔离——本仓库服务层是纯 CommonJS,vi.mock 对嵌套 require() 链路不生效
    (实测踩过),且这两个依赖没有 env 覆盖点,真实路径不能进单测。
    
    describe-role-definition-truncation.test.js(3 条):截断/不截断/本体不存在
    三种情况,用真实 system/agents/ 下的 zz- 前缀临时本体(locator.bodyDir 没有
    env 覆盖点,只能顺着真实路径走),afterEach 清理不留痕迹。
    
    全量 npx vitest run:150 文件 / 1378 用例,零回归。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse File »