-
跟用户对齐关键架构决定:可认领子任务复用 tasks 表(新增 subtask_kind 字段区分 'acceptance_item'/'claimable_work',不新开表)。 设计中定位两处要点: - 必须同步改的坑:settleNode 的 SUBTASKS_INCOMPLETE 硬闸门要收窄成只查 subtask_kind='acceptance_item',否则新物化的 claimable_work 行会让所有 开了 subtask-planning 的 task 验收判定失控。 - 重要化简:认领成功后直接复用现成的 executor='agent' 派单闭环(认领人 自己搞定、自己 /task/report 上报),不需要给 graph-engine.js 加认领 调度层,比文档原先设想的"改动面最大的一条"轻得多。 只是设计,未写代码。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H85SS5hVC4u1PbVhjmrhH8
-
46 号文档 Phase 2 真实端到端回归(真实公司 p2verify0902 + 真实 goal/task/ Claude CLI)第一次跑就复现一个真缺陷:原始打分用「交集计数、>0 就算命中」, 一条长任务描述几乎必然跟经验库里的高频工程词汇偶然重合几个 bigram,导致 一个贪吃蛇任务被"验证修复要重新触发流程"这类无关的工程经验污染成 reasoning_source=memory,压过了本该触发的 deep research 分支。 改成 containment ratio(命中词数 / 经验块自身词数,对经验块归一化而不是 对查询归一化),阈值用真实噪音案例(~3%-4%)和合成相关案例(~16%-32%) 校准。补回归测试固定复现这次真事故场景。修完重启服务用第二条真实任务 (Markdown 转 HTML 工具)重新验证:reasoning_source 正确变成 deep_research,两轮调用(subtask-planning → org-hunt → subtask-planning) 真实跑通,全程零残留 CLI 子进程。46 号文档补了真实回归记录,包括一个 如实记录的局限:org-hunt 那次调用没有工具调用痕迹,更接近"多问一个角色 的第二意见"而非真的做了外部检索。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H85SS5hVC4u1PbVhjmrhH8
-
subtask-planning 改成两段式:先查 experience-lookup(扫已雇 agent 的 dream 沉淀经验,关键词打分)拼进提示词,agent 自评 confidence;经验为空或 confidence low 时触发 deep-research(图外直接调用 org-hunt 轻量提示词, 不套用其训练场景三件套契约,默认关闭,需 ENABLE_DEEP_RESEARCH=1)。 reasoning_source/experience_refs/research_used 增补进 subtask-plan.json, 向后兼容旧注入桩。 范围收窄:不做"历史同类 goal 检索"(需要语义检索基础设施);Phase 3-5 (任务池认领/子任务预算/看板 UI)涉及核心调度引擎范式级改动,另起设计。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H85SS5hVC4u1PbVhjmrhH8
-
reopenRunForRetry 与 _reapStaleRunningNodes(开机孤儿清扫 + 45号文档持续性存活 扫描共用)把 run 从 blocked/ready 拉回 running 走的是裸 admitOrRequeue,不是 startRun,只改了状态从没重新挂上 runAuto 自驱动循环——手动/自动重试推一步后没人 接着推,agentRunId 仍是 null,backward 重试每次都在这里再卡一次。两处都补上 startRun 收尾那段逻辑:真的推成 running 且 execution_mode==='auto' 才挂 driver。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
-
47号:itemized 子任务物化在当前 workgraph-planning 常见子图形状下因 acceptance.md 永远产不出来而形同虚设;maybeMaterializeItemizedSubtasks 新增兜底,缺失时改读 已被 44 号文档证实稳定产出的 goal-benchmark.json 的 dimensions[]。 46号 Phase 1:新 agent subtask-planning,钩在 enqueueTaskRun(显式 opt-in,只在 goal 批量下达/单条 task 下达两处触发,保住 quick task 零 LLM 调用的既有保证); 产物写共享 artifacts/subtask-plan.json,复用 R-19.3 任务级共享索引对接下游。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
-
新增两条经验:阻塞任务事件驱动唤醒需周期性兜底扫描、校验失败重试边应指回产出方而非上游规划方。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
-
System Agents/Task Logs/Quota/Dream 及公司上下文的 Overview/Team/Workspace/ SOP/任务看板/Files/Messages 共 11 处导航链接原是 <a target="_blank">,改成 router-link 保持在当前页跳转。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013aQrCrnXcYEz5GdQ6fnPZm
-
GraphChatBar.vue 里"context 变了才拼说明、没变不重复"这条逻辑原来直接写在 <script setup> 里,脱不开组件测不了。照抄 agentChatEvents.js 的先例抽成 chatContextInjection.js 的纯函数(buildOutgoingMessage/contextKey),配一份 不用挂载组件就能跑的单测,锁住这条不变式。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YCd5WFjL1m31FaJXKx1j7Z
-
38 号文档 Phase 2 把 /api/okr 收紧成 admin-only,agent 走 CLI 调用必 401; 公司级正确入口是 POST/GET /api/company/:id/goals(requireAuthOrInternal)。 新增 --company / LEMON_COMPANY 兜底,缺省给出明确提示而非裸 401。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PKPAmaoRGb6UdGwPbStCwJ
-
graph-console 页面底部新增可展开/收起的聊天条(GraphChatBar.vue,仿 MasterChatDrawer.vue 写的自包含最小聊天组件),直接跟公司 ceo agent 对话,不用跳去 AgentChat 整页。会话持久化在 localStorage(按 companyId 区分),刷新页面自动拉历史消息恢复。 发消息时若当前选中的 task/goal 跟上次发送时不同,会在实际发给后端的文本前拼一行上下文说明, agent 不用用户手动复述在看哪个任务;聊天气泡里展示的仍是用户输入的原文,不被这行说明污染; 上下文不变时不重复注入。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YCd5WFjL1m31FaJXKx1j7Z
-
真实事故:h3video 公司 h3-story-draft 节点卡在 status=running,背后 CLI 会话已死但服务器 进程没重启,开机一次性孤儿扫描/goal-task 巡检/wallclock 看门狗均看不到,ceo 被转发问题后 绕过引擎自己拉会话,陷入死循环。 - sweepStaleRunningAgentCalls + startStaleAgentCallWatchdog:运行时长超阈值(默认 25 分钟) 的 agent_call 节点判 infra_flake 原地重跑,5 分钟一次巡检,挂进 server/index.js - ceo/tools.md 补 force-fail 端点(已有,未改代码)的使用文档 + 禁止自拉会话的规则 - ceo/heartbeat.md 同步更新"不用管的"一节 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WjFL1nfPDqZnJeuskYHwvs
-
Snapshot-then-stop race in stopRun() left child runs created after the snapshot outside the stop scope; add auto-mode guard rejecting manual /next on execution_mode='auto' runs (source of the concurrent-advance race). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
-
44 号:writesArtifacts 节点产出闸门永远打不过 - goal-benchmark 按设计把产物写进 root run 共享 artifacts/ 目录(三个节点合成同一份 acceptance.json,天然不可能落在某节点私有目录),但 unsatisfiedRequiredProduces 的 R-19 逃生口 readDeclaredProduces 的 allowedRoots 只认节点私有目录 + 项目根,够不到 共享区——这条契约在当前实现下无论 agent 表现多好都无法通过。 - 修法(44 号文档方案 1,改动面最小):allowedRoots 加入 runRootDir(run)/artifacts/; goal-benchmark 的 agent.md/tools.md 补上"写完共享产物后在自己节点私有目录声明一份 contract.json"这一步。 - 回归:graph-files-index.test.js 新增用例 ⑭。 41 号:routeFailure 的 infra_flake 分支完全无视 target_node - 30 号文档记录过一次真实死循环:节点自称 infra_flake 并点名 target_node,引擎原来 一律原地重跑该节点自己,从不看 target_node。 - 修法(最保守方案,用户确认):新增 infraFlakeTargetEdge——target_node 只有在图上 真有一条从本节点出发的 backward fail 边指向那个节点时才生效,命中就改走正常的 backward 边路由(计入 backward_count/双层熔断),不再享受"原地重跑、只受 infra_flake_count 约束"的免账本待遇;没命中维持原有行为。 - 重要澄清:这条修复堵不住 30 号文档那次真实事故——事故里点名的目标是下游节点, 而 org-graph-service.js 规则 4(backward-labeled)从图结构上就不允许 backward 边 指向非祖先,那次事故本来就不是"有边不认",是"诊断内容在打图结构不允许表达的 主意",已经靠 INFRA_FLAKE_HARD_CAP 熔断收敛,不在这条修复范围内。 - 回归:graph-engine.test.js 的 infra_flake describe 块新增两条用例。 44 号文档移入 done/,41 号清单项相应更新,43 号文档的交叉引用一并修正。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CwGcvMfUcgCcweN5vjhTkn
-
与 TaskBoard 页头的「执行控制台」链接对称,方便两页互跳。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XFEiaAAG79HrW2Avqrq2Xs
-
之前排队等待(上条改动)期间前端只有通用的"思考中",最长可能等到 60s 都看不出 是在排队还是在正常生成,容易让人以为卡死了。 - agent-session-lock.js 新增 isLockBusy(agentId):判断此刻是不是真被占着(僵尸锁 不算),供路由层在真正排队前 peek 一眼。 - agent-chat.js 的 /:agentId/chat:锁被占用时提前建立 SSE 连接、先发一个 queued 事件(activeConvId + waitBudgetMs),前端能精确显示"排队等待中";没被占用的 常见路径完全跳过这段,不引入多余的建连时机差异。头一旦按 200 SSE 发出去就不能 再改状态码,排队超时也改用 queue_timeout 事件收尾,不再是独立的 429 JSON 响应 (没被占用、一开始就抢到锁的路径不受影响,仍是普通 SSE)。 - agentChatEvents.js 的 handleEvent 认识这两个新事件类型:queued 把 thinkingText 换成带等待预算的提示;queue_timeout 跟 error 分支一样落一条可见的助手消息, 不会像原来的静默 429 那样挂在界面上没反应。 - 相应更新 agent-chat-interrupt.test.js(断言 SSE 里真的有 queued/queue_timeout 事件,超时分支状态码从 429 改为 200)+ agentChatEvents.test.js 新增两条用例。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CwGcvMfUcgCcweN5vjhTkn
-
- agent-session-lock.js 新增 acquireLockWithWait:锁被占用时按 pollMs 轮询排队等待 AGENT_CHAT_QUEUE_WAIT_MS 预算(默认 60s),check-and-set 之间无 await,天然原子; 等到锁释放就正常执行,等满预算仍抢不到才 429,不再"撞上就立刻拒绝"。 内部自唤醒(TaskCallback/TaskDispatch 等 selfChat 调用)是 fire-and-forget,之前 429 等于这次唤醒直接消失,只能靠别处巡检兜底;排队等待让大多数几秒到几十秒的 短暂碰撞能自然衔接上。 - AgentChat.vue 的 handleSend() 之前拿到 fetch 响应后不检查 r.ok 就直接当 SSE 流读, 非 200 响应体是普通 JSON,逐行解析全部匹配不上 event/data 前缀,被静默当空流吞掉—— 用户发的消息挂在界面上,没有任何回复也没有报错。现在先判 r.ok,非 200 时读 JSON 错误体,429 显示"Agent 正忙,请稍后重试",其他状态显示带状态码的错误提示。 - agent-chat-interrupt.test.js 相应更新:原来断言"并发第二个请求立刻 429"的用例 改为断言"预算内排队等待、等到就正常执行、两次调用不重叠",另加一条"预算耗尽仍 抢不到锁时返回 429"的回归。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CwGcvMfUcgCcweN5vjhTkn
-
43 号文档补上 Phase 0-4 的实现记录,含一处架构订正(org-planner 在 org 层永远是 subgraph,真跑数据核实后钩子改成扫子 run 全节点)。 44 号文档是真实回归验证 43 号文档时意外发现的独立缺陷:goal-benchmark 按设计把产物写进 root run 共享 artifacts/ 目录,产出闸门只查节点私有 目录,writesArtifacts:true 这个字段全仓库零代码读取——这条契约在当前 实现下结构性地打不过,不是偶发。很可能正是 snakegame-co 参考任务里 goal-benchmark/planner-validator 显示 skipped 的真实原因。只记录诊断, 未修复,留了两条候选修法。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U7xYyvv3pzuV9diMVUH5QL
-
GoalTaskPane.vue(GraphConsole 左栏)按 parentTaskId 分层渲染,子任务 只读展示(没有独立 run,不接操作菜单);TaskTable.vue(TaskBoard,当天 另一个并发 session 重写的表格视图)用一行「↳ 子任务·属于「…」」指回 父任务,不强行画树——它是可排序表格,硬套树形会跟排序打架。 taskView() 已在上一个提交里补上 parentTaskId/acceptanceMode 字段输出。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U7xYyvv3pzuV9diMVUH5QL
-
实现路径:task-planning 判断是否 itemized(硬规则 5 开例外让 LLM 写这 一个字段)→ org-planner 收尾把 acceptance.md 物化成子任务 → coder-validator 用新工具 task subtask-result 逐条上报,settleNode() 新增闸门强制核对 子任务全部 completed 才认这一轮 success。 - work-graph-db.js: tasks 加 acceptance_mode 列,createTask 支持 parentTaskId(复用既有列),新增 settleSubtaskResult 条件更新 - graph-engine.js: maybeMaterializeItemizedSubtasks(org-planner 结算 success 后物化子任务,agent_call/subgraph 两种形态都认,subgraph 场景 扫子 run 全节点找 acceptance.md,找不到优雅降级不阻塞主产出); coder-validator 判 success 前新增子任务完整性闸门 (ENGINE_FAIL_REASONS.SUBTASKS_INCOMPLETE) - task-planning.js / company.js: acceptance_mode 字段透传链路 - bin/lemon.js: 新增 task subtasks / task subtask-result 两个子命令 - coder-validator/agent.md、task-planning/agent.md: 对应提示词更新 真实回归验证过(新建公司走完整链路),过程中发现两个跟本次改动无关的 预存在问题:一次瞬时的 produces_missing 误判(重试即愈)、一个结构性的 writesArtifacts 产出闸门不匹配 bug(另立 44 号文档记录,未修复)。 全量单测 1120/1123 通过,3 个失败与本次改动无关(git stash 验证过)。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U7xYyvv3pzuV9diMVUH5QL
-
原来的 /task-board 挂的是 GoalTaskPane(折叠式目标→任务列表),字段少、 没有搜索筛选排序、点任务是整页跳转。GoalTaskPane 同时被 GraphConsole 左栏复用,原地重写会连带改掉那边,所以新做 TaskTable + TaskDetailModal 两个组件只给 TaskBoard 用。 - TaskTable:表格列(状态/描述/所属目标/负责Agent/优先级/创建·开始·结束 时间),搜索框 + 状态/目标/负责人筛选 + 点表头排序 - TaskDetailModal:点一行弹出详情,可编辑 + 增删改查(复用既有 taskActions()/PATCH/POST/DELETE 端点,没加新接口) - taskView() 补上 assigneeAgentId 字段(DB 列早就有,只是没读侧暴露) 已用真实登录态跑通端到端验证(建临时测试公司+任务,搜索/筛选/排序/ 增删改查全走了一遍,控制台零报错),确认 GraphConsole 侧栏未受影响。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XUvQ2xSFk7YoavE5SQENdw
-
回应"org-planner 出 brd/prd/sdd 后,任务看板能不能展示成 task/sub-task 树,coder-validator 按清单逐条开发验收"。原话照搬 + 结构化复述 + 现状调研(parent_task_id 只服务于 Agent Chat 派单流程、task-planning 人设明确拒绝按检查项拆 task、org-planner 没有建任务工具)。 三轮讨论定案:goal→task 流水线自建父子机制、先只拆验收(开发仍整体 完成)、要不要拆交给 task-planning 判断、任一子任务 fail 父任务即 fail、子任务复用 tasks.status 状态语义。 技术实现计划 Phase 0-4 逐条核实代码形态,含两处订正(org-validator/ coder-validator 是不同 agent;org-planner 产出的验收清单是 acceptance.md 不是 acceptance.json)和一个待验证风险(acceptance.md 在真实回归里 从未被用上,Phase 2 落地前需先确认可靠性)。尚未开工。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U7xYyvv3pzuV9diMVUH5QL
-
run 撞墙钟/调用次数/token 上限 blocked 时,之前界面上没有入口, 只能开发者工具手搓 fetch 调 POST /:id/budget。加一个按钮 + 小弹窗, 三维增量(留空不追加)+ 追加后立即启动,复用现有的 act() 提交入口 与 confirmAuto 同款 modal 样式。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U7xYyvv3pzuV9diMVUH5QL
-
test/integration 类节点从不产出一个能被 indexNodeOutputs() 认作 kind='log' 的文件(落盘的都是 coder.log/test.log,归入 kind='artifact'), required 的 log 契约永远无法满足,把节点卡进 missing_required_input 死循环。33 号文档修过一次模板文件,但 workgraph-planning agent 实际 照抄的是 tools.md 里一份没同步更新的旧范例,同一个坑复现(snakegame-co T-mtfh2kuf-7c31)。这次把底线收到 declareEdgeContract 唯一落库口, 不再依赖每个模板/每次 LLM 规划都记得写对;顺带同步 tools.md 范例。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U7xYyvv3pzuV9diMVUH5QL
-
昨晚做完 42 号文档 Phase 2-4 之后忘了同步 docs/README.md 索引,还停在 "Phase 1 已实现,Phase 2-4 待开工"。这次一并把两份文档从 todo/ 挪进 done/(39 号 P1-P5、42 号 Phase 1-4 均已实现,符合仓库自己的归档约定), 索引表挪到对应位置,两处过期描述改成完工状态。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BwG4b7Nq1NLR9eeE3M9Us9
-
org-coder 等 9 个角色(含 _base 骨架模板)的四段式阶段流转靠调 bin/lemon.js task transition,打到 agent-chat.js 的 /task/transition—— 这个端点靠自己的 sessions Map 找会话,work graph 节点场景下找不到, 阶段流转静默跳过,中间产物不进任何跨节点共享的轨迹。 调研确认范围后选了最保守的实现:不改 bin/lemon.js 的 CLI 签名、不碰 agent-chat.js(当天正被另一个并行会话实时编辑,风险太高)。关键发现 是 --artifact 参数本来就是 .../runs/{rootRunId}/nodes/{nodeRunId}/... 形状的路径,两个 ID 已经现成编码在里面,不需要给子进程塞新环境变量, 不需要改一个字的 agent.md 提示词。 bin/lemon.js 在原有调用之外 best-effort 追加一次 POST /api/graph-runs/phase-note,新端点从 artifact 路径解出两个 ID, 校验 run 真实存在后调 emitEvent() 追加 timeline 记录,只追加不碰 graph_run_nodes/graph_runs 任何一行——不影响 needs/produces 契约。 P0 拦截/OKR 更新两段旧逻辑维持原样,新端点是独立的第二条路径,不是 迁移。 新增测试 4 例,全量测试 1503/1506,零回归(剩余失败全部来自另一个 并行会话进行中、还未提交的工作)。42 号文档 Phase 1-4 全部完工。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BwG4b7Nq1NLR9eeE3M9Us9 -
原来场景 C 固定只回放最近 20 条、单条截断到 500 字,ACP 进程重启/空闲超时 后早于窗口的历史会静默丢失。改成按 token 预算(默认按 1M 上下文的一半, AGENT_MODEL_CONTEXT_TOKENS 可覆盖)从最新往最老收,装得下就整段注入。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XUvQ2xSFk7YoavE5SQENdw
-
39 号文档 P5 落地的是"配了 company.json.target_dir 就生效"这一半, "人怎么把这两个字段填进去"此前只能手工编辑 company.json。 复用已存在的 PUT /api/company/:companyId(companyService.update()), 没有新建端点。新增 target_dir/target_mode 分支,校验直接调 path-resolver.validateLinkedTarget(39 号文档 P5 抽出来的共享函数, 和 graph-engine.js 运行时校验同一份判据):合法路径写入成功、敏感 路径黑名单拒绝、linked-new 非空目录拒绝、linked-existing 不存在拒绝, 校验失败路由层转 400;传空字符串清空配置;不传 target_mode 默认 linked-existing,与 graph-engine.js 的 readCompanyTargetConfig 同口径。 前端:CompanyDashboard.vue 概览 tab 加一张配置卡片,本地表单状态 不直接双向绑定 selectedCompany,保存失败不会冲掉用户刚打的字。 新增测试 8 例,npm run web:build 编译通过。**未做真实浏览器点击 验证**——服务器上有其它并行会话真实在跑的 agent 进程,这次没有重启 服务器(42 号文档 §二记过一次"重启杀掉别人真实进程"的教训),文档 里标记了这个已知缺口。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BwG4b7Nq1NLR9eeE3M9Us9
-
之前几轮全量跑一直有 3 个失败,当时判断是环境耦合/pre-existing、跟本次改动无关就没细查, 这次逐个真查了一遍,三个都是真 bug: - system/agents/sdd-planning/SKILL.md:Evolve 训练产出从 train/evolve/SKILL.md 提升到 生产位置时,"训练依据"引用的相对路径没跟着调整(少了 train/ 前缀),指向了不存在的 system/agents/hunt/、system/agents/digest/;真实文件其实在同一个 agent 自己的 train/hunt/、train/digest/ 下,补前缀即可。 - graduation-criteria-reality.test.js:断言死等 code-planner 的状态回到 'active',但 该本体的 config.json 早已从曾经踩坑的 "training" 改成了真正毕业态的 "enabled"—— seedAgents() 把 DB 同步成 'enabled' 是设计如此(同为毕业态,不是降级),不该被判失败。 改成用 isUngraduatedStatus() 判断"没被打回未毕业域",不再钉死具体状态值;顺手把 graph-seed-service.js 里那句会随源码变化过期的注释也改成不点名具体值。 - graph-engine-extend-budget.test.js:一颗时间炸弹——用硬编码绝对时间戳 '2026-08-23T05:23:52.886Z' 模拟"卡住很久了",但被测代码真的调 Date.now() 算经过时长, 写这条用例时"经过时长"确实超过 2h 上限、又低于追加后的 6h 上限;现在真实时间已经过去 178 小时,连追加后的上限都超了,测试注定要红,跟被测代码毫无关系。改成 Date.now() - 3小时 相对计算,不再随时间推移漂移。 全量 vitest 131/131 文件、1089/1089 用例通过。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
-
39 号文档 §四.4 拍板"ceo 全权自主 enqueue,但 max_parallel_tasks / DEFAULT_TASK_BUDGET / goal 级 org-validator 这几道闸门必须照样拦住 它",落地时没补这条测试。这次补上,走 ceo 实际会用的通路(draft:true + created_by:'ceo' → /enqueue),不抄近道直接摆数据库行: 1. 坑满时 ceo 建的任务排队,不插队。 2. 预算给 0,checkBudget 照样判耗尽,created_by 不改变结果。 3. ceo 建的两条 task 挂同一个 goal,全 completed 后 goal 级验收只调一次。 全量测试 1486/1490,零回归。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BwG4b7Nq1NLR9eeE3M9Us9
-
冲突在 docs/README.md:并行会话在真实端到端测试里发现 boss agent(39 号文档)还有 三个单测没覆盖的真问题,把 39 号重新留在 todo/ 并拆出 42 号跟进文档;与我这边把 39 号挪进 done/ 的判断冲突——采纳对方判断(39 号文档物理路径挪回 todo/system-design/, докс/README.md 用对方更新的行 + 补 42 号一行),因为他们是基于更新的真实测试结果。 顺带把 29-dream-design.md 这次会话移到 done/ 后遗漏的引用修掉: system/agents/{dream-distiller,dream-screener}/agent.md、 server/{routes/dream.js,services/dream-service.js}、 server/tests/unit/dream-routes.test.js 六处 docs/todo/system-design/29-dream-design.md 路径改成 docs/done/system-design/29-dream-design.md(no-dead-path-references.test.js / agent-md-refs.test.js 两条守卫测试之前没扫到这几处,这次真跑测试才暴露)。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> -
29-dream-design / 33-needs-gate-role-filter-bug / 35-validation-rigor-and-body-readiness-proposal / 39-boss-agent-task-supervision / 40-agent-chat-streaming-interrupt 逐份核实状态确认已完成 (后两份状态行本身滞后于代码,已在上一提交订正),按维护说明从 docs/todo/system-design/ 挪到 docs/done/system-design/,docs/README.md 的 todo/done 两张表同步更新。 顺带修复 4 处指向这 5 份文档的相对路径引用(28-followups / 31-work-graph-fail-fallback-coverage / 34-validator-scored-without-real-deliverable / 41-graph-vs-fde-reliability-discussion), 文件搬家后原来的同目录相对链接会失效,改成 ../../done/system-design/ 的正确相对路径。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
-
服务器重启会杀死正在跑的 graph 节点背后的真实进程,但 graph_run_nodes. status 永远停在 running(ceo 的两条唤醒路径都只认 blocked,对这个状态 完全不可见)——39 号文档真跑复盘撞出来的坑,这次补上。 1a:graph-engine.js 新增 sweepOrphanedRunningNodes(cutoffIso),复用 routeFailure 的 infra_flake 分支(不发明新状态),server/index.js 在 本次进程启动时刻挂一次开机扫描,排在其余「补一次全量扫描」钩子之前。 1b:新增 forceFailNode() + POST /:id/nodes/:nodeId/force-fail,补上 retry 端点管不到 running 节点这个缺口——人工/ceo 判定"这个真的救不 回来了"时的手动出口,转 fail 后交给既有失败路由处理,不发明新路径。 新增测试 12 例(graph-engine-orphan-sweep.test.js 4 例、 graph-run-force-fail.test.js 8 例),全量测试 1483/1487,零回归。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BwG4b7Nq1NLR9eeE3M9Us9
-
节点多时左右排列会把屏幕撑成很宽的多栏视图,改成按依赖深度自上而下、 同波并行节点左右排开,更贴合画布容器的竖直滚动。backward 回退边路由 相应改到节点带右侧走车道(原来在下方)。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U7xYyvv3pzuV9diMVUH5QL
-
上一条 commit 只带了纯改名(git rename detection),文件内标题、 39 号文档的两处引用、docs/README.md 的索引更新都漏提交了(git add 命令里混了一个已经改名走的旧路径,报错后整条 add 没生效)。这次补全。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BwG4b7Nq1NLR9eeE3M9Us9