• swept=0 时原来完全不打日志,导致"扫描确实跑过但没找到"和"扫描压根没
    跑起来"在日志里长一个样——这正是本次要修的那类静默失败。改成不管
    swept 是否为 0 都打一行,运维靠这行就能确认扫描器真正跑起来了。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • resumePendingGoalValidations 只补「收敛钩子跑过、卡在验收/汇报半路」的情形;
    若钩子压根没被触发过(进程重启/异常吞掉/事件丢失),task 早到终态但 goal
    永远停在 active,只能靠人工 OKR 巡检发现(e2e-demo 公司 G-mt2r62ia-73af 卡
    了 48 小时)。新增 sweepStuckActiveGoals 开机全量扫描一次,并启动 5 分钟
    周期性 startZombieGoalSweeper 兜底,把发现窗口从「天」压到「分钟」。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »

  • 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 Code »
  • 独立试验节点,不接入任何真实公司/图。真实 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 Code »
  • 在 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 Code »
  • 两个独立的小修复,都是这次 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 Code »
  • run_b962ea87f58f 卡在 wallclock_ms 耗尽的锚点未结清问题上,需要人工追加预算
    才能继续。extendBudget 只增不减、只加到已配额的维度上,追加时顺带结清卡死的
    墙钟锚点(否则 startRunSync 一启动就把挂起时长记进新预算里)。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • yibo authored
     
    Browse Code »
  • 30 号文档记录的真实事故:org-coder-test 被上游 missing_required_input 打回后,
    产出的是「建议重跑 org-coder-validator」的诊断文件而不是正常测试结果,引擎把诊断文件里
    的 infra_flake 标记当成了这个节点自己的执行结果——infra_flake 原地重跑故意不烧
    attempt/backward_count("这不是节点的错,不该烧它的重试额度"),代价是它是唯一没有
    熔断线的失败路径,真撞上了一次每轮产出雷同、永不停止的死循环,眼看着把任务预算耗光。
    
    新增 graph_run_nodes.infra_flake_count 列,只在 infra_flake 原地重跑时累加,真正发起
    新一轮真实派发(bumpNodeAttempt)时清零;连续判 infra_flake 超过硬顶(3,与
    LOOP_HARD_CAP_EDGE 同量级)就不再原地重跑,改判 blocked 交给人工——不猜该走哪条
    fail 边(infra_flake 这个取值域通常没人给它连边)。新增回归测试锁死"永不恢复的
    infra_flake 在硬顶后停止重跑"这条行为,graph-engine 相关 10 个测试文件 94/94 通过。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 招聘自动训练与「重新训练」按钮都是给 org-innovator 发消息、由它去执行训练,
    所以对话记录一直落在 org-innovator 的会话库里,而不是被训练的那个 agent 自己——
    conversationId 里带目标 agent 的名字只是命名巧合,容易让人在错的 agent 页面下找不到记录
    (今天实测:手工模板训练页删除前产生的一条记录就复现过这个问题)。
    
    - company.js /hire:训练 conversationId 提前算好并通过 res.json 带回给前端
      (不再等 setTimeout 回调里才生成,那时响应早发完了)
    - CompanyDashboard.vue 重新训练按钮:发完请求立即 window.open 到正确的
      /agent/org-innovator/{convId}
    - CompanyDashboard.vue 招聘弹窗:雇佣触发自动训练时,弹窗给出可复制的正确链接
      (不自动开新标签页——这条训练要等 agent-creator 先写完定义,立刻打开大概率是空的)
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 在 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 Code »
  • 24h 的"取消超时"曾是刻意为之,但代价是子进程已产出终态判词、仅 session/result
    消息迟迟不来时,sendPrompt() 的 promise 没有任何兜底会挂到 24h 耗尽
    (T-mt5esage:T-mt5d3mi9-57cf 卡 50+ 分钟才被 COO 心跳巡检发现,且已连续 3 次)。
    
    收紧到与 process-guard.js FRESH_DEFAULTS.maxMs(10min) 同一量级:对话态 8min
    (无工具执行理应持续有 token 流),工具执行态 15min(跑测试/构建允许更长静默)。
    补测试复现"tool_use 开始后无输出"场景,验证 15min 兜底生效而非 24h。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • POST /:cid/tasks -> enqueueTaskRun 入队时从未写过 assignee_agent_id,
    COO 心跳巡检靠 tasks.assignee_agent_id(the "to" field) 判断任务有没有
    人接手,读到永远的 NULL 就把正常跑图的任务误报成孤儿任务
    (本周已发生两次:T-mt25asz4、T-mt5d3mi9-57cf)。
    
    - enqueueTaskRun 入队时补写占位哨兵 'org-graph'(GRAPH_TAKEOVER_ASSIGNEE)
    - settleTaskFromRun 收敛时用 COALESCE 兜底,只在仍为空时补,不覆盖
      派单式任务(agent-chat dispatch 流程)已经写好的真实 assignee
    - TASK_PATCH_COLUMNS 补上 assigneeAgentId,否则 updateTask 写不进这列
    
    T-mt5dkvjm
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 侧栏 170px 太窄看不全 agent 名字,改成 260px 并把名字从省略号截断
    改成允许换行;顶部加搜索框按 name/id 过滤列表,点击过滤结果复用
    已有的 switchAgent() 跳转逻辑,不用额外写定位/滚动代码。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 新建独立试验节点 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 Code »
  • system/templates/ 已在 28 号文档的合并里并入 system/agents/,「模板」作为独立
    数据概念已经消失;确认后手工 CRUD 页面(创建/改名/删除骨架、触发生成与训练、
    传 skill 文件、provision)也已经没人用,一并下线:
    
    - 前端:删 AppNav「Templates」菜单项、/templates 路由、TemplateAgents.vue
    - 后端:company.js 删掉只服务于该页面的写接口(PATCH/DELETE/POST /templates、
      generate/train/skills-upload/provision/files 系列),保留 GET /templates
      (CompanyDashboard 招聘弹窗和 CLI `company templates` 命令仍依赖它列出可招角色)
    - CLI:bin/lemon.js 删 `template create`/`template train`(调用的是被删接口)
    - 修正两处过时注释(company-service.js / graph-service.js):不再声称
      buildAgentDefinitionBrief 有两个调用方,/hire 是唯一派单点
    - work-layer-body-paths.test.js 同步更新断言(2 处调用方 → 1 处)
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • _scanConversationsDir 塞进 list 的字段是 conversationId,getTaskTimeline
    过滤时却读 c.convId(始终 undefined),传进 _extractTaskId 后
    convId.includes(...) 直接抛 TypeError,导致 /api/tasks/:id/timeline
    每次调用都 500,前端任务详情页因此看不到任何日志。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 此前只有人类对话路径 agent-chat.js 会写 memory.md,图执行的验收反馈从不进
    memory.md,Dream 天天扫全是空转。runClaimedNode 结算后新增 recordNodeOutcomeMemory
    桥接点,只在真派发(isRealDispatch)且 systemAgentId 对应本体已雇佣(bodyDir 存在)
    时才记一行 success/fail 摘要,避免测试夹具/假 executor 用例把假地址写进真实
    system/agents/ 目录。memory-service.appendToMemoryMd 补 mkdirSync,因为这条新调用方
    不像既有的 saveSessionSummary 那样先建过 memory/ 目录。
    
    从原本混在墙钟看门狗改动里的工作区 diff 中拆出,两个特性互不相关。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • manual 模式没人点「下一步」、auto 驱动循环随进程重启丢失时,run_status='running'
    的 run 再也不会触发 checkBudget,wallclock_ms 超时无人发现(实例:T-msx6toej 卡
    135 小时才被人工揪出)。新增 sweepWallclockBudgets + 60s 兜底定时器
    startWallclockWatchdog,复用既有 checkBudget/suspendRunTree 路径,接入点在
    index.js DISABLE_BACKGROUND_AGENTS 早退之前。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »

  • 用户问"当前 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 Code »
  • 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 Code »
  • 补记 commit fadb6fa 的实现记录:证据闸门选了"拦截"不是"降级"(降级等于还是采信
    了分数,只是换个说法);goal-benchmark.json schema 完全不用改,evidence 早就是
    benchmark-validator/agent.md 教的既有字段,只是从没被 goal-contract.js run 读过,
    让 runBenchmark 多看一眼姊妹判词文件即可,没有发明新格式;C 的实现只更新了真正
    写分数/证据的 benchmark-validator,不是最初以为的 coder/unit-tester。
    
    §三推进顺序标注全部完成,并记录了样本量不足的遗留风险(只有一次真实回归验证过
    证据闸门,关键词表覆盖度与拦截后的连带影响都还没有大量数据支撑)。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 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 Code »
  • 补记 commit bab675c 的实现记录:按"第一版先做前者"落地(blocked 等人工,
    装配自愈留后续),以及中途把测试套件炸穿 75 个用例又收窄回来的完整过程——
    根因是 missingBodyDefinition 查真实文件系统,测试夹具的假 systemAgentId
    天然"缺失",改法是借用已有的 boundaryGuardApplicable 判据(只在真实执行器
    下生效),不是发明新判据。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • runClaimedNode 派发真实调用之前,先查一次 agentLocator.missingBodyDefinition
    (systemAgentId)——此前这个判据只在招聘/建公司路径上被查过,图执行的核心路径
    从没查过:本体因任何原因(装配没跑完、手工改坏、迁移遗留)仍是空骨架时,引擎
    会原样把它当正常本体派发一次真实调用,静默产出一份没有角色指导支撑的结果
    (真实样本见 34 号文档 §五:unit-tester 顶着 _base 骨架跑完了一整条真实任务)。
    
    本体不完整时:新 fail_reason='body_not_ready'(与招聘路径的同名状态同义),
    不扣预算(没有调用发生,"一次调用一定发生了"这条记账理由不成立)、不起边界
    守卫、走正常的选边/兜底/熔断路径(不发明第二套重试语义)。
    
    只在 agentExecutor === defaultAgentExecutor 时生效(与 boundaryGuardApplicable
    同一判据)——第一版忘了这条,把全仓库几百个用假 systemAgentId + 注入假 executor
    的用例全部判成 body_not_ready,跑单测直接炸穿 75 个用例;加上这条判据后收窄回来,
    只在真会起 CLI 的路径上生效。
    
    只查 agent_call 节点:subgraph 节点的 systemAgentId 不是即将被直接调用的本体,
    它派发的是 workgraph-planning 去规划子图。
    
    新增 graph-engine-body-not-ready.test.js(4 例)+ 更新
    graph-engine-fail-reason.test.js 的取值域断言(五个→六个)。全量单测
    1004/1004 通过。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 用户问"任务结果差是 agent 能力、架构、还是 graph workflow 问题",这份文档是
    书面复盘:按发生顺序分四类——图/模板设计缺陷(31/33 号,已修)、招聘装配可靠性
    bug(32 号已知问题的新样本)、一个复盘时新发现的架构缺口(missingBodyDefinition
    完整性闸门只在招聘路径上调用,graph-engine.js 的执行核心路径 advanceOne 一次
    都没查,本体不完整时没有第二道防线,静默拿空提示词跑真实 LLM)、agent 能力
    (不是问题,两次订正过"没工具做不到"的误判,且有正面即兴发挥的例子)。
    
    结论:主要是架构问题 + 一个具体可靠性 bug,不是模型能力问题。
    
    提出两档改进方案供讨论:
      低成本(建议直接做)——把完整性闸门接进图执行前置检查(提案 A)、
        控制台展示验收证据可见性(提案 B,纯 UI 不改行为)
      大改动(建议先讨论优先级)——标准化视觉验收工具(提案 C)、
        引擎级证据闸门(提案 D)
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • §5.1 原来断言"没有浏览器工具,物理上做不到",复盘时对照 p-bkhylu 的 org-coder
    (同样只有 bash/read_file/str_replace(+write_file),没有专门的浏览器工具)却
    真跑出了 Playwright + headless Chromium 测试,才发现这个判断错了:仓库自带
    playwright 依赖,bash 里 `node verify.mjs` 沿目录树能 require 到仓库根的
    node_modules,这条路今天的 coder/unit-tester 同样走得通。
    
    真正的差异不是工具权限,是 unit-tester 的 agent.md 从未填充过(32 号文档那类
    问题)、没有任何角色指导,而 org-coder/coder-validator 都是正常填充过的成熟
    本体。根因从"平台缺工具"改判为"这次没有指导 agent 主动想到",是一个不一样、
    也更能采取行动的结论。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 对比 e2e-demo 现有的三个项目根:
      p-v82tpc(今天的回归任务)—— 静态正则解析文本,零浏览器
      p-bkhylu("做一个 lemonai 官网")—— 真实 Playwright + headless Chromium:
        六档视口量 scrollWidth/clientWidth、getComputedStyle 量字号、手算 WCAG 对比度、
        禁 JS/reduce-motion 验证、整体挪到 /tmp 用 file:// 重开验证可移植性
      p-v1mpcl(31 号文档那条原始卡住任务)—— 无验证,任务在验收前就被取消
    
    p-bkhylu 的 DELIVERY.md 里那句"未采信自证脚本,符合 SDD §0/§2 I-4 验收独立性
    要求",搜遍 system/、docs/ 都找不到这条规则——它是那次任务的 sdd-planning 会话
    自己写进那次 SDD 的,不是仓库级别的通用约束。也就是说三条任务里,要不要认真
    验证、认不认自证脚本,完全取决于哪次任务规划时 agent 会话恰好这么想,没有系统
    保证。这就是 34 号文档 §三"影响面"判断的实锤:任务显示"已完成"与"真的达成
    原始需求"之间的落差,目前只能靠运气。
    
    34 号文档 §四 checklist 全部查完,状态行同步更新。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 之前把这条 run 手动 patch required=0 + 重试推到 completed 那次操作,其实就是
    "用真实回归任务验证 org-coder-validator 不再假阳性 blocked" 这条的证据,回来补记
    (唯一没走到的是"由 workgraph-planning 全新规划一张图"这一环,端到端证据仍缺)。
    
    复查了 validator.json 的 needs:[{kind:'artifact',required:false}]:不是同类潜伏
    问题,是刻意设计——它验的 artifact 由另一张图产出,靠任务级共享索引找,
    不依赖这条边的声明,required:false 与 33 号的 log 声明成因完全不同。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 34 号文档追加调查(§五):
    - coder-validator(预置 active 本体)的 agent.md 通篇是代码/契约正确性验证协议
      (npx vitest run + 抓假绿五件套),压根不涉及视觉/交互检查;这次任务新招的
      coder/unit-tester 两个本体 toolPolicy 都只有 bash/read_file/str_replace,
      没有浏览器/截图工具——goal-benchmark.json 的 evidence_hint 要求"打开浏览器",
      在给定工具权限下物理上做不到,不是 agent 偷懒。
    - 但也不是纯粹空手套白狼:data/companies/e2e-demo/projects/p-v82tpc/tests/
      unit-tester.check.js 是一份真实可运行的零依赖静态断言脚本,对维度 1-3 的检查
      (字号比例真解析 CSS clamp() 算出数字、三个卖点区块标题顺序、锚点跳转/平滑滚动)
      与浏览器版本基本等价甚至更精确;维度 4/5(响应式断点、资源完整性)的静态版本
      明显更弱,会放过断点内样式写错、本地资源路径错误这类情况。
    
    顺带发现:这份脚本很可能是 unit-tester 在提示词完全没有测试方法论指导的情况下
    自己想出来的——它的 agent.md 还是没填充过的 _base 原始骨架(隔壁 coder 正常填充
    过),是 32 号文档"招聘装配没填充完"那类问题的又一个真实样本(发生在方案 B
    修复提交 6a18379 落地前 1 小时,是旧行为的证据,不是新机制的回归;新机制下
    会不会正常完成,仍未验证)。32 号文档 §四追加第 6 条记录这次样本。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 用户反馈:控制台原来只能逐个节点点「输入输出」tab 看产物,缺一个全局入口。
    新增 TaskFilesPanel.vue,挂在页头,跨节点/跨 run 一次性列出这个任务的全部产物。
    
    做的时候发现分两类、且第二类之前完全没覆盖:
      · 节点产出索引(graph_files,按 company+task 检索)——规划笔记/日志/契约快照
      · 项目根(W2 ensureProjectRoot,data/companies/{cid}/projects/{pid}/)——
        真实交付物代码写的地方,跨节点共享,indexNodeOutputs 从不扫它
    
    后端补 readProjectRootRecord 导出 + GET /api/graph-runs/:id 挂 projectRoot 字段;
    项目根的文件列表复用已有的 GET /:companyId/files(此前零调用方),不新开列目录端点。
    新增 graph-run-route-io.test.js 两例(分配前 null、分配后原样透传 + 幂等)。
    
    顺带订正 34 号文档:当时断言"index.html 从未被写出来"是错的——真实网站文件
    其实在项目根里,只是没查那个目录。34 号文档 §零 记录了订正过程,问题收窄成
    "validator 有没有真的做过浏览器级检查"(仍未解决,留待下次)。
    
    全量单测 1000/1000 通过。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 真实回归任务 T-mt2r6fz0-125b 走到 completed 后回查产出,发现 org-coder-impl
    从未写出任何 HTML/CSS/JS 文件(只有 _plan.md/_research.md/coder.log),但
    org-coder-validator 给六个维度全打了 100 分。goal-benchmark.json 的
    evidence_hint 里五个维度明确要求"打开 index.html/浏览器开发者工具检查",
    这份评分显然没有真的执行过这些检查——是一次没有证据支撑的评分,不是
    "查过但判错"。
    
    不是 31/33 号修复引入的新问题,是那两次修复让这条本会一直卡死的任务真的跑到
    completed 之后,才把这个一直存在的验收缺口暴露出来。只记现象与证据,根因
    (提示词缺前置检查?validator 没有可用的浏览器/文件工具?是不是这次新招聘
    本体特有的一次性现象)留给下次调查,这次不深挖。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • settleTaskFromRun 只写 status/finished_at,不清 blocked_reason —— 任务卡住时
    noteTaskBlockedReason 写过的那句「节点 xxx 卡住(...)」会一直挂在 tasks 行上,
    哪怕后来 run 真的恢复跑完转 completed。界面上因此出现「已完成」绿色状态旁边
    还留着一句刺眼的红字,容易被读成还在报错。
    
    真实复现:T-mt2r6fz0-125b 手动推过熔断点后 org run 收敛到 completed,
    任务列表却仍显示 org-coder 卡住的旧归因文本。手动清了这条任务的残留数据,
    代码层面在 settleTaskFromRun 的 UPDATE 里一并置 NULL——task 进终态时
    「为什么卡着」这句话本来就该失效,不管进的是 completed/failed/cancelled 哪一种。
    
    扩展了 goal-task-acceptance.test.js 里"预算耗尽→恢复→跑完"那条既有用例,
    断言 blocked_reason 在完成后确实被清空。全量单测 998/998 通过。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 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 Code »

  • 用真实 LLM 起了一条新任务(G-mt2r62ia-73af/T-mt2r6fz0-125b)回归验证 83afecb 的修
    复:org-planner-sdd 自判失败后沿新补的兜底边自动回退 3 次、零人工介入,最终收敛到
    completed,补上 31 号文档 §六此前用确定性测试代替的那步真实验收证据。
    
    顺带在 org-coder 子图撞见一个独立的新 bug:inboundContracts()/requiredInputsMissing()
    不按 role 过滤 graph_edge_contracts,把同一条边上声明的 produces(源节点自己产出什么)
    也当成目标节点的必需输入,导致 org-coder-validator 被 missing_required_input 反复假阳
    性 blocked(agent 自己判定 passed,引擎却强改成 fail)。已定位根因、写清复现证据与建议
    修法,记在 33-needs-gate-role-filter-bug.md,留给下次实施。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 状态行从"评估完成,未实施"改成"方案 B 已实施"。§四风险/未决问题里原来的
    4 条逐条补上实施时的实际决策:
    - SessionPool 并发复用的真实后果仍未实测,但改用了不需要知道答案的设计
      (拿锁成功才调用,从设计上不会触发这个场景)
    - 互斥锁选型定为抽共享模块(agent-session-lock.js),不新起一把
    - 失败标记定为本体目录下的哨兵文件,不碰 system_agents.status
    - 第 4 条(三处同构缺口)原样保留未决
    
    新增第 5 条:实施时发现的连带效果——hire 路由第 1 步改 await 之后,第 3 步的
    setTimeout(5000) 变成多余延迟,刻意没有顺手删掉,记录下来给以后处理。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • company.js 的 hire 路由原来用一发 fetch(...).catch(...) 回环自己去触发 agent-creator
    填新角色的定义文件——fire-and-forget,.catch 只接网络层错误,agent-creator 撞车时
    (另一次调用正占着它)/api/agent/:agentId/chat 返回 429,被原样当成"成功"吞掉。
    新角色因此永久停在 base 空壳 + status=training,唯一痕迹是一行 console.error(且这行
    在 429 场景下根本不会触发)。
    
    新增两个模块:
    - agent-session-lock.js:从 agent-chat.js 抽出的共享互斥锁存储(纯数据结构,Map +
      超时常量),agent-chat.js 的路由与 hire 路由现在用同一把锁。不能各起一把——
      SessionPool.getOrCreate() 不检查上一次调用有没有跑完,两条路径分开维护锁的话,
      各自都以为自己没有并发,会把第二轮 prompt 发进一个还在处理中的 CLI 会话
      (未定义行为,比现在的"被拒绝丢弃"更危险,见 32 号文档 §二方案 B)。
    - agent-body-filler.js:同进程直接调 AgentManager.callAgent,替掉 HTTP 回环。
      拿到锁才发起调用,锁被占用时等一等重试(最多 3 次,5s/15s 退避),重试耗尽在
      本体目录写一个哨兵文件 .body_fill_failed.json(不动 system_agents.status /
      config.json.status——那两个字段还有 draft→active 毕业逻辑在读,改取值域风险
      大于收益)。
    
    company.js 的 hire 路由第 1 步从 fire-and-forget 换成 await,顺带让第 2/3 步
    (技能注入、5 秒后触发 Innovator 训练)拿到"agent-creator 真的写完了"这个保证——
    第 3 步原来的 setTimeout(5000) 靠的是"假设 5 秒内写完",现在这个假设不再需要,
    但没有顺手删掉那个 setTimeout(不在这次修复范围内,留着无害)。hire 接口本身
    仍是异步的,调用方还是立即拿到 training 状态,没有改成同步等待完成。
    
    agent-chat.js 的锁声明改成从共享模块 require,行为逐字不变——用现有 5 个
    agent-chat 相关测试文件(36 条)验证过零回归。
    
    新增 agent-body-filler.test.js(6 条):首次成功、重试后成功、锁被占用时等待
    重试、重试耗尽写失败标记、成功后清掉上一轮的失败标记、只释放自己抢到的锁
    (不误删第三方在途期间抢到的新锁)。用 vi.useFakeTimers() 控制重试等待,
    不用真等 5s/15s。
    
    全量 npx vitest run:151 文件 / 1384 用例,零回归。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • config.json 的 name 字段是工位显示名(如 org-coder 显示成"实现节点"、
    coder 显示成"实现"),Overview 页 Agent 表格和 System Agents 侧边栏此前
    只渲染 name、不带 id,导致界面上看不出某个显示名对应哪个 work graph
    节点绑定的 system_agent_id。后端接口本就返回 id 字段,这里只是补上前端展示。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 用户追问「这个方案能解决什么问题」,发现文档原来把这个信息拆在§三要点和§四
    风险里,没有对照着讲清楚。补一张表:撞车丢请求/卡死不可见两条真解决了,
    agent-creator 真的坏了/主动通知人/另外两处同构缺口/hire 接口异步体验这几条
    明确没解决——避免看完方案高估它的覆盖范围。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »
  • 承接 30-task-delegation-reliability-gaps §2.1(现状调研,未拍板)。评估了两条候选:
    
    方案 A(改走 POST /api/agent/task/dispatch)不成立:深挖发现它最终也是走
    selfChat() 回环 HTTP 自己,撞上 agent-creator 单会话锁时同样吃 429、同样不
    检查响应状态码——跟现在的 fire-and-forget fetch 是同一条失败路径,没有多任何
    重试保护,唯一价值是任务表里多一条可查询的行(可观测性不是可靠性),且语义
    错位(内部装配动作会被包装成用户可见的派单任务)。
    
    方案 B(company.js 直接同进程调 AgentManager.callAgent)方向对,但评估中发现
    一个原始方向没提到的真实风险:SessionPool.getOrCreate() 只判断连接在不在,
    不判断上一次调用有没有跑完——绕开 HTTP 直接并发调用会被复用到同一个还在处理
    中的会话上,两条 prompt 塞进一条 stdio 管道,行为未定义,比现在"第二个请求被
    429 丢弃"更危险。因此推荐方案明确写成「同进程调用 + 自己的互斥锁 + 有限重试 +
    失败落地为可查询状态」,不是简单的「同进程调用 + 重试」。
    
    文档状态:评估完成,未实施。互斥锁选型、失败标记落点等留给实施阶段决定。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    yibo authored
     
    Browse Code »