• subtask-planning 每个 step 新增 acceptance 字段(benchmark 段格式),createTask
    强制 decomposed_work 子任务必须带验收契约并用 goal-contract.validateContract 校验,
    enqueueTaskRun 起轻量图前把契约落进新 run 的 artifacts/acceptance.json——解决
    46号文档 Phase 3 v2 真实回归撞见的 org-validator 死锁(轻量图没有 org-planner
    产出契约,退无可退)。
    
    真实起 subtask-planning agent 验证时发现设计稿的字段形状假设有误(真实产出是
    benchmark 段本身,不是三段式 wrapper),已按真实产出修正代码与文档,并用那次
    真实调用的原始输出跑通完整链路验证。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01H85SS5hVC4u1PbVhjmrhH8
    yibo authored
     
    Browse File »
  • 真实回归暴露"认领后没有触发源"的真问题,讨论后发现"认领"(pull,CAS
    抢占)要解决的"多方竞争同一条任务"场景根本不存在——只有 CEO 一个人拍板
    要不要派、派给谁。CEO 心跳统一发现+直接派发(push)成本更低,还能顺带
    控制派发节奏,不需要认领。
    
    删除:claimSubtask/unclaimSubtask(work-graph-db.js)、POST /claim、
    POST /unclaim(company.js)、CLAIMABLE_WORK_ROLES 白名单、
    claimable/claimed 两个 status 值、claimed_at 列。
    
    改名:subtask_kind 的 'claimable_work' → 'decomposed_work'
    (materializeClaimableSubtasks → materializeDecomposedSubtasks),
    "认领"这个词不再准确,物化出的行现在就是普通 draft task。
    
    新增:
    - triggerSubtaskPlanning 加递归防护(task.parent_task_id 非空直接跳过)
      ——设计 v2 时发现的真实漏洞:CEO 对子任务调 /enqueue 会默认
      withSubtaskPlanning=true,不挡会对已经是"第几步"粒度的子任务再拆一层。
    - createDecomposedWorkGraph:现造一张两节点轻量 work graph
      (impl=org-coder、validate=org-validator,agent_call 不是 subgraph),
      跳过公司完整 org graph 的 brd/prd/sdd 规划仪式——subtask-planning 已经
      把"怎么做"拆到这个粒度了,再走一遍纯属重复劳动。含一条没有真实验证过
      的假设(org-coder/org-validator 裸调用会不会读不到预期上下文),如实
      写在代码注释和文档里。
    - enqueueTaskRun 按 subtask_kind 选图:decomposed_work 走轻量图,
      普通 task 行为不变(回归测试覆盖)。
    - ceo/heartbeat.md、tools.md 补了巡检 decomposed_work 草稿 + 判断节奏
      + 调用现成 /enqueue 的指令。
    
    测试:删除 task-pool-claim.test.js(随 v1 代码作废),新增
    task-decomposition-dispatch.test.js(12 条),更新
    task-decomposition-validator-gate.test.js 措辞。全量单测 1191 条,
    1189 passed(唯二失败与本次改动无关),零残留 CLI 子进程。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01H85SS5hVC4u1PbVhjmrhH8
    yibo authored
     
    Browse File »
  • tasks 表新增 subtask_kind('acceptance_item'|'claimable_work',区分 43 号
    文档的验收条目物化和 Phase 3 的可认领工作项物化,共用一张表不新开)+
    claimed_at 列(批 6 迁移,ALTER ADD COLUMN,纯增量向后兼容)。
    
    - work-graph-db.js:createTask 新增 subtaskKind/status 参数 + 校验;
      claimSubtask/unclaimSubtask 是全仓库第一个真正的"认领(pull)"CAS 写入
      (之前 assignee_agent_id 全部写入点都是"派发 push",没有先例可抄,照抄
      claimQueuedTask 的 changes 判据);materializeClaimableSubtasks 把
      subtask-planning 的 steps[] 物化成可认领子任务,两阶段建法处理
      depends_on_hint 的前向引用,幂等,与 acceptance_item 物化互不干扰。
    - graph-engine.js:settleNode 的 SUBTASKS_INCOMPLETE 硬闸门收窄成只查
      subtask_kind='acceptance_item'——这是必须同步改的一步,不收窄的话新物化
      的 claimable_work 行会让所有开了 subtask-planning 的 task 验收判定失控
      (已用回归测试固定住这个场景)。maybeMaterializeItemizedSubtasks 的
      createTask 调用同步打上 subtask_kind='acceptance_item'。
    - subtask-planning.js:triggerSubtaskPlanning 写完 artifact 后立刻物化
      claimable_work 子任务,不等 org-planner 跑完。
    - company.js:taskView 补 subtaskKind/claimedAt;GET /tasks 加 subtaskKind
      过滤(?subtaskKind=claimable_work&status=claimable 就是可认领池查询);
      新增 POST .../claim、POST .../unclaim 两个端点,角色白名单先写死
      ['org-coder'](不做能力匹配,系统里没有结构化角色能力字段)。认领成功
      同时把 executor 改成 'agent',复用既有的 executor='agent' 派单闭环
      (/task/report 上报生命周期),不需要碰 graph-engine 的调度模型。
    
    新增 task-pool-claim.test.js(23 条:DB 层校验/CAS/物化 + 路由层白名单/
    并发/放弃);task-decomposition-validator-gate.test.js 补一条回归测试
    (claimable_work 子任务不影响 acceptance_item 的验收判定)+ 更新既有用例
    显式打 subtaskKind;task-decomposition-materialize.test.js 补
    subtask_kind 落库断言。全量单测 1202 条,1200 passed(唯二失败与本次改动
    无关、改动前即存在)。
    
    本轮明确不做:依赖顺序强制、能力匹配、graph-engine 调度模型改动、
    Phase 4 的独立开发验证循环、Phase 5 看板 UI。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01H85SS5hVC4u1PbVhjmrhH8
    yibo authored
     
    Browse File »

  • 实现路径: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
    yibo authored
     
    Browse File »