From 190023ebbfb6e3ae09dd36111aa056c77bbbcc47 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 18 Sep 2026 00:05:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(ability):=20PipelineAbility=E5=8A=A0?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E4=BF=AE=E8=AE=A2/=E5=AE=9A=E5=90=91?= =?UTF-8?q?=E9=87=8D=E5=81=9A=E4=B8=89=E9=92=A9=E5=AD=90(2026-09-17?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=A3=81=E5=AE=9A:=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=9C=89=E6=9D=83=E8=B0=83=E6=95=B4=E6=B5=81=E7=A8=8B=E5=B9=B6?= =?UTF-8?q?=E8=A6=81=E6=B1=82=E4=BB=8E=E4=BB=BB=E4=B8=80=E9=98=B6=E6=AE=B5?= =?UTF-8?q?=E6=8C=89=E6=84=8F=E8=A7=81=E9=87=8D=E5=81=9A,=E6=88=96?= =?UTF-8?q?=E5=8F=AA=E7=BB=99=E6=84=8F=E8=A7=81=E7=94=B1LLM=E5=88=A4?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=E7=82=B9)=E2=80=94=E2=80=94stage=5Freentry?= =?UTF-8?q?=5Fdescribe(=E9=87=8D=E5=81=9A=E5=BD=B1=E5=93=8D=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=E8=BF=9B=E7=A1=AE=E8=AE=A4=E5=BE=85=E5=8A=9E,?= =?UTF-8?q?=E7=A0=B4=E5=9D=8F=E6=80=A7=E9=A2=84=E5=91=8A)/stage=5Freentry(?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E7=94=9F=E6=95=88=E6=97=B6=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E9=98=B6=E6=AE=B5=E9=87=8D=E7=BD=AE,=E4=BA=A7=E7=BA=BF?= =?UTF-8?q?=E8=AF=AD=E4=B9=89=E7=9F=A5=E8=AF=86)/progress=5Fsummary(LLM?= =?UTF-8?q?=E5=88=A4=E6=B3=A8=E5=85=A5=E7=82=B9=E7=9A=84=E8=BF=9B=E5=BA=A6?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87);getters=E4=B8=89=E4=BB=B6=E5=A5=97?= =?UTF-8?q?+=5F=5Finit=5F=5F=E5=AF=BC=E5=87=BA;flow-plan=E6=8A=80=E8=83=BD?= =?UTF-8?q?=E5=90=8C=E6=AD=A5(=E4=BF=AE=E8=AE=A2=E6=A6=82=E5=BF=B5/?= =?UTF-8?q?=E5=AE=9A=E5=90=91=E9=87=8D=E5=81=9A=E4=BC=9A=E8=AF=9D=E6=B5=81?= =?UTF-8?q?=E7=A8=8B/detect=5Freentry=5Fstage=E7=BA=AA=E5=BE=8B:=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=E5=A4=B1=E8=B4=A5=E5=A6=82=E5=AE=9E=E8=BD=AC=E5=91=8A?= =?UTF-8?q?=E7=A6=81=E8=87=AA=E5=B7=B1=E7=8C=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipeline_core/__init__.py | 3 +++ pipeline_core/ability.py | 34 ++++++++++++++++++++++++ skills_library/all/flow-plan/SKILL.md | 38 ++++++++++++++++++++++----- 3 files changed, 68 insertions(+), 7 deletions(-) diff --git a/pipeline_core/__init__.py b/pipeline_core/__init__.py index be8c086..23ae0bb 100644 --- a/pipeline_core/__init__.py +++ b/pipeline_core/__init__.py @@ -37,6 +37,9 @@ from .ability import ( get_flow_template, flow_template_to_dict, flow_stage_to_dict, + get_stage_reentry_handler, + get_stage_reentry_describe, + get_progress_summary_handler, ) from .slash import ( SlashCommand, diff --git a/pipeline_core/ability.py b/pipeline_core/ability.py index bbd7531..adf53f3 100644 --- a/pipeline_core/ability.py +++ b/pipeline_core/ability.py @@ -101,6 +101,22 @@ class PipelineAbility: menus: List[Dict] = field(default_factory=list) # 产线功能菜单(AgentIO 上方)[{"label","icon","url","type"}] flow_stages: List[FlowStage] = field(default_factory=list) # 预制流程阶段(空 = 该产线未声明可裁剪流程) flow_templates: List[FlowTemplate] = field(default_factory=list) # 多流程模板(≥2 条时文件导入触发 LLM 自动判流;空 = 单流程,用 flow_stages) + # ── 流程修订/定向重做钩子(2026-09-17,flow_plan_capability.revise_flow_plan 消费)── + # 用户有权在项目运行中调整流程、并要求从任一阶段按意见重做(甚至只给意见,由 + # LLM 判注入点 detect_reentry_stage)。引擎只做通用编排(修订计划提案/用户确认/ + # CAS 换版/钩子回调),「重置某阶段意味着清哪些产出、复位哪些状态」是产线语义 + # 知识,由产线注册钩子提供;未注册 = 该产线不支持定向重做(引擎诚实拒绝)。 + # stage_reentry_describe: async (sor, project_id, stage_key, affected_keys) -> str + # 重做影响说明(进确认待办正文——破坏性动作预告,用户确认前看得到将发生什么) + # stage_reentry: async (sor, project_id, stage_key, affected_keys, + # user_requirements, operator_id) -> (ok, msg) + # 确认生效时执行阶段重置(清产出/复位状态/作废下游交付物),之后产线流转 + # 机制(对账器/next_role 链)按既有逻辑自动从该阶段重新推进 + # progress_summary: async (sor, project_id) -> str + # 项目进度摘要(detect_reentry_stage LLM 判注入点的上下文) + stage_reentry_describe: Optional[Callable] = None + stage_reentry: Optional[Callable] = None + progress_summary: Optional[Callable] = None # ── 全局注册表 ── @@ -224,6 +240,24 @@ def flow_template_to_dict(t: FlowTemplate) -> Dict: } +def get_stage_reentry_handler(pipeline_id: str) -> Optional[Callable]: + """取产线注册的阶段重做执行钩子(None = 产线不支持定向重做)。""" + a = get_ability(pipeline_id) + return a.stage_reentry if a else None + + +def get_stage_reentry_describe(pipeline_id: str) -> Optional[Callable]: + """取产线注册的重做影响说明钩子(None = 无产线级说明,引擎给通用文案)。""" + a = get_ability(pipeline_id) + return a.stage_reentry_describe if a else None + + +def get_progress_summary_handler(pipeline_id: str) -> Optional[Callable]: + """取产线注册的进度摘要钩子(detect_reentry_stage LLM 判注入点用)。""" + a = get_ability(pipeline_id) + return a.progress_summary if a else None + + def flow_stage_to_dict(st: FlowStage) -> Dict: """FlowStage → dict(展示/落库用)。""" return { diff --git a/skills_library/all/flow-plan/SKILL.md b/skills_library/all/flow-plan/SKILL.md index 858e3a6..d8f77de 100644 --- a/skills_library/all/flow-plan/SKILL.md +++ b/skills_library/all/flow-plan/SKILL.md @@ -1,6 +1,6 @@ --- name: flow-plan -description: 产线流程裁剪与 PM 任务拆解的通用概念规范——预制流程阶段、裁剪合法性、确认门禁、复杂度判断与子任务编排。任何产线的会话 agent 裁剪流程、PM 拆解复杂任务时先读它。触发:流程裁剪/简化流程/跳过阶段/任务拆解/子任务编排。 +description: 产线流程裁剪/修订/定向重做与 PM 任务拆解的通用概念规范——预制流程阶段、裁剪合法性、确认门禁、运行中修订、从任一阶段重做、复杂度判断与子任务编排。任何产线的会话 agent 裁剪/修订流程、用户要求重做某阶段、PM 拆解复杂任务时先读它。触发:流程裁剪/简化流程/跳过阶段/调整流程/重做某阶段/从XX开始重来/任务拆解/子任务编排。 capability: flow_plan_capability tools: [create_sub_tasks] --- @@ -10,10 +10,15 @@ tools: [create_sub_tasks] ## 一、概念 - **预制流程** = 产线声明的阶段链(能力包 flow_stages:key/label/描述/可裁性/角色/依赖)。 -- **流程裁剪计划** = 项目级的一次性决定:哪些阶段保留、哪些裁掉。存 pipeline_flow_plans, +- **流程裁剪计划** = 项目级决定:哪些阶段保留、哪些裁掉。存 pipeline_flow_plans, 状态机 draft → pending_confirm → confirmed / rejected(驳回可修订重提,version+1)。 -- **裁剪只在项目启动阶段有效**:已有角色任务产出结果(approved/completed)后拒绝裁剪; - 确认后不可改(要改流程 = 新建项目)。 +- **首次裁剪(propose_flow_plan)只在项目启动阶段有效**:已有角色任务产出结果 + (approved/completed)后拒绝首次裁剪。 +- **运行中修订(revise_flow_plan,2026-09-17 起)**:用户有权随时调整流程——对已 + confirmed 计划提修订版(v+1 → pending_confirm),可改裁剪、可要求从任一阶段按意见 + 定向重做(reentry_stage)。修订确认前旧计划持续生效(无空窗);用户确认时换版 + (旧版 superseded)+ 产线钩子执行阶段重置(清产出/复位状态/作废交付物),之后 + 流转机制自动从注入阶段重新推进。 ## 二、可裁性三级(代码硬校验,不是 LLM 自觉) @@ -39,9 +44,28 @@ propose 时代码校验拒绝。**任何校验失败都要把原因如实转告 ## 四、会话 agent 工具 - show_flow_template:列预制流程阶段与可裁性(裁剪前必用,别凭记忆猜 key)。 -- propose_flow_plan(trim_keys, user_requirements, propose_note):生成草案+发确认待办。 - user_requirements 必须写用户要求原文(进确认待办给用户看)。 -- get_flow_plan:查计划状态与驳回意见。 +- propose_flow_plan(trim_keys, user_requirements, propose_note):**项目未开跑时**生成 + 首次裁剪草案+发确认待办。user_requirements 必须写用户要求原文(进确认待办给用户看)。 +- revise_flow_plan(user_requirements, reentry_stage?, trim_keys?, propose_note?, + reentry_detect_note?):**计划已确认后**的流程修订(改裁剪 和/或 定向重做)。 + 被拒绝并提示「已确认请改用 revise」时就用它。 +- detect_reentry_stage(user_comment):用户只给修改意见、没指明从哪个阶段重做时调用—— + LLM 按意见+阶段声明+项目进度判定注入点(语义判断归 LLM,禁词匹配)。返回 + stage_key+判定依据 note,**原样**传给 revise_flow_plan(note 进确认待办由用户核对, + 错判由确认门兜住)。判定失败(空 key)时如实转告用户失败原因,禁止自己猜阶段。 +- get_flow_plan:查计划状态、驳回意见、定向重做注入点。 + +### 定向重做的会话流程(用户说「从XX重做/按意见改」时) + +1. 用户指明了阶段 → show_flow_template 核对 key → revise_flow_plan(reentry_stage=key, + user_requirements=用户意见原文)。 +2. 用户只给意见没指明阶段 → detect_reentry_stage(user_comment=意见原文) → + 成功则 revise_flow_plan(reentry_stage=返回key, reentry_detect_note=返回note原文, + user_requirements=意见原文);失败则如实转告。 +3. 修订确认待办发出后告知用户:确认前旧计划持续生效;确认时才执行阶段重置 + (待办正文有破坏性影响预告——重置会清哪些产出、作废哪些交付物)。 +4. 你没有确认权——禁止声称已确认/已重做;用户确认后流转机制自动推进,不要替用户 + 手动派任务。 ## 五、PM 复杂度拆解(create_sub_tasks)