• 51 号文档阶段 A 上线后发现:CEO 心跳自主立项建出的草稿(split:false)其实自动带 1 条
    draft task,dispatch 技术上立刻能跑,原以为的"零 task 闸门"并不存在——安全性曾经完全靠
    ceo/tools.md 里"不许自己调 dispatch"这一句提示词约束,没有代码层面的东西挡着。
    
    POST /goals/:goalId/dispatch 新增判断:created_by==='ceo' 且 updated_at===created_at
    (自建成后从没被 PATCH 过)直接 409。复用既有时间戳字段代理"有没有人碰过",不加新列——
    已知简化(ponytail 注释标了天花板:分不清"真审过"和"随手碰一下",精确区分需要专门的
    reviewed_at 列,留给阶段 B)。
    
    task-queue-routes.test.js 新增两条用例:未审阅的 ceo 草稿 dispatch 409、PATCH 一次后放行;
    human/未填 created_by 的草稿不受影响。相关四个测试文件 84 条用例 + 全量 unit 套件跑过,
    无回归(4 个不相关的预存在失败:工作区不干净的环境闸门 + 两个与本次改动无关的仓库卫生检查)。
    
    51 号文档 §四/七/八、docs/README.md 索引同步更新。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01AWsH2YBwBWTsQggPaPbsKJ
    yibo authored
     
    Browse File »
  • 公司没有任何 active/draft/planning goal 时,CEO 心跳原本会在第一步查询就拿到空列表、
    直接回复"心跳正常",永久停摆、没有信号升级给人类。心跳清单加一步空转检测,命中后走
    使命前置闸门(company-context.md 的"公司使命"是"待定义"就拒绝立项、转人工)+ 去重 +
    POST /goals(split:false, created_by:'ceo') 建草稿,CEO 到此为止、不自己调 dispatch。
    
    起服务实测(不只是读代码)推翻了设计草稿阶段的两处判断:GET /goals 不支持逗号分隔多状态
    查询、也不支持按 created_by 过滤(改客户端过滤);split:false 建出的草稿其实自动带 1 条
    draft task、dispatch 技术上立刻能成功,不存在"零 task 逼人工审批"这道代码闸门——阶段 A
    的安全性因此完全押在 tools.md 里"不许自己调 dispatch"这条提示词约束上,是当前最脆弱的
    一环,见 51 号文档 §四。
    
    未改任何路由/服务层代码,纯 agent 人设文档改动。阶段 B(CEO 自动 dispatch + guardrail +
    公司级开关)留白未实现。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01AWsH2YBwBWTsQggPaPbsKJ
    yibo authored
     
    Browse File »