189 Commits

Author SHA1 Message Date
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
b341a43ad6 Revert "feat(task): 新增 cancel_task 工具,会话 agent 可取消单个任务"
This reverts commit fa5b5dc8e0f6fcd97c9ac72b364d1632d3d1fc67.
2026-08-19 19:53:07 +08:00
ymq
fa5b5dc8e0 feat(task): 新增 cancel_task 工具,会话 agent 可取消单个任务
背景:会话 agent 报告"没有终止运行中任务"的工具,只能靠驳回+附作废意见兜底。
核对:现有工具只有项目级(pause_project)/迭代级(start_next_iteration 的
_cancel_active_tasks、cancel_iteration)的停止能力,task_capability 连 S_CANCELLED
常量都没有,缺"取消单个任务"的任务级工具。

改动:
- task_capability.py: 加 S_CANCELLED 常量 + cancel_task()(任意非终态→cancelled+清
  claimed_by,CAS 只动非终态,附 audit)
- sdlc_ability.py: 加 cancel_task ToolDefinition + _h_cancel_task handler(前缀解析
  截断ID)+ SDL_HANDLERS 注册
2026-08-19 19:06:22 +08:00
ymq
4d543f529c fix(qa-feedback): raise_problem 归一化 question,修复 QC 改进意见丢失(1241)
根因:QC 审核的决策里 questions 是 list(7 条改进意见数组),qc_review_run 把
decision.get("questions") 直接传给 raise_problem 的 question 参数,而 raise_problem
未做 str 化,导致 INSERT pipeline_agent_questions 时 question 字段是 list,MySQL 报
OperationalError(1241, 'Operand should contain 1 column(s)'),改进意见根本没落库。

后果链:QC 意见丢失 → develop 重做时 _build_qna_section 读不到任何 pending 退回意见
→ 每次裸重做(看不到「为什么被驳回、该怎么改」)→ 反复产出同样的空交付件。

修复:raise_problem 里 question 若为 list/tuple,先 join 成换行字符串再入库。
2026-08-19 18:34:58 +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
ccc7baafbd feat(iteration): start_next_iteration 二次确认——当前迭代有未完成任务时须 confirm=true 才作废
当前迭代存在活跃任务时,start_next_iteration 不带 confirm 返回 CONFIRM 提示
("还有 N 个未完成任务,确认作废并启动下一迭代?"),用户确认后 agent 传 confirm=true 才执行。
无活跃任务时无需确认直接推进。抽 _active_task_ids 供计数与作废复用。
2026-08-19 17:17:32 +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
41232c8295 feat: 危险命令确认改为会话级——保留单次确认,新增「全部确认」选项(approve_all)授权后本会话不再询问 2026-08-19 14:09:27 +08:00
ymq
bda9f31a1b feat: 关闭 agent 会话危险命令确认——自动理解和接受全部确认,不再打断用户 2026-08-19 13:52:23 +08:00
ymq
7787898456 feat(project-space): 项目空间隔离——通用助手('general')与专业产线(pipeline_id)项目空间不共享
- workspace.build_workspace_path: {base}/{org}/{space}/{name},重名追加短ID
- get_workspace_dir 兜底路径加空间段
- AgentExecutor 加 generic 标志派生 self.space;create_project/switch_project 按空间过滤
- gateway 传 generic
2026-08-19 11:38:23 +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
ac85ee67f1 fix: create_task 的 iteration_id 归一化为迭代名(agent 传迭代 ID 时反查名称),修复任务树按名匹配计数为 0 的矛盾 2026-08-18 17:35:38 +08:00
ymq
8c6e49992c feat(worker): 认领加同项目串行(NOT EXISTS 无同 tenant 活跃任务),避免多 worker 并发写同一 workspace 2026-08-18 17:33:17 +08:00
ymq
1eba1c3f87 feat(worker): load_pipeline_service 按 PIPELINE_MODE 门控 poller 注册(web=仅HTTP无poller, worker=仅poller, all=默认) 2026-08-18 17:15:21 +08:00
ymq
8108d7d902 feat: 新增 /download slash 命令——实时打包项目tgz并生成下载链接 2026-08-18 16:03:59 +08:00
ymq
31ba001482 refactor(init): 移除 _init_v2_tables 启动期建表/加列,schema 变更统一走部署期 create_tables.py 2026-08-18 16:02:19 +08:00
ymq
5d40cdcd16 fix: 项目备份/删除 SQL 跨表 collation 不匹配——general_ci 表比较列统一 COLLATE utf8mb4_unicode_ci 2026-08-18 15:50:15 +08:00
ymq
06ae6bb1ac feat: 项目删除前确认+归档备份——delete_project(confirm二次确认)删除前自动备份tgz到机构工作目录_archive/,含工作目录+全关联表数据记录 2026-08-18 15:47:55 +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
7ec0fb611f fix: create_task 默认归当前迭代(最新迭代);_resolve_iteration_id 取当前迭代而非第一个 2026-08-18 14:05:20 +08:00
ymq
6add7ff4fa fix: /task 弹窗 widget url 用 base_url 拼完整绝对路径(前端 absurl 需完整 URL) 2026-08-18 12:53:55 +08:00
ymq
20395a78b6 feat: /task 命令返回任务树+输入输出 ResourceBrowser 弹窗 2026-08-18 11:57:00 +08:00
ymq
b819a665f6 fix: poller 加 watchdog(wait_for 60s 超时),防连接池/MDL 锁卡死导致停摆
agent_poller 和 pm_poller 的 poll_loop 改为 _poll_once + asyncio.wait_for(timeout=60)
包裹,每轮 poll 卡住超过 60s 就跳过本轮继续,不再因连接池耗尽/MDL 锁等待
(lock_wait_timeout 默认 24h)而永久停摆(2026-08 生产事故:poller 停摆 15.7h)。
2026-08-18 11:14:23 +08:00
ymq
0b75f10731 Revert "fix: 心跳超时从 20 分钟回收重跑改为 10 分钟强制结束标注超时失败"
This reverts commit feb88aca023fdf0859fa1f8dae589acbd14c771c.
2026-08-18 10:59:51 +08:00
ymq
feb88aca02 fix: 心跳超时从 20 分钟回收重跑改为 10 分钟强制结束标注超时失败
running 任务 updated_at 超 10 分钟未更新(进程崩溃/协程挂起僵尸),原逻辑回收回
submitted 重跑,改为 state=failed + last_error=心跳超时。中文 last_error 让
_classify_failure 判 fault 不自动重跑,failed_poller 报故障通知用户。
2026-08-18 10:53:13 +08:00
ymq
7ed0ed9b80 fix(llm_bridge): 网关 200 但无 choices 的响应自动重试,避免 KeyError 打崩角色agent
llmage 网关偶发返回 200 但内容无 choices(错误JSON),llm_call_msgs_native 的 data[choices] 直接 KeyError,导致 role_agent 任务失败并报人工介入。_post_chat_completion 对无 choices 的 200 响应视为可重试异常,重试后仍失败则 raise 带网关原始内容的 ValueError。
2026-08-17 18:43:37 +08:00
ymq
8cfae215e0 fix: 建任务时归一化 role(裸名 design/test → agent.design/agent.test)
会话agent create_task 工具(_h_create_task)和 storage.create_task 把 LLM 传来的
裸角色名原样入库,而角色agent认领时 _claim_task→_normalize_role 用规范名
(agent.{role})匹配,导致裸名任务永远匹配不上、卡 submitted 无人认领
(poller 每10秒空转 dispatch)。统一在建任务入口归一化 role 根治。
2026-08-17 18:13:05 +08:00
ymq
853f3d5082 fix: llm_bridge._decrypt_key 修复 unpassword 参数顺序 + key 默认值兜底,正确解密 confidential_fields 加密的 api_key 2026-08-17 15:28:16 +08:00
ymq
42bf89c0c1 fix: workspace fallback 统一到 WORKSPACE_BASE(/d/pipeline/workspaces),修复通用助手(无项目)仍用旧 /tmp/pipeline_ws 的问题 2026-08-17 15:15:02 +08:00
ymq
bb29d6d634 fix(gateway): resolve_project 改两步查询避免 JOIN 触发 collation 冲突 2026-08-17 13:33:28 +08:00
ymq
286f0cb4dd feat(llm): 个人选择模型(default_llm_id)接入会话agent+org_id改用户机构优先 2026-08-17 13:31:04 +08:00
ymq
791bd88c6d fix(llm): 严格本机构隔离,去掉系统级(org_id='0')兜底 2026-08-17 13:22:25 +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
3affc4dced feat: 7个SDLC概念能力模块(project/iteration/deliverable/test-plan/test-case/bug/deploy-env状态机CAS+审计) + sdlc_ability接线36工具 2026-08-17 11:00:10 +08:00
ymq
4abe93a8f9 feat: 接线feature工具到sdlc_ability(propose/list/approve/reject/verify 5工具+handler+ID前缀兜底) 2026-08-17 07:31:19 +08:00
ymq
df6f5cce34 feat: feature_capability.py 功能/需求状态机能力(CAS迁移+审计,scope=project_id) 2026-08-17 07:10:28 +08:00
ymq
7fa501d359 feat(audit): question 迁移接 record_audit
raise_problem(raise)/resolve_problem(resolve)/escalate_problem(escalate) 都写审计,
问题流转轨迹 append-only 可追溯(谁+何时+from→to)
2026-08-16 23:55:14 +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