• 独立试验节点(parent_id: null,不接入任何真实公司/图,不碰生产 system/agents/unit-tester/),
    四段式训练全部完成:真实基线 32.2 分(不合格)→ Hunt 挖出 7 条现状缺口 → Digest 建出 7 维度
    benchmark_v1.md → Evolve 产出可执行操作手册 SKILL.md,独立样本压力测试拿到 94.4 分,
    超过 80 分目标线。
    
    追加一轮 Round 2 复测(round2_verification.md):Evolve 阶段两处修正(D2 固定模板要求"不采信"
    锚点词、D5(a) 可复现性核对)落到 SKILL.md 之后从未重新打分,94.4 分测的其实是被淘汰的 Round 1
    草稿。复测拿两份样本验证:①对已用过的样本做假设性套用,98.0 分,确认 D2 修正干净有效,同时
    发现 D5(a) 有 rubric 自身的结构性天花板("全新任务非中断恢复"场景最高只能到 4 档,与修正力度
    无关);②对一份此前从未打过分的真实样本做非假设性打分,90.4 分(优秀档),过程中还纠正了上一轮
    一处未经核实的事实错误(误判某样本缺配套 _research.md/_plan.md,实际齐全)。
    
    按用户明确要求本轮不做 Deploy:config.json 的 status 仍是 training、benchmark_score 仍是 null,
    生产 system/agents/unit-tester/ 未被触碰,训练产物等待人工审查后决定是否合并。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 三者是 heartbeat-service 里唯一 enabled=true 的系统级 Agent 本体,
    不管有没有公司雇佣都会挂心跳定时器(每 5/10 分钟打一次),跟公司数据无关。
    当前没有实际公司在运作,先关掉避免空转。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • - Hunt→Digest→Evolve→Deploy 全流程,8场景测试均分98.71/最低97,status enabled
    - 飞书标杆文档访问受阻(登录墙),改用 MiniMax 官方 GitHub 仓库原文替代,如实记录在 train/fde_report.md
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »

  • coder/config.json 长期停在 status:training,从没真正毕业,也从没做过 FDE 训练——是这次
    "哪些 agent 该训"排序里排第一的节点,因为它是实际写代码、决定最终产品质量天花板的执行节点。
    
    独立试验 coder-methodology-trial 训练产出(89.6/100,及格线65/目标线80)已手工合并进
    agent.md 四段式生命周期:RESEARCH 阶段新增两张必建清单(接口契约锚点表 + SDD明确禁止清单);
    EXECUTE 阶段新增"三支自问"机械动作(踩中禁止项/SDD未提及/引入新标识符,各自怎么处理写死);
    VERIFY 阶段新增信号词检查(判定依据出现"代码走查/规则推导"等字样即不算数,必须真跑命令)+
    可重放性三要素检查 + 一页纸自检表。全部配了真实历史反例:p-cgfdcr 的 currentScrollTarget
    状态变量偏离 SDD 却未留痕、p-v82tpc 独立验证时新发现的 header→nav 语义标签改动未标注。
    
    诚实说明(agent.md 开头 + soul.md 原则7/8 都写了,别在别处混说):89.6 是这套操作手册的
    文本质量分,训练全程没有真的把 SKILL.md 喂给一次真实 coder 会话跑任务再打分,回答的是
    "手册写得够不够具体",不回答"照做真的能拿多少分"——这是训练报告自己指出的方法论局限,
    不是自谦,照抄保留,避免后续把这个数字误用成"已验证的执行可靠性分"。
    
    coder-methodology-trial 完整训练材料(agent.md/soul.md/SKILL.md/train/{hunt,digest,evolve})
    随本次一并提交。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • org-planner/agent.md 原来固定要求 workgraph-planning 只能画 brd/prd/sdd/benchmark/
    validator 五节点链,不管任务是不是需要外部信息支撑。现在把"必须交出 brd/prd/sdd/
    acceptance 四份"重新定义为交给 org-coder 的固定契约,但产出这四份东西的中间步骤不再
    写死——按信号词(调研/竞品分析/市场行情 → web-search/deep-research 类节点;视频/广告
    投放素材 → video-search 类节点;对接XX API/拉取实时数据 → api-integration 类节点)
    明确授权在 brd 之前插入调研类节点,产出喂给 brd/prd/sdd。
    
    顺手删掉了一段从未被真正执行过的死代码:文件里原有"四段式生命周期 RESEARCH→PLAN→
    EXECUTE→VERIFY / task transition 命令行流转"的执行脚本,是把 org-planner 当成会被
    直接派单执行的单体 agent 来写的,跟当前"org 层节点永远是 nodeKind:'subgraph',实际
    由 workgraph-planning 规划子图执行"的架构对不上,从来没跑过。
    
    真实测试验证:给一个"调研竞品YouTube广告 + 对接定价API拉实时数据 + 产出竞争分析报告"
    的任务,workgraph-planning 真的规划出了 7 节点图(比标准 5 节点多两个调研节点),
    其中 pricing-api-integrator 是全新按 hired_from_base 分支现场造的本体,经 agent-creator
    + FDE 训练流水线异步补全(96.00分),随本次一并提交。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »

  • code-planner:status training→enabled,benchmark_score 96.35(行业基准82+14.35),
    六节输出模板与53判据写作规则落进 SKILL.md。
    
    sdd-planning:benchmark_score 89.3,新增两处「深挖」小节——接口契约的可独立复现性
    四类雷区(自证式验收/结论句代替实测值/风格描述无上限/占位内容也能通过)+
    data_shapes 字段约束与业务术语映射规则,随附完整 hunt/digest/evolve 训练材料。
    
    goal-benchmark:补一条自查项——pass_threshold 落档不能和 rubric 里"不达标"的文字
    描述用同一个分数区间,否则及格线形同虚设(2026-08-23 抽查 3/5 样本命中此模式)。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 独立试验节点,不接入任何真实公司/图。真实 Hunt→Digest→Evolve 训练"planner.json
    五节点该不该裁"这类元规划判据,2 轮收敛 100/100(真实基线 34 分不合格,同义反复式
    判据 15 分反而更低)。训练自验证时发现两处真实结构漏洞(裁 brd 遗留失效 backward 边、
    S5 复用门在当前仓库数据下无法触发),均已如实记录并给出兜底方案。判定表已手工套进
    生产 workgraph-planning/agent.md(见上一条提交)。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 在 agent.md Step 4 加了具体的裁剪判据(对应训练出的 SKILL.md:S1-S5 五个复杂度信号 +
    G2/G3 两道门 + planner.json 五节点逐个判定表),替换掉之前只有"你可以裁剪"这句孤立授权
    (真实回归验证过只打 34/100,不合格)。同时补上训练自验证时发现的真实结构漏洞——裁掉
    brd 会留下一条指向不存在节点的失效 backward 边,连带修正清单写进了裁剪判据里。
    
    Step 5 的规划记录模板新增"1.5 复杂度信号取值"一节,为 G3 复用门积累历史数据(当前
    仓库还没有任何历史记录标注过信号取值,这道门会一直走 fallback,直到开始积累)。
    soul.md 加一条对应工作原则:裁剪判据要具体,同义反复式判据("任务简单就裁")训练
    验证过反而只有 15 分,比不判断还糟。
    
    1411/1414 测试通过(3 个失败是其他自主进程遗留、与本次改动无关的既有问题)。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 两个独立的小修复,都是这次 e2e 回归 + 用户讨论"workgraph-planning 该怎么训练"时发现的:
    
    1. workgraph-plan-<taskId>.md 撞名:一个任务里 org-planner/org-coder/org-validator
       各自调 workgraph-planning 一次、各自的规划记录却共用同一个文件名,落在同一个项目根下,
       后写的原样覆盖先写的——真实撞见过(org-planner 当时的规划记录被 org-validator 覆盖,
       事后一个字都找不回来)。改成 workgraph-plan-<taskId>-<宿主orgNode节点名>.md。
    
    2. subgraph 节点结算 → workgraph-planning 自己的 memory.md 桥接:阶段一的
       recordNodeOutcomeMemory 明确排除了 subgraph 节点(那是给 agent_call 记的),导致
       workgraph-planning 每次规划出的图最终跑得好不好,完全没有可积累的历史——这正是它
       "允许裁剪却没有具体判据"这个问题一直无法通过真实反馈自我改进的原因之一。新增
       recordWorkgraphPlanningMemory,在 subgraph 节点结算时把结果记进 workgraph-planning
       (全局唯一规划本体,不是宿主 org node 自己的身份)的 memory.md,只在真实规划
       (planWorkGraph===defaultPlanWorkGraph)时记,避免测试夹具污染真实目录。
    
    新增 3 条回归测试,graph-engine 相关测试文件全绿。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 在 prd-planning/agent.md 加了「描述性语言扫描」+「内容深度下限」+「业务度量翻译」三段
    具体操作(对应 36 号文档训练出的 SKILL.md Step 4/5),soul.md 加一条对应工作原则。
    用同一个 e2e-demo 首页任务重新跑了一次端到端回归验证:新 PRD 把"大图/简洁大气"等形容词
    逐条翻译成量化规则,最终产出的 index.html/style.css 精确对应这些数值(视觉元素
    min-height:320px、区块间距 96px/56px 等),文案不再卡在"非空"这条线——训练效果在
    真实任务里得到验证。
    
    回归过程中发现一个新的、独立于本次改动的引擎缺陷:org-coder-test 被反向打回后产出
    「建议重跑 org-coder-validator」的诊断文件,引擎把诊断文件里的 infra_flake 标记当成
    了这个节点自己的执行结果,导致原地重跑但从不路由到诊断建议的目标节点,陷入没有熔断线
    的确定性死循环。记进 30 号文档,留待后续修复。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 新建独立试验节点 prd-methodology-trial,走真实 Hunt→Digest→Evolve 训练 PRD 撰写方法论:
    2 轮 Small Loop 提前收敛(96/97 分,真实基线 50 分),用三个真实历史项目反推验证方法论
    有效,Deploy 范围限定在该独立节点,未触碰生产 prd-planning。结论:FDE 对方法论类角色
    确实管用,但收敛速度/验收严谨度依赖任务书里显式写明的自纠正要求,非免人工黑盒。
    
    过程中连带修复同一个 2026-08-16 改名批次(innovator→org-innovator 等)遗留的 5 处死链:
    company.js 两处硬编码调用、CompanyDashboard.vue「重新训练」按钮,以及四个本体各自
    config.json 内部 id 字段从未随目录改名同步更新,导致 /api/agent/list 展示层用假 id
    显示成死卡片。顺手修了 AgentScaffold 默认 tools.md 模板一处裸相对路径缺陷(对应
    agent-md-refs.test.js 里已登记多时的已知缺陷)。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »

  • 用户问"当前 company 用到的所有 agent 骨架是不是都完整",顺手全量核对了一遍
    e2e-demo 实际会用到的 18 个本体(org 层三个 + 三张 work graph 骨架的全部节点 +
    四个元规划本体),揪出两处:
    
    - unit-tester:这次真实回归测试撞见过的那个空骨架(32/34/35 号文档记录的样本),
      agent.md/soul.md/SKILL.md 三份全是没填充过的 _base 原始内容。照 coder 的规格
      (同一张 executor.json 骨架的实现节点)写了一份对应的自测节点定义——四段式细则、
      网页/代码两类产物的检查手段选择(网页类点名用 scripts/visual-acceptance-check.mjs,
      不许用正则解析文本冒充浏览器检查)、数据契约、硬规矩。
    
    - org-coder:完全独立于本次回归测试撞见的一处更早的缺口——soul.md 从 8/18 创建
      agent.md 起就没写过,这个本体已经在多个真实任务里跑过。照它自己 agent.md 里
      "实现节点"这个身份定位、比着 coder/soul.md 的规格补上,顺带记了一句它是跨公司
      共享本体(P1 虚拟引用),别把单个公司的业务细节写进去。
    
    agentLocator.missingBodyDefinition() 核对过,18 个本体全部通过。全量单测
    1012/1012 通过(本身不涉及后端逻辑改动,只是确认没有连带影响)。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • e2e-demo 公司真实回归任务(T-mt2r6fz0-125b,31/33 号文档验证用)跑 org-coder
    支线时新招的两个本体,system/agents/ 是全部 agent 本体的唯一目录,理应入库。
    
    coder/agent.md 正常填充过(角色专属内容)。
    
    ⚠️ unit-tester/agent.md 仍是未填充的 _base 原始骨架(带 LEMONBOSS_BASE_SKELETON
    哨兵标记)——这正是 32/34/35 号文档反复分析的"招聘装配没填充完"问题的真实样本,
    如实提交,不假装它是完整的。它已经在真实图执行里跑过一整条任务(见 34 号文档
    §五),提案 A(35 号文档,commit bab675c)落地后,这类未填充本体会在图执行前
    被 body_not_ready 闸门拦下,不会再静默拿空提示词跑真实调用。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 35 号文档剩下的三个提案,彼此直接相关(C 产出 D 消费的证据,B 展示 D 算出的结果),
    一次做完。
    
    提案 D(goal-contract.js 引擎级证据闸门):
      `runBenchmark` 新增 evidence 检测——`evidence_hint` 命中"浏览器/视口/开发者工具/
      console/network/截图"类关键词的维度,必须在 evidence.<dim> 有真实字符串支撑,
      否则该维度判不过(哪怕分数达标)。证据来源两处都认:`--target` 文件自带的
      `evidence.<dim>`,或同目录姊妹判词文件 `attempt-<n>.json` 的 `dimensions[].evidence`
      ——后者是 benchmark-validator/agent.md 早就在教的既有写法,不用 agent 多写一份。
      新增 `dimensions[].evidence_required` 字段随判决落盘。6 条新单测。
    
    提案 C(可复用视觉验收工具):
      新增 scripts/visual-acceptance-check.mjs,四个子命令(overflow/style/console/
      contrast),封装最常见的几类真实浏览器检查(Playwright),agent 通过 bash 直接
      调用,不用每次自己临时想办法(真实撞见过两个极端:一次真写了 Playwright 认真测,
      一次只写了正则解析文本)。配一份不进 vitest 快速循环的独立冒烟脚本(起真
      Chromium,几秒量级)。benchmark-validator/agent.md Step 2 加了引用说明。
    
    提案 B(控制台证据可见性):
      GET /api/graph-runs/:id 新增 benchmarkVerdicts 字段(只读 goal-contract.js 已落盘
      的判决,不重新计算)。NodeDetailPanel 概览 tab 新增"验收证据"小节:逐维度显示
      分数 + 是否有证据支撑,evidence_required 且缺证据的标 ⚠️。纯展示,不改判定逻辑。
      2 条新单测。
    
    全量单测 1012/1012 通过;控制台功能用 Chrome 实测过(截图确认"验收证据"小节正确
    渲染)。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • org-coder-validator 在真实回归任务里被 missing_required_input 反复误判 blocked:
    executor.json/executor-fanout.json 的 test/integration→validator 边声明
    produces:["log"](required 默认 true),但 test 类节点从不写出能被 indexNodeOutputs
    认作 kind=log 的文件(coder.log 实际属于 impl,test 自己的 _plan.md/_research.md
    认不出 kind 也没有一对一无歧义可猜),这个 kind 因此永远不会被索引到,
    requiredInputsMissing 每次都判缺失——不是时序问题,是结构性、每次重试都复现的硬伤。
    
    改成 { kind: 'log', required: false },对齐 validator.json 已有的写法(它的
    needs:artifact 早就标了 required:false)。真正必需的 needs:artifact 不变,
    仍受硬闸门保护。
    
    中途走了一段弯路:最初以为该改 inboundContracts() 按 role 过滤只留 needs,
    改完单测炸了 9 个用例——大多数边只声明 produces(无配对 needs),这条链路
    正是 T-mt25ecbd 产出闸门依赖的数据源,按 role 过滤会静默削弱那次修复。
    已撤回(work-graph-db.js 这次只加注释,没有逻辑改动),细节记在 33 号文档。
    
    新增回归用例 graph-files-index.test.js ⑪:produces required:false 且该 kind
    从未被索引到时不拦下游成功,同边 needs:artifact(required:true) 依旧受保护。
    全量单测 998/998 通过。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »

  • ## 起因
    
    e2e-demo 真实任务卡住:org-planner-sdd 自己判 input_underspecified
    并点名 org-planner-prd,但这张图里 sdd 没有任何 fail 出边——精确匹配、
    兜底边两条路都接不住,节点直接 blocked,靠人工点了「重试」才续上。
    
    ## 根因
    
    fail-fallback-edge 校验(27-P3/P4 §三.7 第五项)只在节点已经画了别的
    fail 边时才检查兜底边齐不齐。一条 fail 边都没有的节点完全不受约束——
    workgraph-planning/agent.md 原文明说这是「合法设计」。但系统里所有本体
    共用 _base 的四段式协议,VERIFY 阶段任何 agent_call 节点都可能自判
    失败,不止专职判词节点。四个骨架模板审计后发现 6 个中间节点存在同一个
    漏洞(sdd 只是撞上的那一个)。
    
    ## 决策
    
    除图的唯一入口节点外,每个节点必须留一条兜底边(判据是 forward 入度,
    不是节点名字模式)。org 层暂不动——node 全是 subgraph 类型,失败来源
    机制不同,且套用同一条规则会让三个 org 模板立刻不合法,属于 27-p3b
    「验收9」还没收口的链路,留给那边一起做。
    
    中途发现无条件收紧会炸 46 个用例/13 个文件(createWorkGraph 被大量
    测试当成建最小图的通用工具)。改法是加 strict 开关,默认关闭(行为
    不变),只在 workgraph-planning 真实提交图落库的那个唯一入口
    (createWorkGraphSafely)打开。
    
    ## 改动
    
    - work-graph-db.js / graph-engine.js:新规则 + strict 开关
    - planner.json / executor-fanout.json:补 6 条兜底边
    - workgraph-planning/agent.md:约束三等四处措辞同步
    - 新增单测:strict 模式 7 例 + 真实链路回归用例(真实引擎代码+真实
      DB+只换最外层 CLI 子进程,复现 sdd 自判失败后引擎自动路由到 prd,
      全程零 retryNode 调用)——比重跑一次真实任务更严格,可回归、进 CI
    
    978/978 单测通过。需求与决策记录见
    docs/todo/system-design/31-work-graph-fail-fallback-coverage.md。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »

  • ## 两个本体(都过得了毕业闸门)
    
    · dream-distiller —— 把一批原始记录提炼成可复用经验,交 ```json 数组
      {title, body, sources};没有值得留的就交 []。
    · dream-screener —— 逐条判「这条能不能给别家公司看」,交 {shareable, reason}。
    
    **决策 A 的独立性写在两处,缺一不可**:
    · 代码层:判定**一条一次调用**,提示词里只放 title + body,**不放原料**;
    · 本体层:dream-screener/agent.md 明写「你看不到原料,也看不到是哪家公司
      —— 这是故意的」。守卫里有一条专门断言这句话在 —— 否则下一个人会顺手把原料
      塞进提示词「让它判得更准」,而那恰好把独立性拆掉了。
    
    soul.md 也承担判据的一半:screener 的人格写的是「你是一道闸门,不是审稿人。
    审稿人的本能是帮它改好,闸门的本能是不确定就不放」。
    
    ## 两处失效方向都是硬的
    
    · 提炼取不出 JSON → **抛**,不是静默返回空。「产出格式坏了」和「没提炼出东西」
      是两件事,混为一谈会让前者以后者的形式永远藏下去 ——
      每天显示「今天没经验可沉淀」,而真相是解析一直在失败。
    · 判定解析不了 / shareable 不是布尔(比如给了字符串 "true")→ 判否,
      并把原文片段带进 reason,让人看得出是「判否」还是「判炸」。
    
    ## 纠了自己两次
    
    ① 测试第一版把解析与失效分支**在测试里重抄了一遍**再断言 —— 那是在验一份复制品,
       代码改了它照样绿。改成加一条 setDreamAgentCaller 缝,只换掉「真起 CLI」那一层,
       解析、判空、失效方向全走真代码。
    ② agent.md 的相对引用按 **cwd 深度 3**({aid}/{cid}/{taskId}/)解析,不是按文件
       自身位置 —— 仓库根是 ../../../../../。我按文件位置写了 ../../../,
       agent-md-refs.test.js 当场判红。**守卫替我抓的,不是我自己发现的。**
    
    ## 还没做的,写进文档 §5.4(别当成 dream 上线了)
    
    · 定时挂载没做(决策 C 说每日一次):现在只有 dreamOnce(agentId) 这个可调用单元,
      没挂调度、没 REST 入口。
    · 还没写定义文件:只写本体根的 memory/experience.md(纯经验积累,删掉无副作用)。
      三个 git 跟踪的定义留给下一步,闸门与 definitionWritability() 已就位,
      缺的是「往里写什么、写成什么形状」那半边设计。
    · **没有一次真 CLI 验收**:CI 里换掉的是 callDreamAgent 那一层,验的是解析与失效方向,
      不是模型写得好不好。两个本体的提示词**至今没有被任何模型读过** ——
      这正是 P3B W4 记过的形态(mock 从不读提示词)。
    · 决策 D(提炼质量怎么评)仍未定;可追溯是它的便宜起步,不是替代品。
    
    全量:144 文件 / 1323 测试全绿。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • ## ① system/tasklog/ 改名保留(§十二.5)
    派单存储统一进 tasks 表后,旧目录改名为 system/tasklog.bak-unify/ 而不是
    直接删 —— 跑顺一个版本再清。回填脚本改成**两处都认**(先原位置再备份位置,
    顺序不能反:万一有人从备份恢复出一份新的 tasklog,那份才是要回填的)。
    
    ## ② agent 提示词里的端口 3000 → 3010
    packages/agent-core/base/ 下那几份是**所有 agent 的工具说明**,印着
    curl http://localhost:3000/... 而实际端口是 3010。agent 照着打拿到的是
    连接被拒、不是「端口错了」,它多半会去猜别的原因。
    
    这不是假想:批 5 回填出来的历史派单正文里,有人手写了「(端口 3010,
    不是 3000)」在纠正它 —— 靠人肉在每条任务书里打补丁。
    
    守卫 agent-docs-port.test.js:扫 base 模板与 agent 本体,禁 localhost:3000。
    判据刻意宽松(不校验「必须等于 config.port」—— 端口可被 PORT 覆盖,写死会在
    部署环境误报)。带「样本非空」前置断言。第一版扫出 5 条误报,全是某 agent
    目录下 Python venv 里 playwright 的 ThirdPartyNotices —— 那是第三方文件不是
    提示词,已把 venv/site-packages/workspace/conversations/train 一并跳过。
    
    ## ③ 边界守卫不再把并行会话的改动算到 agent 头上(§15.5 第 1 条)
    守卫的前提是「窗口内新增的仓库改动 = 这个节点写的」。多会话共用 worktree 时
    这个前提是假的 —— git status 的差集里没有「谁写的」这一维。实测已发生:
    批 3 的开发改动把一条 run 判成 boundary_escape 卡住。
    
    可检测的信号:节点**开跑那一刻**仓库就已经有源码目录的未提交改动 → 有人正在
    这个 worktree 上开发 → 窗口内新增的源码改动无法归属 → **降级为只记证据、
    不判罚**(与既有的 unattributable 桶同一语义),而不是关掉守卫:证据照留,
    人一眼看得出「这次没判罚,因为当时仓库是脏的」。
    
    BOUNDARY_GUARD=strict 强制判罚(CI / 干净环境),=record 一律只记。
    守卫 8 例,含关键对照:仓库脏时不判、干净时同样一处越界仍判 fail ——
    守卫没被削弱,只是不再乱扣帽子。
    
    ## ④ TaskTimeline 的标签不再撒谎
    conversationCount 在批 5 之后只会是 0/1(「有没有起过执行会话」),而界面
    写的是 "Convs: N" —— 读的人会以为这条任务只有一次对话。改成有/无的表达。
    agents 的语义变化在注释里说明。
    
    注:innovator-hunt/todo.md 与 reddit-scraper/todo.md 里的端口也改了,
    但它们是 gitignored 的运行态文件,不入库。
    
    全量:134 文件 / 1268 测试全绿,web:build 通过。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »

  • goal 从「人写一句话」变成「agent 拆成一张 task DAG、人确认后下达」,
    收敛时由 org-validator 在 goal 层再验一次。
    
    ## 交付
    - task-planning 本体(毕业判据实测通过:agent.md + soul.md 一次写完、
      不带 _base 哨兵、路径按 cwd 深度 3 实算核对)
    - 拆分链路:3 轮 errors 原样回喂 → 不过就降级成 1 条同描述 task,
      goal 绝不卡在 planning;token 记 goals.planning_tokens
    - goal 级 org-validator 验收:≥2 条 task 全 completed 才调,单 task 跳过,
      有 failed 直接 failed 不调(省一次真花钱的调用)
    - 控制台四栏 + GoalTaskPane 两级树 + 两步表单(拆分中给逃生口)
    - 中断恢复:启动时补跑验收与汇报
    
    ## 三条跨进程竞态,全部用真探针实跑复现后才判定修好
    1. runGoalSplit 无条件把 goal 写回 draft,抹掉逃生口刚下达的 active ——
       而触发它的正是表单自己推荐的那个逃生口。后果是一个正在烧钱的 goal
       显示成「草稿」,且从此永不收敛(OKR 不写、上级不唤醒、无日志)
    2. CAS 把最终态提前写进库,验收窗口内重启即丢,且 verdict=NULL 与
       「单 task 合法跳过」形态相同,查不出来 → 占位判词 + 启动重推
    3. 认领语句 SET verdict=RESUMING WHERE verdict IN (PENDING, RESUMING)
       —— 写进去的值就在 WHERE 里,changes 恒为 1。而函数注释白纸黑字
       写着「认领写的是另一个占位值」。注释是对的,代码没兑现。
       实测:org-validator 调 2 次 / OKR 写 2 条 / token 双记
       → claim 带唯一 token + 时间戳租约,回写条件更新决胜,主路径同闸门
    
    ## 与设计正文的偏离(已记进文档 §十四)
    拆分后 goal 落 draft 而非 active(active 的语义已被 markGoalDispatched
    钉死为「已下达」);mode 三级继承对显式 tasks[] 同样生效;占位判词不出
    API;新增 planning_error / reported_at 两列,后者迁移带回填(否则升级后
    第一次启动会把历史终态 goal 全部重报一遍)。
    
    ## 过程
    四轮 26 个 agent,复核报出 22 条缺陷,其中 6 条是修复自己引入的。
    第四轮修完挂了 3 条测试,全是测试在钉住缺陷本身 —— 其中一条的注释
    写着「模拟进程死后重启」,构造的却是新鲜占位值:注释描述 A 场景、
    代码构造 B 场景、断言按 A 场景写。
    
    全量:118 文件 / 1112 测试全绿,web:build 通过。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • sessions 里存的是**常驻**的 claude CLI 子进程(stream-json 模式,不是一次性的
    `claude -p`),此前只有四条回收路径:协议 error / 子进程 disconnected / 手动删对话 /
    手动 stop —— 「正常跑完的对话」不在其中。
    
    而两路心跳都用一次性 convId 打进 /api/agent/:id/chat:
      - heartbeat-service:`heartbeat-${Date.now()}`,cto / coo 各 5 分钟一次
      - company-heartbeat-service:_sendAgentChat 的五个调用点(CEO 巡检 / Pipeline 步骤 /
        日程 / 告警 / 日报)convId 也全是一次性的,且无差别带 isHeartbeat:true
    
    于是每次心跳新起一个进程且永不释放。实测单次运行 2h43m 攒到 82 个进程 / 17.5 GB RSS。
    
    改法:
      - 心跳会话跑完立刻 closeSession(一次性 convId,会话复用对它零价值)
      - 普通对话上空闲 TTL(默认 30 分钟,AGENT_SESSION_IDLE_MS 可覆盖),复用 engine/idle-timer
      - 计时器只在「没有在途请求」的间隙走:getOrCreateProtocol 命中复用时 cancel,请求结束时
        重新上弦。所以再长的单次生成也不会被 TTL 打断,比在流式回调里 touch() 少一个调用点
      - 删对话 / stop 两处手抄的 disconnect+delete 收敛到 closeSession,否则它们不停表
    
    守卫:agent-chat-session-reclaim.test.js 用现成的 /chat/:convId/stop 当黑盒探针
    (查得到会话才返回 success:true),不为测试加导出口。对 HEAD 版本跑过:2 红 1 绿 ——
    两条回收断言修前失败,「普通对话保留会话」修前修后都绿,证明复用能力没被顺手砍掉。
    
    线上验证:重启后第一轮心跳 2 触发 / 2 回收,server 名下 claude 子进程数 0。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • system/templates/ 已随 28 号改造整体并入 system/agents/,目录在磁盘和 git 里都已不存在。
    但引用还散在各处,其中几处是 agent 运行时真会照着读写的:
    
    本体提示词(读不到就静默降级,不报错)
      workgraph-planning/agent.md   system/templates/base/ ×3、模板库路径 ×1
      orggraph-planning/agent.md    同上 ×1
      orggraph-planning/tools.md    ×1
      org-innovator/agent.md        四条产出落点 system/templates/weibo-scraper/train/*
    
    skill 代码里的硬编码目标
      evolver-youtube-crawler 的 refactor.js / mock_setup.js / evolve.js 共 4 处
      innovator-hunt/collect_seed.js —— 这处是真 bug 且已发作过:
        写的是裸相对路径 'system/templates/…',相对 cwd 解析,于是在 agent 自己目录下
        造出一棵野生嵌套树 system/agents/innovator-hunt/system/templates/…
        现在改成由 __dirname 推导,不再依赖 cwd(cwd 已经是深度 3 的任务态目录)
    
    图模板契约(work-graph-templates / org-graph-templates 的 README)
      CI 防线的三条规则写的还是「在 system/templates/ 下必须有目录」「在
      system/templates/_registry.json 里必须有条目」,与实际执行的检查已经对不上
    
    DevLoop PRD(13 份 HTML + 重新生成的 52 份 _spec + build-manifest + search-index)
      写的是 system/templates/devloop-pm.md(扁平 .md)。根和形状都错:
      loop-controller.js:166 实际读的是 system/agents/{agentName}/prompt.md。
      按真实形状改,然后跑 spec:extract / extract-manifest / build-search-index 重新生成。
    
    顺带订正两处早于本次改造就已过期的内容:
    - 「避开 6 个命名冲突 id」这条约束列的 digester / evolver / hunter / innovator
      四个 id 根本不存在(早已改名),而它的理由(两个目录下各有一份、内容不同步)
      也已随合并消失。约束保留(元 agent 本来就不该进执行流),理由与清单按实际本体重写。
    - orggraph-planning/agent.md 里「真相源是 company.json.agents[]」——
      28 号起真相源是 company_agents 表,company.json.agents[] 仅作兼容保留。
    
    刻意不动的三类(改了是净损失):
      历史说明   server/ 下解释「原来指向 X、批次 1 并进了 Y」的注释、docs/done/、tasks/
      完成证明   server/tests/ 里断言该目录已不存在的守卫
      运行态记录 未跟踪的 workspace/ conversations/ 与 train/ 下的历次训练报告
    
    新增 server/tests/unit/no-stale-templates-path.test.js 守住活定义这一档:
    扫 system/ 与 fixtures/ 下被 git 跟踪的文件(跟踪=人工维护的定义,
    未跟踪=运行态产物),零例外。带「样本非空」前置断言防 git 失灵时退化成永远通过。
    改坏一处实测能精确点名到文件行号。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 设计见 docs/done/system-design/28-agent-registry-unification.md。
    
    改造前 Agent 本体散在三处(system/agents/ 11 个、system/templates/ 50 个、
    data/companies/{id}/agents/ 17 个),同一个 AgentScaffold 被三个 baseDir 实例化。
    后果是同一角色在 N 家公司下有 N 份互不相干的副本,模板更新不会同步;
    org-coder / org-planner 这类走 hireFromBaseMetaAgent 造出来的本体
    legacy_path 指回自己公司目录,永远无法被第二家公司复用。
    
    本次:
    - G1 单一注册表:system/templates/ 整体并入 system/agents/,base → _base。
      7 个同名 id 逐个裁决,被丢弃的一份归档到 docs/_archive/ 而非删除。
      source_kind(template/global_agent/company_hired) → origin(builtin/created)。
    - G2 运行态下沉:CLI 的 cwd 从本体根改为 system/agents/{aid}/{cid}/{taskId}/。
      memory / conversations 落公司态 {aid}/{cid}/,按公司隔离不串。
      sessionPool 的 key 含 (companyId, taskId),两家公司调同一 agent 不复用会话。
    - G2b 产物不下沉:交付物仍落 data/companies/{cid}/,system/agents/ 只留运行痕迹。
      写入边界按链路分叉——graph 节点走节点私有目录(被 indexNodeOutputs 索引),
      chat 走公司 workspace,同一提示词里不再出现两条互斥指令。
    - G3 公司只存引用:data/companies/{id}/agents/ 删除,新增 company_agents 关联表。
      不复用 org_graph_nodes——后者是执行流图,work 层本体被雇时不写它,天生覆盖不全。
    - G4 缺则创建:本体缺失时从 _base 复制骨架进 system/agents/{id}/,
      agent-creator 填 agent.md/soul.md 后才从 draft 转 active(哨兵判据,
      骨架未填时哨兵仍在,不许被 hire)。产物即刻是全系统可复用的本体。
    
    新增 server/services/agent-locator.js 收编原先散在 6 处的寻址逻辑。
    
    边界守卫(graph-engine)的豁免从「本体根上五个文件名」放宽为整棵 system/agents/:
    新本体的骨架本来就要进 git,gitignore 挡不住 ?? system/agents/{newId}/,
    旧判据会把一个真正成功的招聘节点判成 boundary_escape fail。
    
    存量迁移见 scripts/migrate-agent-registry.js(幂等,备份到 data/_migration-backup-*)。
    
    真 Claude CLI E2E 已验证:新建公司 → orggraph-planning 自动规划 →
    自动招聘 org-planner/org-coder/org-validator 三节点流水线;
    data/companies/{cid}/agents/ 不存在,company_agents 4 行,
    system_agents 56→56(零新建私有本体,纯复用),git status 零增量。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »

  • 第六次真 CLI 冒烟 gapClosed=true:org 层契约落库 4 行(此前恒 0),
    且那段文字真的进了 workgraph-planning 收到的提示词(52677 字节,第 746 行起)。
    
    ## workflow 四路并行的产出
    
    - **org 层两半一起接**(关键顺序):先接读回方 buildPlanningPrompt 的 ③bis 段
      (org 边入边 → 上游绝对路径;出边 produces → 「你规划的子图必须有节点产出这些」),
      再接声明方 orggraph-planning 模板。只补模板的话就是又一次「声明了没人读」——
      org 图节点全是 subgraph,而 describeInputs 对 subgraph 直接返回空。
      resolveInboundLines 从 describeInputs 抽出共用,两侧口径物理上不可能漂移。
    - **清掉 404 死路径**:模板三处教的 POST /api/company/:id/work-graphs 从未注册。
      真跑复验:agent 侧零调用,改为按新 Step 7 写项目根绝对路径,还自己 require
      validateWorkGraph 预检了一遍才交回,round=1 一次过。
    - **四张骨架补 produces/needs**:从「靠模板文字施压」变成结构保证,每张过规则 6。
      真跑里 agent 照抄了 planner.json 并跟着任务删掉 sdd 节点——是改编不是复制。
    - **graph-seed 顺序依赖**:靠生产代码里已有的 GRAPH_SEED_ROOT 缝隙指向冻结快照。
      不是「跑几次都绿」结案:构造了原先必红的 churn,修前 12 次 3 红、修后 15 次 0 红。
    
    ## 我自己收的 4 条 major + 1 条 minor(都在 graph-engine.js)
    
    复验挖出「引擎自己拼的提示词在教 agent 做模板明令禁止的事」,同一条提示词里对立:
    1. 「已自行落库成功时回一行 workGraphId: wg_xxx」vs 模板「你永远拿不到真的 wg_ id,
       永远别写」。agent 没有任何受支持的落库途径,写出来必是编的,而 extractPlannedGraph
       优先匹配那个形状、查库查不到就整轮作废。删掉邀请,保留引擎解析真实 wg_ 的能力。
    2. 内联图示例的边一个 produces 都没有——agent 唯一见过的「边长什么样」是零声明的。
    3. 「端点尚未上线」暗示将来会上线,于是它还想去试一次。改成「不存在、也不会上线」。
    4. indexNodeOutputs 收集 declared 不按 role 过滤,把出边的 needs 当成本节点的产出。
       Chrome 走查实测:产品需求文档.md 落成 artifact,下游 prd 输入变 ⚠️。
       更坏的一面是错标(brd_notes.md 命中中继 needs[brd] → 归因给错的产出方)。
       1ea9efa 加的 role 列,这里正是它存在的理由。
    5. (minor) contract.prev.json(retryNode 的契约快照)被索引成 artifact 噪声。
    
    新增 guard:引擎提示词不许与模板对立(静态读源码,剔掉注释行——
    第一版把「解释为什么不许说某句话」的注释也扫进去了,量错了对象)。
    
    测试 850 全绿(83 文件),既有断言未改。5 处变异精确变红后逐字还原。
    Chrome 走查确认控制台正常分支(此前只验过降级分支):契约药丸、绝对路径、
    needs 中继说明、tab 上的 ⚠️ 计数全部渲染,零 console 报错。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • R-19.A 把 declareEdgeContract 的调用方补上之后,inboundContracts 终于非空,
    「沿边传递」这类数据流在真跑里生效了(真实规划 agent 自己在边上写出了
    produces/needs 声明)。本次收掉它留下的三个缺口。
    
    1) role 落库(第 14 次「四环漏一环」)
       normalizeContracts 产出 role,declareEdgeContract 入参没有它、表也没这列 ——
       产生 → 传递(丢) → 落库 → 读回。后果不止是控制台不精确:规则 6(data-contract)
       靠「有人 needs 但没人 produces」判错,只存 kind 就没法从库里重算,而
       patchGraph 第 5 步的重新校验读的正是库 —— 增量 PATCH 又恰恰是
       「此前满足的 needs 失去产出方」的唯一发生地,校验偏偏在最该生效的通道上失效。
       - graph_edge_contracts 加 role 列(CHECK + 老库 ALTER 后回填 produces:
         NULL 在规则 6 里既不算产出也不算需求,会误拒一张合法的图;闸门宁可漏判不可错拦)
       - 两层调用点透传 role;readGraph 把 contracts 读回来并递进 validateGraph
    
    2) 控制台三字段(前端在、后端没喂)
       GET /api/graph-runs/:id 补 edges[].contracts / companyRoot / taskFiles,
       否则 R19-C 那三块界面整块降级:声明和索引都在库里,界面上看不见。
       contracts 只在非空时出现,与 failReason 同一个约定。
    
    3) 收拢 companyRootDir/taskDirRel 镜像
       goal-contract.js 里那份镜像靠注释约定「与 graph-engine 逐字同构」维持,
       控制台路由成为第三个调用方时这个约定就不成立了。抽到 company-paths.js,
       GRAPH_RUNS_DIR 改为调用时读(原先两个模块各自在加载时快照,
       加载顺序不同会算出不同的根)。goal-contract 那条「镜像漂了就报警」的用例
       按其自身预告改成比函数返回值。
    
    测试 826 全绿(+11:role 8 / 路由 3),既有断言未改。
    11 处变异逐一验证精确变红后逐字还原;其中一条断言初版在 fixture 上永远自洽
    (图里没有无声明的边),补了一条无声明的边才真正有判别力。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • ## W11 最后一块:agent 侧的假承诺
    
    方案 (b) 此前只把 agent-chat.js 的空转喊出来了 —— 那是喊给**运维**听的。
    而 agent 读的是 system/templates/base/agent.md,那一侧还写着:
    
    - 开场「你当前默认只被挂载了 meta-research 这个元技能」—— 那个包不存在,没挂载过
    - 阶段三「*系统给你换上 meta-execute 技能时,你才会拥有修改核心文件的破坏性权限*」
      —— **纯假承诺**:权限自始至终由 config.json 的 cli.toolPolicy 决定,与 phase 无关,
      而 base/config.json 从 RESEARCH 第一秒就给了 bash 与 str_replace
    
    **一个以为自己被拦着的 agent,比知道没人拦它的 agent 更危险。**
    
    改成如实表述:开场加一段说明「技能包不存在、换装不会发生、权限全程不变、
    四段式真正给的是上下文隔离而不是权限隔离」;三处「换上 X 技能」改成
    「记忆已清空,你手上只有 <artifact>」;阶段三那句改成「写入权限从第一阶段起
    就没变过 —— 前三步不落盘是纪律要求,不是系统给你的限制」。
    
    至此 (b) 才算闭合:运维侧有告警、agent 侧不再被误导、文档侧记清了根因。
    
    ## 自动模式真跑:跑出一个结构性缺口
    
    关看门狗后自动模式接管(pause → start{mode:auto},运行中的 run 要先暂停才能切模式),
    它自己把 brd 之后的节点接上跑。结果:
    
    - brd → success(产出 brd.md + contract.json)
    - prd → **fail(impl_bug)**,run 收敛 blocked,预算 calls 3/100 tokens 52,096
    - worktree 零污染(与跑前逐行一致)
    
    prd 自己的归因说清了原因,而且是对的:**它拿不到上游的产出**。
    brd 的 brd.md / contract.json 躺在**它自己的私有目录**里,
    而共享区 artifacts/ 只有 project-root.json 与 task-goal.json ——
    同一张 work graph 内部**上游→下游没有任何数据通路**。
    
    这不是引擎 bug,是 §四.A.5 设计里只做了「跨 org node 走 artifacts/ 共享区」,
    没做「同图内相邻节点怎么把 contract 交出去」:CONVENTIONS §12 的隔离原则是
    「下游只能看到上游的契约、看不到实现」,但契约被写进了私有目录,
    下游同样读不到;而写 artifacts/ 是只给验收契约产出者的特权动作。
    
    W12 补完在这一轮同时得到验证:fail_reason=impl_bug 落库,概览 tab 显示
    「[归因产出] impl_bug」+ 完整 remediation_note,不再是「失败、无原因」。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 测试 786/786 全绿(76 文件,起点 760/72),未改任何既有断言。
    
    ## 本轮三件新东西,全部经真 CLI 验证
    
    W12 补完 · 失败原因四环打通
    - 引擎自判的失败(executor 抛异常、边界越界、子 run 无归因)现在也落
      graph_run_nodes.fail_reason,不再只有 agent 归因产出的才有值
    - 概览 tab 展示「[引擎判定] boundary_escape」+ 终端样式 excerpt,
      取不到 fail_reason 时回落 output_excerpt,并标明来源
    - 真跑实查:两行 fail_reason='boundary_escape' 都在库里,
      产生→传递→落库→读回四环在真 CLI 下走通
    
    W13 · 运行态文件根治(守卫误判的根因)
    - 17 个 todo.md / plan.md / scheduled_tasks.json git rm --cached + gitignore;
      源码(agent.md/config.json/soul.md/tools.md)一个未碰,模板本体仍跟踪
    - _registry.json 的 usedCount 挪进已忽略的 data/template-usage.json
    - 真跑验收:整轮(agent-creator、Master 各一次真 CLI、3 次 hire)结束时
      worktree git status 与基线逐字相同,_registry.json 零 diff
    
    单步进度感 · 真 CLI 一个节点 3-7 分钟
    - 画布卡片秒表 + 详情面板常驻条「运行中 2m40s · 最近事件 …(2m40s 前)」
    - 不做假进度条:引擎不知道 agent 还要多久
    - 顺手修 NodeDetailPanel 不跟 SSE 走(否则秒表也不会动)
    
    W9 失败上下文进提示词、W10 跨层地址两半、W11 Hot Swap 显式告警同批完成。
    
    ## 真跑结论:链路更长,但「work 节点 → success」仍未跑到
    
    走到:orggraph-planning 落图自雇 → agent-creator 补定义 → workgraph-planning
    真跑规划 + **先雇后提交**(W5/W6 再次成立)→ 子 run 起来 → work 节点 RUNNING
    → 7m19s 后 fail。两层原因叠加,都与 W1-W14 无关:
    
    1. **新缺陷**:agent-manager.js:324 把 idleTimeoutMs 硬编码 120s,
       readme-writer 通读源码静默超 2 分钟被掐死(动笔前就死了)。
       同进程 ClaudeCliProtocol 早把自己的 idle 上限放到 24h,
       stream-executor 的 JSDoc 默认值写的是 30 分钟 —— 这里把两者都压掉一个数量级;
       且 ...options 透传的 idleTimeoutMs 会被下一行覆盖,调用方无法覆写。
    2. **并行 agent 污染**:retrain-watchdog 每 5 分钟唤起的 Master 在同一工作树里
       改了两个源文件,被守卫 git status 差集算到该节点头上 → 额外署 boundary_escape。
       这是 W3「拦不住」第 5 条第一次真实发生。
    
    顺带记一笔:这一轮任务是 **LemonBoss 自己的 Master 自主下的单**,
    走的正是 POST /api/company/:id/tasks,它还自行诊断出了上面那个 idle timeout
    并动手改(引用了未定义的常量,是坏的)。
    
    ## 已知未修(下一轮)
    
    - idleTimeoutMs 硬编码 120s —— 「work 节点 → success」跑不通的唯一技术原因
    - W7 在**零边最小图**上失效:判据③要求存在 active org_graph_edges,
      零边图上三条判据全落空,work 层本体被写进 org_graph_nodes。
      服务层那 9 例测试造的都是有边的成型图,正好绕开这个形状
    - 前端 ACTIVE_RUN 含 blocked、后端 ACTIVE_ROOT_RUN_STATUS 不含:
      一家公司只要失败过一次,控制台上就再也下不了第二个任务(后端其实放行)
    - 真跑期间工作树里不能有第二个 agent 活动,否则守卫判罚不可信 —— 应写进真跑规程
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 真 CLI 冒烟(worktree 隔离,PORT 3010)九轮来首次把 work 节点跑起来:
    orggraph-planning 真跑 3 分钟自主裁成单 org node 零边图 → workgraph-planning
    第 1 轮产出合法图 → **自己按 Step 6 把 brd-planning / planner-validator 雇进公司**
    (W5/W6 核心验收成立,且 W7 判据生效、两者都没写进 org_graph_nodes)→
    第一个 work 节点 brd-planning 真起 CLI 子进程,产出 brd.md / contract.json /
    attempt-0.json 全部落在 run 目录内。图内预算仅 2 次调用 / 13998 tokens(上限 15)。
    
    W5/W6 · workgraph-planning 自雇:撤掉「你不招人也不辞人」,Step 6 加招聘环节,
      写死「先雇、再提交图」的顺序,给出失败分级与幂等要求
    W7 · work 层招聘不写 org_graph_nodes:按 type 与 work graph 骨架点名两条判据区分层级,
      P2 「hire org 角色 → org graph 出现该节点」的语义保持不变
    W8 · 控制台「规划组织结构」按钮(抽成 ReplanOrgGraphButton.vue,带过渡态与秒表),
      接 POST /:companyId/org-graph/replan(该端点此前无任何前端调用方);
      新增 fixtures/devloop-mock/orggraph-planning.json
    W12 · 节点失败留痕:node.output 带 output_excerpt、新增 node.error 事件。
      真跑当场救场——守卫误判那条归因正是靠它才查得出来,
      换成之前看到的只有「节点 fail、无原因、无痕迹」
    
    测试 753/753 全绿(71 文件,起点 736/68)。
    
    已知未修(下一轮):子 run 转终态不回写父 node_run 导致任务永久卡死;
    applyBoundaryGuard 用整仓 git diff 判归属会把并行 agent 的写算到当前节点头上;
    W12 的 fail_reason 未落库(概览 tab 仍为空);POST /:cid/tasks 无前端调用方。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »

  • 测试 736/736 全绿(68 文件,起点 719/66,净增 17 条,未改任何既有断言)。
    
    W1 · seed 接进启动流程 + 悬空行回收
    - server/index.js 与 agent-server.js 均在 listen() 前调 runStartupSeedSafely()
      (幂等、失败降级记日志、不挡服务启动)
    - seedTemplates() 此前**没有任何运行时调用方**,只有测试与手动脚本引用,
      于是 system/templates/ 新增本体永远进不了 system_agents,而
      work_graph_nodes.system_agent_id 是指向该表的外键
    - 占位 id 回收:legacy_path 已失效的 company_hired 行改为可被 template 就地转正,
      保留行 id 以保外键。此前 seedTemplates 遇占用即 skip,导致污染不可逆:
      lookupSharedAgentMd 恒 null → hire 静默退回全量拷贝 → 模板改动对已雇公司不生效
    - 生产库实查:company_hired 0 行(原 10 条悬空全清)、template 45、
      verifyCounts().ok=true、foreign_key_check 空
    
    W2 · 项目根分配(四环闭合)
    - ensureProjectRoot 复用 path-resolver.allocateProjectRoot(sandbox 模式)
    - 分配 → 进 agent_call 与 planning 两处提示词 + callAgent metadata
      → 落 artifacts/project-root.json(wx 独占)→ readProjectRootRecord 读回
    - 子 run 经 createRun 继承 root_run_id,跨层共享同一项目根
    - 核实 data/companies/ 在 .gitignore 内,故项目根内的合法写入不会被 W3 守卫误报
    
    W3 · 产出边界守卫(部分,文档如实标注)
    - 真 CLI 是子进程直接写盘,引擎拦不住,守卫只能拒收结果、不能回滚
    - 7 条「拦不住」的情形逐条列明;文档自述「在 cwd 隔离做掉之前,
      真跑仍应在可丢弃的工作副本里做」
    
    W4 · 修验收 fail-open(性质严重)
    - benchmark-validator / testdata-validator 的 Step 表教 agent 写 verdict:"fail",
      而引擎 FAILING_VERDICTS={attributed,inconclusive} 不含它 → 契约非法的产物
      被判 success 放行。失效方向是放行不是拦截
    - org-validator 的审计字段 verdict → audit_verdict:它与 work 层判词写同一路径
      (nodes/<nodeRunId>/attempt-<n>.json),此前只靠「该节点恰好是 subgraph」
      才没被 readNodeProduct 当判词读,属隐患藏在巧合里
    - 新增防线 template-verdicts.test.js,从 graph-engine.js 源码取
      FAILING_VERDICTS / ATTRIBUTION_REASONS 扫全部模板;经三次变异验证有效
      (改回 "fail" / 改回 verdict / 造 "ok" 均变红并报精确行号)
    
    真 CLI 冒烟未执行,两条理由(终验 agent 自行判断,符合任务给的门槛):
    ① W3 按其自身文档明确「不是沙箱」且要求真跑在可丢弃副本里做,而当前是主仓库、
       持有未提交交付物、且有并行 agent 在写,W3 自述的误判项必然触发;
    ② 断点已零成本静态证明:getAgentConfig 解析裸名只查 system/agents/、
       从不查 system/templates/,resolveAgentName 不做按需 hire,实测 prd-planning /
       sdd-planning / benchmark-validator / testdata-validator / validator-triager /
       org-validator 全部 throw「Agent not found」。花 $3-8 复现已知断点无意义。
    故「做完这四件就能真跑」不成立,真跑挪到 W5/W6 之后。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 界面走查(真 server + HTTP + 真 AgentManager,底层 mock 协议)已把
    manual 模式全流程点通:org 节点起子图 → 下钻 work graph → 单步 →
    第 3 步触发回退(徽标 0/3→1/3、run 级 1/5 双层计数同时可见)→
    归因记录与 remediation_note 完整送达 → 收敛后父节点结算、左栏前移。
    
    mock 侧补两处缺失接线(都是「四环漏一环」,非新功能)
    - ClaudeCliProtocol._sendMockPrompt 按 agent 类型查 fixture:图执行侧的
      agent 名带公司前缀(resolveAgentName 返回 {cid}:{id}),fixture 不该
      按公司复制一份。DevLoop 侧名字不含冒号,行为不变
    - graph-engine.defaultAgentExecutor 接住 mock/files 事件:此前只有
      DevLoop 的 loop-controller 接,图执行侧没接,于是 mock 下
      readNodeProduct 永远找不到 attempt-{n}.json,validator 系节点恒 blocked。
      写入限制在节点产物目录内,越界丢弃并留痕
    
    新增 5 份 P3 fixture(workgraph-planning / prd-planning / sdd-planning /
    coder-validator / validator-triager),coder-validator 用 sequence 演示
    一次回退。图必须放 chunks 不能只放 result——callAgent 的 output 来自
    流式 chunks,session/result 的文本不进 output。
    
    控制台入口:CompanyDashboard 加「🕸️ 执行控制台」按钮(路由早已注册,
    此前无任何入口,只能手敲 URL)。
    
    scripts/p3-demo-setup.js:手工测试准备脚本(雇人+写图+起 run),头部
    写明它是两个已知缺口的绕行,缺口修好后第 1 步即可删。
    
    _registry.json 补齐 6 条本体登记(brd/prd/sdd-planning、goal-benchmark、
    benchmark/testdata-validator)——同轮新增的 template-refs 防线测试正是
    因为缺这 6 条而变红,防线抓到了「交付与报告不符」。
    
    文档
    - 27-REQ R-18:招聘归 workgraph-planning(方案 a)、停用 mock 改真 CLI
    - 27-P3B 真实运行前置(新增):11 个工作项分三批,含现状核实 10 条证据
      (seedTemplates 无运行时调用方、10 条悬空 company_hired 行、
       FAILING_VERDICTS 不含 "fail" 导致验收假放行等)
    
    测试 719/719 全绿(66 文件)。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • ■ 关于编号
    原「P4 回退 + Loop-Validator」已并入 P3 实现完毕(c3abf4a:双层熔断、五项结构
    校验含 fail-fallback-edge、三层暂停级联、contract_hash 重试判据)。本文档回收
    这个空出来的编号,装 P3 明确排除、现在成为最大能力缺口的内容。
    
    ■ 核心:fan-out 并行
    P3 把图结构和 join 语义都做好了,唯独没做并行本身:
    - graph-engine.js:1078 出边评估「所有入边满足才置 ready」——fan-in join 正确
    - graph-engine.js:908  拾取 SQL 是 LIMIT 1——三个并行分支只会一个个串行跑掉
    
    设计为 advanceBatch(runId, {maxConcurrency}),不新增第二个推进原语:
    手动模式 maxConcurrency=1 时行为与今天的 advanceOne 完全一致,P3 已有调用方
    和测试不用改;自动模式一次拾取整批。批量拾取必须在一个事务里一次性置 running,
    否则两个并发 advanceBatch 会拾取到重叠集合。
    
    ■ 走查发现的关键事实:隔离挂载点已经存在
    session-pool.js:29 的 getKey(agentName, agentConfig, workDir, scope) 签名里
    早就预留了 scope 参数,但第 45 行实际调用时没传。所以「同一 agent 多实例隔离」
    这个并行前置条件的改动量比预想小得多——用 graph_run_nodes.id 作 scope 即可。
    
    连带要放宽 CONVENTIONS §12 第一条不变量:(pid, agent) → (pid, agent, scope)。
    这是 P4 里唯一要动 DevLoop 规格的地方,且 _spec/ 是生成物,必须改 HTML 后跑
    npm run spec:extract。该放宽同时是 P6 的前置——DevLoop runProject 波内串行
    (loop-controller.js:609 注释「串行跑」)正是被同一条不变量挡住的。
    
    ■ 产物统一目录 + files.json
    这是此前提出但一直未实现的需求。按 task 分目录
    data/companies/{cid}/tasks/{taskId}/,根目录 files.json 作统一检索索引,
    由引擎在产物落盘后自动追加(不靠 agent 自觉写,否则索引必然漂移),
    并支持从 graph_run_nodes 行 rebuild。与 output_ref 不重复:后者是节点级指针,
    前者是公司级聚合视图,由前者派生。
    
    ■ 三个阶段,C 完全独立
    A 隔离(T1-T2) → B 并行(T3-T6,T10);C 产物索引(T7-T9) 与 A/B 无依赖,可最先做。
    
    并发上限对齐 plan-cost-concurrency.md §④ 的既有数字(run≤5 / 公司≤3 /
    单机≤20 session),不另立一套。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 命名轴是「节点在哪一层图里」,把散落的老 agent 归到它实际所处的层级:
    
      innovator → org-innovator      type='cxo',是 org graph 层的节点
      hunter    → innovator-hunt     innovator work graph 第 1 阶段
      digester  → innovator-digest   第 2 阶段(输入是 hunt 产出)
      evolver   → innovator-evolver  第 3 阶段
    
    依据:retrain-pipeline.js 的 stepConfigs 就是按 hunter → digester → evolver 顺序
    跑的,行 231 明写 steps: ['re_hunt','re_digest','evolve'] —— 这三个本来就是
    innovator 的 work graph 三阶段,只是名字没体现出来。
    
    ■ 迁移(scripts/migrate-agent-naming.js,--dry-run + 幂等可重跑)
    - 8 个目录(system/agents/ + system/templates/),用 git mv 保留历史
    - system_agents 表 4 行的 id 与 legacy_path
    - 公司实例目录与 company.json.agents[](本次无公司雇过这四个,实际 0 条)
    
    ■ 代码引用点(5 处,手工改)
    - retrain-pipeline.js: stepConfigs 的 agent 字段 ×3、agentToStep 映射的 key ×3、
      call_sub_agent 的 evolver 判断
    - agent-chat.js: agent 列表过滤里的 innovator
    - company.js: 模板训练触发的 agentId
    
    ■ 刻意不动的三类同形异义(改了会坏)
    1. skill 内部子目录名 {skillDir}/hunter/knowhow.md —— 那是 hunt/digest/evolve
       三阶段的产物目录约定,与 agent 名同形但不同义。涉及 open-api.js:402、
       retrain-pipeline.js:148/374、evolution-loop.js:178、sync-skills.js 的 INTERNAL_DIRS
    2. skill 命名空间白名单 —— skill-dir-manager.js 的 CORE_SKILLS、
       migrate-trained-skills.js 的 SYSTEM_SKILLS,那里的 'innovator' 指同名 skill
    3. conversations/ 与 system/tasklog/ 下的历史记录 —— 运行态数据,不改写历史
    
    evolver-youtube-crawler 按 §3.4 列为待定,迁移脚本按精确目录名匹配,未误伤。
    
    这四个重命名顺带解决了 27 号文档 §七 挂了很久的 6 个命名冲突 id —— 重命名后
    system/agents/ 与 system/templates/ 下不再有同名目录(只剩 agent-creator 与
    evolver-youtube-crawler 两个,前者是基础设施角色按规则不改名)。
    
    验证:npm run test:unit 693 全绿(64 files);test-company-e2e 114/114;
    迁移脚本二次执行 dirs=0 dbRows=0 skipped=8(幂等)。
    
    未触碰另一进程正在进行的 P3 文件(graph-engine.js / graph-run-sse.js /
    work-graph-db.js / 27-p3-p4-work-graph-console.md / 27-requirement.md)。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 按 27-p3-p4-work-graph-console.md v0.3 实现,三轮开发+校验后测试全绿
    (693/693,P2 26/26、DevLoop 230/230 未被打破,web:build 干净)。
    
    服务层
    - work-graph-db.js  定义层(work_graph_*) + 运行时层(graph_runs/graph_run_nodes/
      graph_run_loop_records) 五张表;状态转换表照 unit-registry 模式;
      复用 org-graph-service 四项校验 + 新增第五项 fail-fallback-edge
    - graph-engine.js   advanceOne 幂等原语;agent_call / subgraph 两种 executor;
      手动与自动共用同一原语;双层熔断(单边 loop_count + 按 root_run_id 共池的
      backward_count);任务级预算挂 root run;三层暂停/停止级联;
      重试按 contract_hash unchanged 判据
    - graph-run-sse.js  按 run_id 广播,状态转换+timeline+SSE 三者原子化
    - goal-contract.js  验收契约格式与执行器(R-15.6 验收先行)
    
    引擎泛化(R-15.4):org graph 与 work graph 走同一套 advanceOne,
    定义层两套、运行时层一套,三层下钻用 parent_run_id 链。
    
    R-16 失败归因:validator-reflection 专职归因节点;fail_reason 多边路由
    (精确匹配→兜底边→死路);子 run 收敛透传 success/fail + fail_reason +
    remediation_note 三值;infra_flake 不烧任何计数。
    
    路由 / 前端 / 模板
    - routes/graph-run.js 八个端点;company.js 任务入口
    - WorkGraphCanvas.vue 扩展 UnitsDAG(subgraph 角标、backward 虚线曲线、
      N/3 循环徽标、异常流程视觉降权);GraphConsole.vue 三栏 + 四 tab 详情
    - 五个新 agent 模板:validator-reflection / org-validator / planner-validator /
      coder-validator / workgraph-planning
    
    命名统一(R-15.3 + NAMING §三):org 节点改为 org-{职能},
    三个 org-graph 模板末节点收敛到 org-validator;org_graph_edges 加 fail_reason
    列并把唯一索引补上该列(避免精确边与兜底边互相吞掉)。
    
    三轮校验修掉的主要缺陷:subgraph 重跑不起新子 run 导致永久死锁;
    SSE/timeline 零调用方;org 侧 fail_reason 写入被丢弃;fail-fallback-edge
    只做了一层;backward_count 跨 run 树重置架空熔断外层;
    seedEntryNodes 误点亮只有 fail 入边的节点。
    
    已知缺口见后续提交:remediation_note 仅在 backward 边落库、
    total_tokens 预算维度无生产方。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 命名轴从「业务领域」({domain}-{职能}) 改为「所在图的层级」:
      org graph 节点   org-{职能}              org-planner / org-coder / org-validator
      work graph 节点  {父 org 节点全名}-{职能}  org-coder-validator
    
    三个模板因此首尾同名,只有中段职能不同——规划和验收本身不分领域:
      dev      org-planner → org-coder   → org-validator
      content  org-planner → org-writer  → org-validator
      ops      org-planner → org-monitor → org-validator
    
    ■ NAMING §三 补上此前完全缺失的一条轴:节点名 ≠ 本体名
    R-15.3 指出的关键区分。禁止裸用 validator 的理由是「一家公司内两个节点不能
    重名」,该理由针对节点、不针对本体。本体若被迫带前缀,coder-validator 会复制成
    org-coder-validator / content-coder-validator 多份,与 P1「同一份本体、多处引用、
    各自私有语境」直接冲突。落到 schema 上就是 node_name / system_agent_id 两个字段。
    
    同时写入 §3.3(三个 validator 是三个独立本体,验的东西本质不同,与 §八bis
    「不特化」原则不冲突)与 §3.4(存量 agent 归位:innovator→org-innovator、
    hunter→innovator-hunt、digester→innovator-digest、evolver→innovator-evolver,
    依据是 retrain-pipeline.js 里三者就是 innovator work graph 的三阶段)。
    §3.4 顺带解决 27 号文档 §七 挂了很久的 6 个命名冲突 id。
    
    ■ 代码层已改
    system/org-graph-templates/{dev,content,ops}.json + README、
    system/templates/orggraph-planning/{agent.md,tools.md}
    
    ■ 代码层未改(已在 §3.4 末尾标注)
    §3.4 的四个存量 agent 重命名需要单独一次迁移(目录改名 + system_agents 表 +
    retrain-pipeline.js 等引用点),本次未做。
    
    验证:三张模板图改名后实跑 validateGraph 仍全部通过四项校验;
    npm run test:unit 676 全绿;test-company-e2e 114/114。
    
    未触碰 27-p3-p4-work-graph-console.md(另一进程正在做 P3 开发,且其中命名已符合
    R-15.3)与 27-requirement.md(原文照搬文档)。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »

  • 用 9 个并行 agent 按「文件独占」划分实现 P2 的 T1-T9(T0 已于 2255f09 完成)。
    详见 docs/todo/system-design/27-p2-org-graph.md §五。
    
    阶段 A · 数据层
    - graph-db.js: org_graph_nodes 加 status/reports_to_node_id(PRAGMA 探测后 ALTER,
      幂等);全量唯一索引换成 WHERE status='active' 的部分索引,使「fire 后重新 hire
      同角色」可行;org_graph_edges 重建为执行流边(condition/edge_kind/status)
    - graph-service.js: ensureOrgGraphNodeIndex 同步改建部分索引,且 upsertOrgGraphNode
      的 ON CONFLICT 必须写成 ON CONFLICT(company_id, role_name) WHERE status='active'
      —— SQLite 的冲突目标要与部分索引谓词逐字对应,否则整条 INSERT 直接失效
    - org-graph-service.js(新): validateGraph 四项校验 + writeGraph/patchGraph/
      getGraph/removeNode,事务化,节点软删除级联失效相关边
    - routes/company.js: 四个端点 POST/PATCH/GET /org-graph + POST /org-graph/replan;
      /create 接入自动招聘 orggraph-planning + 异步触发(失败降级为空壳公司);
      /fire 接入节点软删除
    
    阶段 B · 自动生成
    - system/org-graph-templates/{dev,content,ops}.json + README:三张三段式骨架
      (规划→执行→验收,验收失败回退到执行节点),角色名遵循 {domain}-{职能}
    - system/templates/orggraph-planning/:新 system agent(type='meta-bootstrap'),
      含 §4.1 八步工作流
    - company-service.js: 模板不存在时从 system/templates/base/ 元 agent 继承骨架
      (自动带 RESEARCH→PLAN→EXECUTE→VERIFY 四段式)+ agent-creator 填充,
      新建 agent scope='company'。这是 27-E2E §八bis 元 agent 继承的落地点
    
    阶段 C · 展示
    - CompanyDashboard.vue: 组织流程拓扑链渲染 + 空态降级 + 环深度保护
    
    并行编排中发现并修复的三处(均不在原任务划分内):
    - AppNav.vue 建公司表单缺 goal 输入框 —— T0 只改了后端,前端表单没同步,
      company-goal 实际传不进来。这是上一轮 T0 的遗漏
    - graph-seed-service.js 会把 type='meta-bootstrap' 的 orggraph-planning 塞回
      org graph,与 hire() 的 guard 不一致
    - graph-agent-p1-acceptance.test.js: hire 未知角色的返回从 needs_training 改为
      hired_from_base(T5b 的行为变更),断言同步
    
    验证(独立复核,非 agent 自述):
    - npm run test:unit 676 passed / 63 files(基线 652,+24 为新增的 org-graph 用例)
    - npm run web:build 通过
    - 三个模板 JSON 实跑 validateGraph 全部通过;四类非法图各自被对应 rule 拒绝;
      writeGraph→getGraph→removeNode 级联验证通过(删中间节点后 3 条边全部失效)
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • 四处写 _registry.json 的地方都用 JSON.stringify(registry, null, 2) 直接落盘,
    不带末尾换行。文件在仓库里是带换行的,导致任何一次 hire()/depositTemplate()/
    模板增删改之后,git diff 都会多出一行 "\ No newline at end of file" 的噪音,
    把真实的数据变更淹掉。
    
    写入点:
    - company-service.js:374  depositTemplate()
    - company-service.js:824  _updateTemplateUsedCount()
    - routes/company.js:86    PATCH /templates/:templateId
    - routes/company.js:120   DELETE /templates/:templateId
    
    同时提交一次真实的运行时数据变更:qa-judge usedCount 7 → 8。
    
    Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »
  • …_DIR move, stray files
    
    - CLAUDE.md: document DevLoop subsystem (spec-first workflow, project root/git-vault,
      mock mode, L1 loop, unit layout, audit trail) and add missing test commands
    - server/routes/agent-chat.js, server/services/task-service.js: TASK_META_DIR moved
      from system/agents/.tasks to system/tasklog
    - system/agents/master/.claude/scheduled_tasks.json: scheduled task state update
    - remove stray memory/daily/2026-04-02.md and a garbled-filename artifact left under
      system/agents/digester-youtube-crawler/
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »

  • Final P0 deliverables to make the system bootable in mock mode and
    pass `scripts/phase0-verify.js` + `scripts/phase0-test-call.js` end-to-end.
    
    ClaudeCliProtocol (mock mode):
    - LEMONBOSS_CLAUDE_MODE=mock or { mock: true } in constructor enables
      mock mode. connect() becomes a no-op; sendPrompt reads fixtures from
      fixtures/devloop-mock/{agentName}.json and emits scripted session_update
      chunks + session/result(mock=true). Falls back to default.json.
    
    Agent registry:
    - 6 entries added to system/templates/_registry.json (devloop-pm,
      devloop-architect, devloop-coder, devloop-tester, devloop-integrator,
      devloop-triager).
    - Per-agent dirs system/templates/devloop-{role}/ with:
      * prompt.md   — auto-extracted from agents-{role}.html §2.2
      * config.json — cli.toolPolicy.allowedTools + sandbox.writeAllowList
    
    Tooling:
    - scripts/extract-agent-prompts.js  — regex-extracts §2.2 system prompts
      from 6 agent HTML pages to system/templates/devloop-{role}/prompt.md.
    - server/src/tools/devloop/index.js — central export (tools Map,
      bashHooks, dispatch).
    - server/src/core/devloop/loop-controller.js (P0 skeleton) — exposes
      createProject (sandbox alloc + git init + first commit + timeline) and
      commitAfterAgent (per-agent kind-routed git commit + timeline event).
    
    Mock fixtures:
    - fixtures/devloop-mock/default.json + devloop-pm.json
    
    Acceptance scripts:
    - scripts/phase0-verify.js   — 8 static checks (35 tools loadable,
      6 agents registered, prompt+config wired, bash guard exported, services
      require, fixtures present, git-vault interface, loop-controller).
    - scripts/phase0-test-call.js — 7 end-to-end steps under mock mode
      (createProject → CLI connect → sendPrompt chunks → no-op commit returns
      null → real write commits → git log ≥2 → timeline has both events).
    
    vitest.config.js: include packages/**/*.test.js so the mock smoke test
    runs in the suite.
    
    Results:
    - 162/162 devloop + acp-core tests pass (up from 159).
    - phase0-verify: 8/8.
    - phase0-test-call: 7/7.
    
    Specs: docs/prd/newfunction/_spec/plan-migration.md · Quick-Start step 7
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    yibo authored
     
    Browse Dir »


  • 1. Evolver agent.md: Added token budget rules
       - No re-reading unchanged files between iterations
       - Use head/grep instead of cat for large files
       - Concise output only (scores + diff summary, no full SKILL.md)
       - Cap at 5 iterations per session (was 10)
       - Early stop if score change < 2 points for 2 consecutive rounds
    
    2. agent-chat.js: System prompt size guards
       - MAX_PROMPT_FILE_SIZE = 15KB per file (auto-truncate with warning)
       - MAX_TOTAL_PROMPT_SIZE = 100KB total (safety net)
       - Prevents runaway files from inflating context ever again
    yibo authored
     
    Browse Dir »
  • Root cause: heartbeat.md instructed Master to append inspection logs to
    plan.md on every heartbeat, causing plan.md to grow to 209KB (2922 lines
    of repeated 'status stable' logs).
    
    Changes:
    1. Truncated master/plan.md from 209KB to 7KB (kept pipeline records,
       removed 2800+ lines of repeated heartbeat logs)
    2. Updated heartbeat.md rules:
       - Banned appending inspection logs to plan.md
       - Added token budget awareness (10KB file read limit, prefer grep/find)
       - Normal heartbeats should reply '[心跳正常]' without using tools
    yibo authored
     
    Browse Dir »