81 Commits

Author SHA1 Message Date
ymq
32cd8c2e8a fix: 模块技能全文加载剥离 frontmatter,对齐分层导入规范
模块技能作为「项目模块」scope 注入时,目录层只放名字+描述,
全文层(load_skill)剥离 frontmatter 只返回正文,与 skill_loader.
to_prompt_block 行为一致。
2026-08-23 21:24:47 +08:00
ymq
7ede8f4d7a feat: 任务来源分类机制 + classify_task 工具 + 模块技能注入项目空间
根因修复(develop 不调 fix_bug 导致 bug 恒 open、链断):
1. 三条任务创建路径打 task_kind 标记:_create_next_task=new_dev、
   _rollback_task_chain=rework、_pm_create_tasks 按标题判 bug_fix/new_dev
2. bug_capability 新增 classify_task 工具:读 task_kind 标记判断任务来源
   (老任务按 rollback_from/title 兜底),develop 据此决定是否走 fix_bug 状态机
3. TOOL_SCHEMAS 注册 classify_task + capability_ctx 注入 task_id
4. 增强能力:_collect_module_skills 运行时扫描 workspace repos/*/skill/SKILL.md,
   作为「项目模块」scope 注入技能目录 + load_skill 支持加载模块技能全文,
   让项目角色知道引用的业务模块怎么用(架构/数据模型/挂载函数/坑)
2026-08-23 21:23:52 +08:00
ymq
8d3dd7c980 fix: 回退任务链 pm_assigned 污染 + 模块级判断改 previous_role + start_fix 放宽 open
三处根因修复(hrs6 回退重做任务 approve 后链断的完整根因链):

1. _rollback_task_chain 创建回退任务时 new_params.pop('pm_assigned'):
   回退重做任务继承 target_task 的 pm_assigned=True,approve 后命中
   「模块级 develop 跳过 deploy_test」分支,任务链断在 approved。
   与 _create_next_task 的 pop 对齐(两处同源,回退路径漏了)。

2. 模块级 develop 判断从 pm_assigned 改为 previous_role 为空:
   pm_assigned 会被 design 任务污染(design 也是 PM create_tasks 派发、
   带 pm_assigned=True,派生的应用级 develop 继承后被误判模块级)。
   previous_role 才是可靠信号:模块级(PM 直接派发)= 空,
   应用级(design 派生/回退重做)= agent.design。

3. start_fix 放宽 from 状态 [confirmed] → [confirmed, open]:
   PM review_rollback 回退 develop 时不走 confirm_bug,bug 停在 open,
   start_fix 只认 confirmed 导致 develop 修完代码无法 fix_bug,
   bug 永远 open、闭环断在 fixed 环节。
2026-08-23 14:48:14 +08:00
ymq
e3301f5ed9 fix: capability_ctx 的 iteration_id 用 getattr 对 dict 取 id 返回空
get_current_iteration 返回 dict(_rec_to_dict 转的),但 capability_ctx 用
getattr(_iter, 'id', '') 取 id,dict 无 id 属性 → 返回空 ''。导致 test agent 调
create_test_plan/create_case 时拿到的 iteration_id 是空,为绕过「缺少 iteration_id」
报错而显式传迭代名「人事项目6-第3迭代」→ sd_test_plans.iteration_id 存成了迭代名
而非 sd_iterations.id → JOIN 关联全断,测试计划/用例无法归属迭代。

改为 _iter.get('id', '')(dict 取值),与其他调用方一致。
2026-08-23 10:37:54 +08:00
ymq
8bd1b45cba fix: _create_next_task 清除 pm_assigned,防其从 PM 派发任务污染到自动创建的下游任务
根因:PM 派发的 design 任务带 pm_assigned=True,design approved 后 _create_next_task
用 {**params} 继承,导致自动创建的应用脚手架 develop 也带 pm_assigned=True,
被 deploy_test 触发判断(1785 行)误判为「模块级 develop」,跳过 deploy_test,
迭代停在 11 模块 develop approved、永远不部署不测试。

pm_assigned 是「PM 按模块清单派发」标记,只作用于当前任务,下一角色任务由系统
自动创建,必须清除。
2026-08-23 08:54:03 +08:00
ymq
ec0a0936d3 fix: 部署以应用为单位——模块级 develop(PM派发)approved 后不创建 deploy_test
模块级 develop(params 含 pm_assigned)是 PM 按模块派发的开发任务,模块不独立部署,
approved 后不应创建模块级 deploy_test(否则每个模块一个 deploy_test = 部署以模块为单位,
即多端口问题的部署侧根源)。deploy_test 是应用级,只由应用脚手架 develop 触发。
2026-08-22 18:21:08 +08:00
ymq
0af4faff21 feat: LLM 机构隔离——机构没配 llm 时角色/PM/QC 冒泡问题暂停
- _check_org_llm 检测机构 llm 配置(严格本机构隔离,不含系统级兜底)
- role_agent_run/pm_review_run/qc_review_run 在 LLM 调用前检测,机构没配 llm
  则 raise_problem(need_info) 冒泡问题暂停,等机构配置模型后恢复
2026-08-22 11:36:27 +08:00
ymq
14dca0cc43 feat: 项目-角色-模型配置 + 角色agent模型解析链
- sd_projects 加 default_model 字段(项目缺省模型=创建时的会话模型)
- _t_create_project 记录 created_by + default_model
- _resolve_llm_context 解析链:显式→项目-角色-模型(sd_project_role_models)
  →项目缺省模型(default_model)→RoleSpec→pipelines.default_model→deepseek-v4-pro
- 新增工具 list_role_models / set_role_model(项目设置界面后端)
2026-08-22 10:19:50 +08:00
ymq
c50a5b9914 fix: load_skill 工具归一化 role(裸名 qc/pm → agent.qc/agent.pm)
根因:qc_review_run/pm_review_run 调用 _load_skill_by_name 传裸名 'qc'/'pm',
get_merged(role='qc') 加载不到 roles/agent.qc/ 目录,导致 QC 审查 design 时
load_skill(review-design) 失败 → 退回 3 次达上限 → 任务 waiting → 项目 paused。

修复:_load_skill_by_name 内部 _normalize_role(role),覆盖所有调用点。
2026-08-22 08:16:28 +08:00
ymq
6e82493c20 feat: 能力工具按 capability 动态注入(根治纸面落库)
- 新增 capability_tools.py:TOOL_SCHEMAS 工具 schema + 从产线状态机规范 frontmatter
  读取 capability→tools 映射(可配置)+ exec_capability_tool 分发
- agent_loop 加 _collect_capability_tools:角色技能(scope=role)声明 capability,
  匹配产线状态机规范(scope=pipeline)的 tools 声明,注入对应能力工具
- role_agent_run 注入能力工具(AGENT_TOOLS+capability_tools) + capability_ctx
  (project_id/iteration_id/who/agent_id 自动注入,LLM 不可见)
- _exec_agent_tool 分发能力工具到对应 capability 函数
- 根治:requirement 无法 propose_feature、test 无法 create_case/report_bug
  只能写文档假装落库(sd_features 表=0)的问题
2026-08-22 01:19:27 +08:00
ymq
b31cb6c816 fix: pm/qc 角色技能加载归一化 role(agent.pm/agent.qc)
pm_review_run/qc_review_run 传裸名 'pm'/'qc' 给 _build_role_skills_block,
get_merged 按 role_key 精确匹配目录,裸名匹配不上 agent.pm/agent.qc 目录,
导致 pm/qc 角色技能永远不注入。改为 _normalize_role('pm'/'qc')。
2026-08-22 00:12:41 +08:00
ymq
3c34eedb04 fix: 统一项目过程仓库命名 repos/{项目名}_pc(修复与 project-directory-spec 的路径错位)
- PROJECT_REPO_NAME 保留为回退默认值,_ensure_project_repo 改为按 {项目名}_pc 命名
- _setup_repos/role_agent_run 查项目名并注入 __PROJECT_NAME__ 占位符
- SDL_ROLES 6 个角色 prompt 的 repos/project/ 全部改为 repos/__PROJECT_NAME___pc/
- 根因:角色 prompt 硬编码旧名 repos/project,与 project-directory-spec(权威规范) 要求 {项目名}_pc 不一致,导致首次产出必被 QC 驳回
2026-08-21 23:35:57 +08:00
ymq
78b84c710e feat(sdlc): 会话agent加任务流转工具 approve_task/complete_task/cancel_task(PM权限)
- task_capability 新增 cancel_task 原语(CAS+审计+终态守护)
- sdlc_ability 加 3 个 ToolDefinition + handler,who=agent.pm 记录 PM 权限操作
- _resolve_task_id 租户隔离前缀兜底
- SDL_PROMPT 补任务流转典型场景
- _pm_cancel_task 委托新原语,去掉重复 SQL
2026-08-21 22:43:11 +08:00
ymq
6dbb574862 refactor(sdlc): 技能 base_dir 改全局 skills/(单一技能树,去掉机构副本路径)
- agent_loop: _build_role_skills_block/_load_skill_by_name 改 get_skills_base()
- agent_loop_v2: _resolve_skills_base_dir 改返回 get_skills_base()
2026-08-21 19:18:51 +08:00
ymq
6b4acaff13 fix(sdlc): 目录层 essential 基础规范优先排序——project-directory-spec 等 essential 技能排最前,不被 60 个截断 2026-08-21 18:41:15 +08:00
ymq
71d30e6d45 feat(sdlc): 技能分层导入统一——所有角色技能只注目录层 + load_skill 按需加载全文/子文件(含 PM/QC),对齐 Hermes 分层机制
- _build_role_skills_block: 删除 role scope 全量注入正文特例,所有技能统一目录层
- 新增 _load_skill_by_name: load_skill 工具后端,支持 name 加载全文 + file_path 加载 references/scripts/templates 子文件
- AGENT_TOOLS/PM_SYSTEM_PROMPT/QC_SYSTEM_PROMPT: 加 load_skill 工具 + 技能使用引导
- role/pm/qc 三个 run 的 tool-loop 加 load_skill 拦截
- QC 检查维度改为先 load_skill 加载 project-directory-spec 再检查路径
2026-08-21 18:36:18 +08:00
ymq
9f8534bc4e fix(skill): 回退 description 截断缩短,保留优先级顺序+目录60 2026-08-21 12:07:20 +08:00
ymq
3ecb4f755c fix(skill): 角色技能目录 30→60 + 描述精简 + 优先级顺序同步 2026-08-21 12:05:27 +08:00
ymq
8a2d462382 fix: TimeoutError 治理——缩小 read_file 上下文 + 放宽 LLM 外层硬超时给足重试
根因:develop agent 的 LLM 调用(deepseek-v4-pro→qwen3.8-max 经 llmage 网关)在
大上下文多轮累积时偶发挂起/返回 FAILED,llm_bridge 300s×3 重试被外层 420s 硬超时
提前掐断(只够 ~1.4 轮),可自愈的瞬时故障也 TimeoutError 超限暂停任务链。

修复:read_file 30000→12000 缩小上下文;_LLM_HARD_TIMEOUT 420→600 给 llm_bridge
至少 2 轮完整重试机会。
2026-08-21 00:10:38 +08:00
ymq
d97c1442fa fix: 模块仓库本地 git 化——develop git_commit_push 自动 init+本地提交作为产出证据,QC 改查实际文件不再要求远程推送
根因:设计阶段模块仓库URL是规划占位地址(git@code.local),develop 的 git_clone 失败后
代码直接 write_file 到 repos/<模块>/ 但从未 git init,导致模块仓库无 .git;加上上一轮
「审核后统一提交」让 develop 连本地提交都不做,QC 找不到 git 提交证据 → qc_reject 死循环。

修复:_git_commit_push 非 git 目录自动 init;develop 提示词改为本地 git init + git_commit_push
提交模块仓库;QC 提示词改为 list_files/read_file 核验真实文件 + 本地提交,不因无远程推送退回。
2026-08-20 23:44:51 +08:00
ymq
38e47be4db feat: git 提交改为审核通过后统一提交——role agent 不再每次产出提交(移除 auto-commit + 角色提示词 git_commit_push),PM approve 后统一 commit 项目过程仓库+应用/模块仓库,减少并发锁与远端 push 频率 2026-08-20 21:45:07 +08:00
ymq
7a2175f363 fix(role-agent): LLM 调用加 asyncio.wait_for 硬超时兜底,防挂起无心跳
role_agent_run 的 llm_call_msgs_native 内部 300s×3 重试最坏 15 分钟,
期间心跳不更新(心跳在调用前 touch),观察上像任务挂起/僵尸。
外层 asyncio.wait_for(420s) 硬上限:① 缩短最坏时长到 7 分钟
② 防 aiohttp total 超时因 DNS 等场景失效导致的真正无限挂起。
超时抛异常 → mark_failed → retry+1 → 重新认领,不再无限卡住。
2026-08-20 15:21:14 +08:00
ymq
c848dc1d4c refactor(agent_loop): 删除 v1 硬编码角色定义,统一走能力包
- 删 ROLE_SPECIFICS(角色 prompt 硬编码,已被 sdlc_ability.SDL_ROLES 完整覆盖)
- 删 ROLE_CHAIN(任务链硬编码,已被 RoleSpec.next_role 覆盖)
- _resolve_role/_get_next_role 去掉 fallback,只走 get_role_spec
- 删死代码 PM_PROMPT/_is_safe_workdir/_parse_result(0 引用)
- 保留 ROLE_ALIASES:服务 _normalize_role 的 who 规范化(27 处调用点依赖),
  与能力包角色 prompt 是不同职责
2026-08-20 14:37:14 +08:00
ymq
917eb3eda9 feat(role_agent): role_agent_run import role skills 2026-08-20 12:02:49 +08:00
ymq
7f05a3b467 fix: _ensure_project_repo 在 git init 之后才配置仓库级 user(否则 git config 报 not a git repository 导致初始 commit 失败) 2026-08-20 00:45:32 +08:00
ymq
c319cb74df feat: repos目录规范——项目过程仓库(阶段/QC/PM文档)+应用仓库+模块仓库; 阶段文档产出到repos/project并git commit; 临时文件不进仓库 2026-08-20 00:38:50 +08:00
ymq
b4bc1a5d1e feat: 新增模块设计模板(design.md+skill/SKILL.md)——统一模块设计结构,design产出用模板保证develop读到一致结构 2026-08-19 23:14:38 +08:00
ymq
eb861b2c70 refactor: design产出拆两层——应用级(architecture+ui-design风格/主页/交互/弹窗规范),数据设计下沉到各模块(数据/CRUD/处理逻辑/skills)实现模块自包含复用 2026-08-19 23:11:38 +08:00
ymq
f78d327853 refactor: 模块划分下沉到design阶段——设计师定模块+依赖关系+开发顺序,PM按设计师模块清单派发develop任务 2026-08-19 23:02:20 +08:00
ymq
596717a3d6 feat: 模块化拆分原则——概念相近功能独立模块+独立仓库+伞仓库,基础模块(apppublic/sqlor/ahserver/accounting/appbase/rbac)可引用不必再开发 2026-08-19 22:55:52 +08:00
ymq
d84f68dd7e fix: develop不deliver三修——①限制探索轮数+强制产出 ②实际产出兜底(检测write_file/git) ③巨型任务拆小(粒度控制) 2026-08-19 22:46:40 +08:00
ymq
3ffe39e885 fix(task-flow): QC/PM 驳回加重试上限,打破「空交付件→驳回→重做」死循环
根因:develop agent 产出空交付件 → QC 驳回(qc_reject)直接 qc_review→submitted,
不递增 retry_count、不检查 task_max_retry 上限 → 无限重做循环;3 个 running 任务
占满 max_concurrent_agents=3 全局名额 → agent poller avail=0 不再派发 6 个 submitted
任务 → 任务整体饿死,只有手动 start_agents(绕过并发限制)才走一步。

修复:
1. task_capability.py 新增 _reject_with_retry_limit:退回时 retry_count+1,超
   task_max_retry(默认3)则转 failed(释放并发名额,交 failed poller 报故障给人工)。
   qc_reject_task / reject_task 统一走它。
2. agent_loop.py qc_review_run 驳回时感知超限转 failed,跳过建 qc_reject 问题
   (failed poller 会报 fault_report),返回 failed 而非 rejected。
2026-08-19 18:15:39 +08:00
ymq
d77910ea2e feat(iteration): 迭代状态机改造——显式「当前迭代」+ 序号 seq_no + 启动下一迭代,废除 created_at 推断
背景:用户明确迭代状态机语义——当前迭代唯一(状态 in_progress)、按序号 1,2,3 推进、
需用户指令启动下一迭代、启动下一迭代时若当前未结束则强制完成。

1. iteration_capability.py:
   - create_iteration 自动分配 seq_no = 项目内 max(seq_no)+1
   - 新增 get_current_iteration(sor, pid):当前迭代 = status='in_progress' 唯一迭代
   - 新增 start_next_iteration(pid):强制完成当前迭代 + 作废其活跃任务 + 启动下一个 planning 迭代
   - list_iterations 按 seq_no 排序
2. sdlc_ability.py: 4 处 created_at 推断(默认迭代)收口到 get_current_iteration;
   新增 start_next_iteration 工具;list_iterations 显示 seq_no + 当前迭代标记
3. agent_loop.py: PM 派发任务默认迭代收口到 get_current_iteration
4. agent_loop_v2.py: create_project 初始迭代 status 从非法的 'active' 改为 'in_progress' + seq_no=1
2026-08-19 17:06:31 +08:00
ymq
eb910bc7b8 fix(task-chain): PM审核断链三处修复——未识别输出不再默认completed、review_complete仅终结角色可用、迭代边界只认显式completed/cancelled
根因:需求任务验收通过后设计任务未自动创建,项目卡在「无任务运行」的假终态。

1. pm_review_run 的 else 分支把未识别 PM 输出(deliver/纯文本/格式错误)静默当作 review_complete,
   任务置 completed 且不创建下一角色任务,任务链断裂。改为追加纠错提示继续下一轮,轮次耗尽兜底 rejected。
2. 新增防御:非终结角色(requirement/design/develop/deploy_test/test)收到 review_complete 时修正为 approved。
3. 迭代边界检查从「非最新迭代即终止」改为「仅迭代状态 completed/cancelled 才终止」,
   新建二期迭代不再阻断一期仍在跑的链。
4. PM prompt 澄清 review_complete 仅 deploy_prod 最后阶段使用。
2026-08-19 16:15:05 +08:00
ymq
536f51434f feat: 任务最大重复数(task_max_retry)——超限暂停任务链+抛故障给人工,人工处理后reset_task_retry清零重执行 2026-08-19 07:29:08 +08:00
ymq
981b58b0d2 feat: PM项目推进铁律——默认自动推进(暂停才需指令),加 paused 项目状态 + pause/resume 工具 + PM暂停门控 2026-08-19 06:37:16 +08:00
ymq
834505fcfc feat: PM任务分解与编排——父子关系(parent_id)+依赖串行(depends_on)+任务树分层 2026-08-19 05:53:28 +08:00
ymq
f542fdad8a feat(pm): 加 cancel_task 工具 + agent 循环取消检测 + create_tasks 重做前自动取消同标题活跃任务 2026-08-18 18:26:36 +08:00
ymq
781858b61a feat(worker): git 锁从 flock 升级 DB 锁表(pipeline_git_locks),跨主机多 worker 生效,TTL 180s 崩溃自释放 2026-08-18 18:13:50 +08:00
ymq
ff9db3d310 refactor(worker): 撤项目级串行,改 git 级串行锁(flock 同 repo),任务其它部分(LLM/写文件)完全并行 2026-08-18 17:55:21 +08:00
ymq
8c6e49992c feat(worker): 认领加同项目串行(NOT EXISTS 无同 tenant 活跃任务),避免多 worker 并发写同一 workspace 2026-08-18 17:33:17 +08:00
ymq
a00ba32430 feat: PM 审核新增 review_rollback 决策——测试 Bug 后按问题内容回退到任一阶段,回退点之后的关联任务全部作废并重做 2026-08-18 15:38:55 +08:00
ymq
ab776d0c37 feat: 新增 QC 角色(质量门禁)+ 部署拆分为 deploy_test/deploy_prod + requirement 明确部署环境需求
- SDL_ROLES 6 环新链:requirement→design→develop→deploy_test→test→deploy_prod,新增 agent.qc
- 状态机新增 qc_review:角色交付→QC 合规/质量检查→PM 验收→下一环
- qc_review_run + qc poller;不合规退回重做
- requirement 职责增加部署环境需求明确
2026-08-18 15:16:43 +08:00
ymq
e26826f924 fix: 迭代边界——老迭代任务 approve 后不再自动触发下一角色任务(新迭代创建后老迭代链终止) 2026-08-18 14:48:03 +08:00
ymq
dfa441b09b feat(pm): 固化 PM 项目计划/任务分配/任务验收职责,新增 create_tasks 批量派发后续任务,修复里程碑审批后链断 2026-08-18 14:23:20 +08:00
ymq
42bf89c0c1 fix: workspace fallback 统一到 WORKSPACE_BASE(/d/pipeline/workspaces),修复通用助手(无项目)仍用旧 /tmp/pipeline_ws 的问题 2026-08-17 15:15:02 +08:00
ymq
e9838a3ec6 feat(llm): llm表查询按org_id多租户隔离(本机构+系统级),角色agent与会话agent模型选择统一(RoleSpec.model_name→产线default_model→deepseek-v4-pro) 2026-08-17 12:18:33 +08:00
ymq
bf819f3b79 refactor(agent_loop): 状态机迁移走 task 能力 + 角色规范化 agent.{role}
- 角色规范: agent 角色 agent.{role}(_normalize_role 补前缀+ROLE_ALIASES/ROLE_CHAIN/SDL_ROLES 改规范名),
  人角色 {orgtype}.{role}(默认 owner.superuser)
- role_agent_run/pm_review_run/handle_failed_task 硬编码状态 SQL 改 task_capability 工具
  (submit/approve/reject/complete/mark_failed/retry,CAS+审计)
- communication/questions/sdlc_ability 默认 handler 角色规范化(main_agent→agent.main_agent, customer→owner.superuser)
- 通用助手路径(AgentExecutor)不动,保持 hermes 式自由对话
2026-08-16 23:51:55 +08:00
ymq
6707cabedc refactor(team-communication): 问题冒泡改为显式路由,规范移交 skill
规范(团队角色/问题类型/冒泡路径)移交 team-communication skill,由 LLM 读 skill 决策;
系统只固化通用问题工具,不读配置表、不存路径快照:
- communication.py: raise/resolve/escalate/list_for 显式路由,
  escalate 显式传 next_handler;current_handler_role/agentid 两列确定性过滤
- questions.py: 向后兼容层适配
- agent_loop.py: need_info/review_reject/fault_report 显式 first_handler_role
- sdlc_ability.py: escalate_question 显式转 customer
- models: 去 escalation_path/pos,加 current_handler_role/agentid
2026-08-16 22:08:00 +08:00
ymq
4f2c6da6cf feat(team-communication): 通用问题冒泡引擎(多agent感知)
- communication.py: raise/resolve/escalate/list_for,问题类型→冒泡路径,处理方=role+agentid
- questions.py: 向后兼容层,委托 communication
- agent_loop.py: 角色提问(need_info)/PM退回(review_reject)/故障(fault_report)走 raise_problem;
  _build_qna_section 按 handler 路由注入;PM approved 只答结 review_reject
- sdlc_ability.py: list_questions/answer_question/escalate_question 按 handler 路由
- models: pipeline_agent_questions 加 from_agentid/problem_type/escalation_path/escalation_pos
2026-08-16 21:25:39 +08:00