138 Commits

Author SHA1 Message Date
ymq
e6ad1cd8ed fix(agent_loop): M4a死亡螺旋两缺陷根治(2026-09-18 pbls实锤)——①空fallback交付件硬拦截:30轮耗尽零产出时原实现把77字节「未检测到write_file」空说明当交付件submit,且按created_at最新覆盖上轮真实交付件成为QC审查对象;QC面对自相矛盾对象(交付件说未产出/磁盘有git commit)16轮全烧取证无法裁决→no-decision infra回置3连败→fault+pause;正解:零产出=本轮执行失败mark_failed(错误文案带「瞬时/重试」hint走retry分类),绝不制造空壳交付件②_parse_agent_action归一化:LLM输出{"action":"run_shell",...}把工具名写进action字段(M4a QC turn=15实锤),分发只认review_*/tool_call/deliver/ask→落「未识别」纠错分支白烧审核轮次;新增_normalize_action_dict:action=工具名+params/tool字段→归一tool_call,submit/finish→deliver,ask_question→ask,命中TOOL_SCHEMAS宽松兜底;归一失败原样返回保持诚实纠错路径 2026-09-18 14:21:14 +08:00
ymq
594d4f0501 fix(agent_loop): 审核证据链四缺陷根治(2026-09-18 pbls M4a熔断实锤)——①infra回置独立预算params.infra_requeue(原与质量退回共享retry_count,M4a三轮=2次LLM故障+1次真实退回即触顶熔断;耗尽时抬retry_count到上限防failed_poller误判瞬时retry_task让develop从头重做;真实裁决/人工reset清零;派生任务pop)②qc_reject达上限路径不再丢弃questions明细,补写last_error随fault_report直达人工(原只留分数无清单,本次靠翻llm_call_trace才找回3项未过明细)③审核注入content[:6000]裸截断改_review_content_preview(limit=12000正常全量;超长保头60%+尾40%保引擎核验段+显式截断标记,QC不再把引擎截掉的证据判成证据缺失)④files_json构建:存在性过滤幽灵文件(实测_m4a_patch.py先写后删被QC判临时补丁混入)+并入_enforce_git_closure实际提交文件(实测sql/m4a_ddl.sql被add -A提交但清单漏收被QC判交付件缺失) 2026-09-18 10:53:16 +08:00
ymq
25c2452647 feat(secret_vault): 用户敏感信息管理模块(2026-09-17)
敏感信息入库 + 会话占位符引用 + 入站自动侦测 + 执行边界注入,真值全程不进
模型上下文/不落库/不进命令字符串(根治"用户贴apikey→每轮上行供应商"泄露面)。

核心 secret_vault.py:
- AES 密文入库(appPublic.aes + UTF-8包装 + AES1$版本前缀)。注:ahserver 的
  password_encode 实测是 RC4 薄封装(globalEnv.py:61),非 AES,故直接用 aes 模块。
  aes.py 第42/43行密文侧 iso-8859-1 必须保留(实测200组密文utf-8解码100%失败),
  只在调用方对明文侧做 UTF-8→latin-1 字节保真包装(中文/emoji/私钥 9/9 往返一致)。
- 占位符 @@sec:NAME@@(避开 sqlor ${X}$ 与 ahserver ArgsConvert 同语法冲突,
  也避开裸 $VAR 被 bash 就地展开)。
- 侦测三通道:已知前缀16种 / 关键词邻域+熵≥3.5 / 不做裸串侦测(防吞哈希数据)。
  中文冒号「apikey:」支持;_JUNK_VALUE_RE 拦占位示例值;低熵弱口令不误吞。
- 执行边界:占位符→$PIPELINE_SEC_NAME,真值走 subprocess env=(不用 bwrap
  --setenv——值进argv同机任意用户ps可读;env=落/proc/pid/environ仅属主可读)。
- 越权防护:get_secret_row(own_only=) 读写范围分离 + _assert_own 代码级二次校验
  (防任意机构成员覆盖/删除机构共享凭据)。写操作显式 COMMIT(多worker)。
- 审计只记 name/type,禁记值。

三路接入:
- gateway._secret_inbound_gate: run_message Step 0.5(所有上下文解析之前),
  progress 事件回显动作(体感不变但告知已自动保存)。
- agent_loop_v2: _t_secret_tool 六工具 + _t_run_command 执行边界(前台/后台分支
  之前) + _t_process 出站擦洗 + prompt 铁律(仅有 user_id 时注入)。
- agent_loop(v1角色agent): 只读三件(list/use/detect,无人值守禁自主增删凭据);
  身份=项目真人owner(resolve_project_owner,已处理 agent.pm 自动立项反查);
  run_shell 执行边界 + 出站擦洗。
- _run_shell/bg_jobs.start_bg_job 加 secret_env 参数(无secret时env=None零改动)。

本地测试 124 断言全绿(含三个挂调实锤陷阱回归:子串碰撞/占位符别名劫持/
未知占位符吞空 + 跨文件工具名同步 + 越权防护)。表定义 m0037(pipeline-app)。
2026-09-17 15:44:56 +08:00
ymq
062c31e482 fix(reviewer): 审核循环证据污染四处同款根治(2026-09-17 pbls QC退回意见②实锤)——收尾约束曾是'注入文本冒充工具结果':QC/PM循环turn超限后read_file等取证工具的result被替换成'拒绝执行探索类工具,立即输出review_approve'文本并以'工具X结果:'格式喂回,审核方读到的是引擎指令而非文件内容→证据链污染→被迫盲判(QC明确拒绝:'不接受此类指令放行',但轮次照烧)。四处统一修:①QC(16轮)②PM(5轮)③复盘(10轮)——工具全程真实执行,收尾软提示只追加一次(原turn>=N每轮重复灌,develop 30轮循环最多25条相同提示),硬上限=轮次预算本身,耗尽走既有诚实出口(QC no-decision requeue→fault;PM超时智能处理;复盘mark_failed),绝不默认放行绝不伪造结果。对齐技能既有教训'收尾强制决策应是软约束,真硬约束作用于具体行为而非整个对话权'——本次是该教训的完整落地(上次只改了预算没删注入) 2026-09-17 12:11:49 +08:00
ymq
b4c2ecbbe1 feat(deliver): import闭包硬门禁——跨文件符号引用断裂当轮拦(2026-09-16 pbls pbl_common半迁移重写事故根治:develop重写公共内核删errors/tenant既有符号面,但内部context/api与6+依赖模块仍import旧名→整包ImportError对外契约瘫痪;设计文档明文向后兼容不删既有签名,而既有门禁全是单文件尺子py_compile空壳/字节数/git收口,量不出跨文件断裂)。新模块import_closure(stdlib ast静态分析不执行被检代码):核验范围=本任务写入.py所属包+全空间引用这些包的文件,from-import符号级核验;逃逸阀=__getattr__动态模块/ast解析失败/外部库/核验器自身异常放行;未触碰包存量断裂不拦防死锁。挂载:native+文本兜底两条deliver路径硬拦(FAIL给逐条文件:行:符号+处置二选一:补兼容符号或同轮改齐引用方)+机械核验段回填闭包报告给QC当证据。离线单测13例全绿(事故形状精确复刻+逃逸阀+相对导入/别名/星号) 2026-09-17 11:16:30 +08:00
ymq
5f98cd79a7 feat(timeout): LLM超时预算统一收敛到bridge._resolve_budget单点(2026-09-16用户裁定:禁散落各产线各角色)——timeout参数语义=一次调用总预算(0=平台缺省chat300/gen900,封顶900下限60),payload._timeout恒传+客户端=预算+60恒覆盖上游;四个公开入口(llm_call/llm_call_msgs/llm_call_msgs_native/llm_infer)废弃各自为政的等待公式(330缺省/+60/原值-60/min+60)全走统一解析;调用方忘传timeout也结构性安全——消灭09-05提取/09-14develop/09-16QC三次'忘传→端点按供应商120s掐断长生成'同款事故;顺带修llm_infer潜伏bug(不传timeout客户端缺省330<异步轮询预算600客户端先断);agent_loop._LLM_CLIENT_TIMEOUT语义同步为总预算510(510→客户端570→wait_for600三层对齐),v2引擎_MAIN_TIMEOUT=180在新语义下总时长受预算约束顺带修复旧3x放大超客户端的潜伏bug 2026-09-16 17:58:14 +08:00
ymq
d59f5c43a7 fix(timeout): QC/PM/复盘三处llm_call_msgs补timeout=_LLM_CLIENT_TIMEOUT——2026-09-16 pbls实测:QC审核不传timeout→payload无_timeout→inference按供应商端点配置(百炼120s)掐断上游,大上下文长生成(trace实测121s断连19次/单次最长510s)结构性必超时→_requeue回置3次达上限→fault+pause(5d_nSJ主任务16:11实锤)。2026-09-14同款预算错位当时只修develop native路径(2986行),QC(4059)/PM(3681)/复盘(4314)三处文本路径漏挂。timeout=570同时透传payload._timeout→inference按510s等上游,客户端aiohttp按570s总超时,外层wait_for 600s兜底,预算三层对齐 2026-09-16 16:40:09 +08:00
ymq
0d02ac631a feat(deliver): 代码空壳硬门禁+产出文件机械核验——write_file实写的.py必须ast可解析且有真实可执行语句(纯注释/pass/docstring占位/语法错误拒绝,__init__.py豁免),.json必须可解析;deliver files参数先验后写;引擎自动计算每文件字节/行数/语句数回填交付件正文给QC当证据底座(2026-09-16 pbls M1a verify_gate.py声称17141字符实测1225字节纯注释事故根治) 2026-09-16 14:24:31 +08:00
ymq
38efb3eb17 feat(deliver): git收口引擎化——deliver时引擎代为add+commit本任务写入的apps/modules仓库,收口核验记录回填交付件(2026-09-16 pbls M1a编造git证据事故根治)
事故:M1a develop在交付摘要声称'git status --porcelain为空已push',QC实测modules/pbl_blueprint约60项未提交→证据链不可信→连退3次达上限→fault→项目paused。deliver入口此前只有占位文档/配图/类型三门禁,无git收口核验,靠QC事后抽查→退回后agent照样编造→死循环(LLM编造工具结果高发形态)。

修法(机制化,不靠LLM自觉):_enforce_git_closure在deliverable files落盘后对本任务写入过的apps/{x},modules/{x}仓库根引擎代为add+commit(无远程只commit,非git自动init);projects/过程仓库跳过(多角色并发git锁)。收口核验记录(含'agent未提交,引擎代为收口N项')回填交付件正文——给QC/PM真实仪表盘,agent的git口头声明从此可对照引擎事实。收口失败不阻断deliver(环境原因卡死任务更糟),回填警告让QC按事实核验。
2026-09-16 12:37:26 +08:00
ymq
f99b554e9e fix(orchestration): 审核基础设施故障不再让develop从头重做+failed不算依赖dead+dependency_blocked待办自动收口(2026-09-16 pbls双事故根治)
事故A(M1a QC超时→develop全量重做): qc/pm_review_run的LLM调用异常走mark_failed→failed_poller retry_task回submitted→develop把已交付完好的工作从头重做(10:42实测,交付件20分钟前刚提交)。审核方基础设施故障≠开发方交付失败,新增_requeue_after_review_infra_failure:回置qc_review/review重新认领(对齐无决策路径已有模式),retry达上限才mark_failed→fault冒泡,有限循环有出口。

事故B(dependency_blocked误报+永不关闭): DEP_DEAD含failed→上游任务瞬时failed(QC超时/重启打断)时给下游误发'永不可达'人工待办(10:11/10:42两起实锤,M1a failed后3秒给M1b发待办,9秒后failed_poller就重试成功)。failed是过渡态(failed_poller 60s内必接管:瞬时→retry,耗尽→fault→waiting+pause+fault_report通知人工),归wait语义;真dead只剩cancelled。配对新增_resolve_stale_dependency_blocks挂agent_poller:阻塞原因消失的pending待办自动done收口(result_data留痕),冒泡有去重+收口有配对,出口才完整。

verify_dep_gate.py同步:新增D5 failed/waiting→wait用例,20/20全绿
2026-09-16 12:17:22 +08:00
ymq
02c54264c8 fix(qc): QC取证预算4→16轮+删默认通过静默放行+占位文档硬门禁(2026-09-15 pbls停摆根治)
三处机制缺陷,pbls项目停摆的完整根因链:

① QC循环预算与评分协议结构性矛盾(qc_review_run): 原range(4)+turn>=2禁工具,
QC实际只有1~2次取证机会,而协议要求逐项read_file核验未读取一律判不过——
物理上不可能完成核验→必然reject。pbls M1a四轮qc_reject原文全是
'未能完成逐个read_file核验',develop做得再真也被退到上限→项目pause。
修: 预算16轮,强制决策点第12轮,收尾阶段硬拒探索类工具(对齐PM循环模式)。

② '无明确决策→默认通过'是静默放行制造机: design连挂3次上游Timeout后交付
26个~100B自引用占位文档,QC输出不可解析垃圾命中else分支被默认通过,
8秒过门禁→PM按文件存在性approve→36表DDL设计正文不存在,16个模块任务
在空地基上开发。修: 不可解析输出纠错重试;轮次耗尽上限内回置qc_review
重新认领(刻意不走retry_task——QC任务只被qc poller按state认领,回submitted
会搁浅),达上限mark_failed→failed_poller冒泡人工。绝不静默approve。

③ 新增_validate_stub_docs占位文档硬门禁: deliver入口(native+文本兜底两路径)
确定性拦截空文件/单行自引用指针文档,回填可行动FAIL(补真正文或ask_question
冒泡)。'占位不算交付'从口号变成代码门禁(对齐diagram_gate/deliverable_type模式)。
2026-09-16 08:34:18 +08:00
ymq
66387c4210 fix(agent): 文本兜底解析裸多行JSON tool_call——LLM输出无围栏连续动作对象时误当交付件正文deliver
pbls M1a第四轮实测:角色LLM在长上下文里输出连续多行裸{"action":"tool_call",...}(无```围栏),整体json.loads失败+围栏扫描无命中→兜底把tool_call文本当result deliver→交付件content是JSON文本、files_json只剩快照,QC必退且退回理由失真(实际代码/git提交都真实落地了)。修:_parse_agent_action加raw_decode逐段扫描取第一个动作对象。本地单测6/6(多对象/单deliver/纯文本/围栏优先/坏前缀跳过/DSML不回归)
2026-09-15 17:56:41 +08:00
ymq
b4bfa9ec54 fix(todos): 删除/暂停项目不再产生待办+孤儿待办根因修复(2026-09-15用户指令)——四个poller(submitted/review/qc_review/failed)排除已删项目悬空任务(旧代码只排paused,孤儿failed任务每轮raise fault_report灌给owner.superuser,实测38条堆积);handle_failed_task项目行不存在时跳过(旧'if _p and'守卫在项目已删时整体失效);raise_problem对已删项目拒发(全局tenant_id放行,paused不拦防吞故障通知);create_human_task项目状态门禁(paused/archived/cancelled/completed不发新待办,恢复后对账器补发) 2026-09-15 16:45:46 +08:00
ymq
e774cb238b fix(agent): G2缺口指纹超长静默丢失+fallback交付件跨仓库污染+setup_repos空目录崩溃
- _check_orchestration_gaps: G1环/G2指纹改短哈希(_short_fingerprint)——原实现拼接全部未依赖任务ID(15任务≈400字符)超pipeline_pm_notices.fingerprint VARCHAR(255)→INSERT DataError(1406)被catch记debug→PM告警静默丢失,脚手架先批deploy_test提前启动(pbls 09-15实测)
- _build_fallback_deliverable: git扫描只报本任务write_file写入过的仓库——原实现扫全工作空间apps/modules所有git仓库,16天前元景遗留的apps/scense脏工作区被算进M1a交付件→QC误判越权改动构成退回理由(pbls实测)
- _setup_repos: project_dir空串守卫——os.makedirs('')抛Errno 2且中断clone,日志高频刷屏
2026-09-15 16:43:23 +08:00
ymq
5fe5c238ec feat(flow): 批2多流程模板机制+三机制修复——pipeline_flow_plans加base_flow_key列;flow_plan_capability:detect_flow_template(LLM判流,置信度+判据,失败不静默降级发人工)/propose_flow_plan支持flow_key+确认待办渲染判流结论/get_plan_flow_key供流转分支/_latest_plan_rec复用;agent_loop:_skip_trimmed_roles按base_flow_key解析阶段+human_task_qc检查对象不存在改cancel+fault冒泡(不再qc_reject计轮死循环,首医实测)+PM approve答结并入qc_reject(幻影角标,pbls实测);project_capability:pause_project不再删pending待办(暂停=可逆停摆,删待办致resume后QC死循环) 2026-09-15 15:01:27 +08:00
ymq
af69708dd0 feat(agent): 文档配图形态硬门禁——需求/设计文档及一切交付文档中的图必须invoke_model t2i/i2i生成真图(2026-09-15用户要求);新增diagram_gate确定性检测器(mermaid/plantuml围栏+箱线字符画++---+文本边框,豁免目录树条目/纯分隔线/markdown表格/代码块);deliver双路径(native+文本兜底)拦截伪图回填FAIL可行动改法;逃逸阀=文中如实标注「配图缺失:平台无可用文生图模型」;v1角色system prompt同步硬规定 2026-09-15 14:53:17 +08:00
ymq
88a361a50e fix(agent): 交付件类型守卫+本体文件清单——deliverable_type照抄示例值零校验(pbls需求交付被标design_doc),RoleSpec.deliverable_types声明合法清单,deliver拦截校验(native+文本双路径)非法拒绝回填清单,唯一合法类型缺省自动填充;交付件快照文件名清洗(getID '-'开头难用);新增files_json本体文件清单列(write_file实写+deliver files),PM/QC审核输入随附清单+强制read_file本体核对(只看6000字摘要索引误判产出规模) 2026-09-15 00:11:56 +08:00
ymq
7f3ce26295 fix(agent): 任务族工具被capability路由劫持FAIL + LLM超时误判永久错误致任务链暂停
pbls 项目事故(2026-09-14)四条根因一次修复:
- v2 _execute_tool 1.5步加 TOOL_SCHEMAS 双守卫(对齐 v1 _exec_agent_tool):
  task 技能 frontmatter 声明的任务状态机工具(reset_task_retry/claim_task/
  approve_task等)不在概念工具 schema 表,此前被劫持返回 FAIL:未注册的能力工具,
  能力包真实 handler(第2步)永远到不了——主 agent 无法恢复失败任务
- llm_bridge 如实区分超时/连接失败: TimeoutError(str为空)不再误报
  「端点不可达:。」(冒号后空白),超时文案明确瞬时故障可重试
- _classify_failure 补中文提示词(超时/不可达/瞬时等): 中文报错不再
  误判永久错误跳过重试直接 pause_project+fault_report
- role_agent_run 客户端单次调用超时缺省330→570(_LLM_CLIENT_TIMEOUT),
  与外层600硬超时衔接;实测368s长生成不再被提前掐断
- fault_report 文案区分「重试耗尽」与「判定永久错误(未触发自动重试)」,
  消除 retry_count=0 却报「重复0次已达上限(3)」的自相矛盾
2026-09-14 20:20:12 +08:00
ymq
1febcd3acb feat(sdlc): PM编排与主agent场景说明对齐新职责划分——模块划分requirement初划(八原则四张图)+design定稿,所有角色交付件必附复杂度评估,PM审核/派发必读评估段据此编排,缺失按退回意见要求补充 2026-09-14 17:11:29 +08:00
ymq
5c063ca588 feat(bridge): session_id会话粘性透传(2026-09-11用户定夺:同会话固定账号省上游缓存钱,跨会话轮询)——llm_bridge四函数(llm_call/llm_call_msgs/llm_call_msgs_native/llm_infer)加session_id参数经payload._session_id透传(不进token缓存键);agent_loop_v2七处调用点接self.session_id(主循环native+降级重试+文本回退/技能选择/项目匹配/历史摘要/invoke_model);agent_loop v1四处任务循环用task:{task_id}做粘性键(任务内30轮同前缀);platform_model_tools.tool_invoke_model透传 2026-09-11 15:30:30 +08:00
ymq
1faa1c1d2f fix(agent): 工具结果回填上限——result_cap.py(12000字符默认+params可调+显式截断告知+缩小范围指引);v2两处/v1一处回填点全接;根治商机产线实测:8次数据工具全文回填~78K token超context_limit→压缩摘要自身超时3连败→会话零产出(对照实验:同模型小上下文3.4s正常) 2026-09-11 13:46:28 +08:00
ymq
2c35abfdab feat(service): 产线流程裁剪机制层——pipeline_flow_plans表+flow_plan_capability(propose六项硬校验/confirm-reject CAS/plan_stage_enabled/create_sub_tasks PM拆解)+shared_ability聚合会话三工具(show_flow_template/propose_flow_plan/get_flow_plan);agent_loop _get_next_role跳段泛化(_skip_trimmed_roles线性链自动跳过被裁角色)+_pm_create_tasks extra_params(继承skip_generic_qc);capability_tools注册create_sub_tasks schema;init导出env.flow_plan_* 2026-09-11 12:58:26 +08:00
ymq
655d50bde8 feat(skill): 技能提议实时生效——写机构技能目录orgs/{org_id}/按scope覆盖global,机构间隔离
用户需求变更(2026-09-08):propose_skill从人工审核链(pending→published)改为实时生效,
但只写提议者所属机构的skills目录,靠org scope(优先级3)同名覆盖global(0),不影响其他机构。

- 新增 skill_live.py: publish_skill_live 路由决策+路径穿越清洗+frontmatter scope剥离+原子写
  * 客户机构(org≠0)→orgs/{org_id}/{name}/实时生效
  * org 0陷阱:get_merged里orgs/0/是全机构共享缺省——org0+有user_id降级users/{uid}/(仅本人);
    org0无人值守(复盘poller)拒绝实时写,保持pending人工审核链(防agent自动影响全平台)
- v2 _t_propose_skill / v1 retrospective.propose_skill 接入:落库照写(成功=published+路径审计)
- v1 poller长进程配套:_reload_skills_throttled(30s TTL)接入_build_role_skills_block/_load_skill_by_name
  (v2每条消息executor init已reload,无需改)
- 工具描述三处同步:core GENERAL_TOOLS/capability_tools TOOL_SCHEMAS/RETRO prompt
2026-09-08 23:59:24 +08:00
ymq
84bef76401 feat(agent): 统一文件读取+联网检索+只读库查询+generic strict沙箱(对齐Hermes信息摄入能力)
- 新增 file_read.py: v1/v2 共用统一读取(分页续读+docx/pdf解析+显式截断告知)
  根治立项书76088字符只读到30000(v2)/12000硬截无提示(v1)的真实翻车
- 新增 web_tools.py: web_search(Bing RSS优先+HTML兜底)/fetch_url(超长落盘webcache+read_file续读)
  SSRF三层防护(公网域名/DNS私址拒绝/重定向逐跳)+不可信数据标注;
  修复 aiohttp content.read(n) 对 chunked 响应提前返回半截的坑(改 resp.read())
- 新增 db_query.py: query_project_data 只读白名单查询(强制project_id参数化+where/order_by注入校验+审计)
- agent_loop.py(v1角色agent): read_file 12000硬截→共享file_read分页; AGENT_TOOLS 加三工具(补required防全参必填);
  _run_shell 加 strict 档(通用会话:不挂平台目录+可写根收窄到用户专属目录); PM/QC/RETRO prompt 工具清单同步
- agent_loop_v2.py(v2会话agent): _t_read_file 改走共享模块; 新增三工具 handler; generic run_command 强制strict+无bwrap拒绝
2026-09-08 23:13:06 +08:00
ymq
ba65d586b1 feat(agent): 完备性硬门禁(2026-09-08用户定夺一C+二A)
意图识别归主循环LLM(system prompt语义引导),完备性硬门禁归代码。
- invoke_model入口check_completeness按能力契约校验必备输入:
  t2i/t2v/tts要描述,i2v/i2i要输入图,asr要音频,r2v要参考媒体
- 缺失返回QUESTION前缀,不调上游零费用(在llm_infer之前)
- v1角色agent+v2会话agent四处工具循环QUESTION硬拦截转
  ask_user/ask_question,禁回填靠LLM自觉(deepseek类会空参硬试烧钱)
- 22例单测全PASS(齐备/缺失/字符串vs数组形态/未登记能力不误伤)
2026-09-08 11:58:39 +08:00
ymq
bf6cb5b24a feat(agent): 平台模型调用能力——invoke_model/list_platform_models工具(v1角色agent+v2会话agent,唯一实现platform_model_tools);llm_bridge.llm_infer通用推理透传全能力payload+超时参数化;角色prompt加配图节(禁字符画,生成真图嵌正文)(2026-09-07用户需求) 2026-09-07 17:31:29 +08:00
ymq
f3f82dd448 refactor(llm): agent调用收敛到模型治理统一推理API——llm_bridge改HTTP自调用薄客户端(短期token+本进程端口),删旧llm表直查;llm_proxy委托chat_inference;gateway/agent_loop/bug_flow模型解析与缺省模型改走治理链/统一解析,清除写死模型名 2026-09-04 17:05:42 +08:00
ymq
21c8c16daa feat(rag-access): 产线接入知识库——全角色按项目owner权限检索(rag_search/rag_kb_list)+PM建议入库待办闭环+统一API模式 2026-09-04 15:57:41 +08:00
ymq
83ce9c820c feat: list_tasks图标补qc_rejected/cancelled 2026-09-03 17:31:37 +08:00
ymq
63d9e00a1e fix: 豁免分支先COMMIT认领再迁移——_claim_task的UPDATE未提交,另一连接更新同一行锁等待超时1205(实测豁免路径50秒卡死) 2026-09-03 12:44:22 +08:00
ymq
ae78742479 feat: 通用QC/PM门禁声明式豁免——params.skip_generic_qc任务交付直接approved(qc_review_run/pm_review_run兜底放行存量卡住任务) 2026-09-03 12:28:12 +08:00
ymq
77477c6caf fix: 项目输出文件必须落项目空间——项目名缺失时project_dir用project_id兜底,不再落到产线空间根/复盘报告落projects/根 2026-09-02 11:46:07 +08:00
ymq
ae213b2f91 fix(零消耗): paused项目两个tokens漏点
- failed_poller→handle_failed_task: paused项目跳过LLM决策(原每轮白烧)
- bug_poller→pm_bug_confirm_run: JOIN sd_projects排除paused(原只看迭代状态)
三主poller(role/pm/qc)已排除paused;retrospective由pm_poller触发无漏点
2026-09-02 11:07:39 +08:00
ymq
14cbf208b7 feat(todo-form): 冒泡待办支持form_schema动态表单——ask_question可声明上传/填写字段,人类在待办里直接完成 2026-09-01 12:38:54 +08:00
ymq
947398c9ef fix(upload): get_project_dir_by_id+copy_uploads_to_project;agent工作目录对空workspace_dir项目兜底解析(与落盘同一函数) 2026-08-31 17:54:29 +08:00
ymq
38d9897a78 fix(skills): load_skill走resolve_skill容错匹配+未命中提示裸名规范(根治'技能[产线]bid-workflow不存在') 2026-08-31 16:24:05 +08:00
ymq
65db2dddc3 review修复:复盘认领校验补claimed_by比对、LLM硬超时兜底、报告落盘以write_file完整版为准 2026-08-31 16:15:00 +08:00
ymq
0547c37302 QC契合度门禁+复盘机制:删需求/设计人工确认、PM三阶段禁内容否决(代码兜底修正)、复盘任务+执行器+技能提议工具、QC工具链补ctx 2026-08-31 16:02:03 +08:00
ymq
519b4bfcf4 fix(parse): DSML双竖线变体+叙述内嵌json代码块解析——实测两种新失败形态,兼容竖线数量任意变化 2026-08-29 16:51:48 +08:00
ymq
e3917e681c feat(work_env): 远程模式自动初始化——技能同步+依赖软件自动安装;agent_loop deploy别名归测试环境 2026-08-28 21:10:36 +08:00
ymq
8fafe18d91 fix(parse): _parse_agent_action 支持 deepseek v4 DSML 原生工具调用格式——长上下文多轮时不解析会5轮耗尽 2026-08-28 18:17:46 +08:00
ymq
c9d914b9ff security(agent): _run_shell 接入 bwrap 沙箱——命令隔离落地
- agent 的 run_shell/run_command 从裸 create_subprocess_shell 改为 bwrap 沙箱
- user/pid/ipc/uts namespace 隔离,网络保留(git push/ssh 部署依赖)
- 系统目录+/d/pipeline+/d/doit 只读(平台代码/配置/其他机构工作区不可写)
- 当前机构工作空间目录可写(跨机构写隔离);/tmp 会话私有
- DNS 兼容 systemd-resolved(/etc/resolv.conf 软链→/run 只读挂载)
- 无 bwrap 降级为原目录隔离并标 sandbox: false(不阻断现有功能)
2026-08-28 14:26:32 +08:00
ymq
d9827c391b fix(orchestration): 元景三问题根治——task_title归位+问题通道统一冒泡+依赖启动策略+确认去重
问题1(部署早于开发启动):
- _check_orchestration_gaps 重构为结构化缺口(kind/fingerprint/task_id/fix_ids)
- 缺口不再只打日志:派发后当场回给PM + 持久化pipeline_pm_notices注入PM下回合上下文
- 新增 update_task_deps 原语:PM核实缺口后补依赖(修正是LLM决策,代码只查漏)

问题2(env补齐后waiting不唤醒):
- _bubble_deploy_env_missing 从自建人工任务死胡同迁移到统一问题通道(raise_problem)
- owner在待办回答→resolve_problem自动唤醒任务→QA注入agent prompt,信息真正交给LLM

问题3(task_title错位+重复确认):
- SDL_ROLES task_title 各归其位(需求分析/架构设计/脚手架开发/部署测试/功能测试)
- 确认去重:同迭代已确认且非回退重做→跳过重复确认直接派发
- _create_next_task 单例阶段幂等:requirement/design复用同迭代任意活跃任务

机制增强:
- 依赖启动策略 params.dep_policy: all(默认)/any/at_least{n},纯函数_eval_deps_policy
- init.py poller 手写依赖求值收敛到同一纯函数(消除两处语义漂移)
2026-08-27 22:52:27 +08:00
ymq
ccba6f470e fix(orchestration): 环境信息只卡部署,不卡需求/设计/开发
用户 2026-08-26 定调纠正了我原方案的错误。我原本提议把「env/*.json 无占位符」做成
requirement 阶段的结束条件(把缺陷堵在最便宜的阶段)——这是错的,会把死循环制度化:

主机/SSH账号/密码/部署路径是**外部输入**,requirement agent 根本产不出来。若要求它
填全才能通过,agent 就卡在无法解决的事情上无限重试。正是 2026-08-25 hrs7 的死循环成因:
deploy_test 因 env 占位符失败 → PM 判「根因在 requirement」→ 回退整链并作废 owner 已
人工确认的三模块设计 → 重做需求后 env 依然是占位符 → 再次失败。

实际上 hrs7 的 requirement agent 做得对:填了能确定的(port 9187/dbname hrs7),未知项
标「待明确」并列入 pending 清单 —— 这是正确履职,被回退是冤枉的。

实现:
1. _check_deploy_env_ready 只对 agent.deploy_test/deploy_prod 生效,其余角色一律放行。
   检查 ssh.host/user、deploy.path、db.host/user/dbname + ssh 凭据(password 或 key_file
   二者其一) + requirement 自列的 pending 清单;domain/status 等非必需项不阻断。
2. 认领路径加此进入条件:不齐备 → 不进 running,任务置 waiting(界面可见,不在 submitted
   静默打转) + 冒泡 deploy_env_required 人工任务给 owner,写清缺哪些字段、文件在哪,
   并说明「补齐后自动继续,无需重跑上游阶段」。按 task_id 去重。
3. PM prompt 加硬约束:外部输入缺失禁止回退上游。回退前先自问「这个缺陷是上游 agent
   能做对却做错了,还是本来就产不出?」——前者才回退,后者一律冒泡等人补。

验证:11 例离线用例全过(用 hrs7 线上真实 test.json 结构),覆盖
requirement/design/develop/test 四阶段占位符必须放行、部署阶段必须阻塞并列缺失字段、
补齐后放行、密钥文件替代密码、空密码无密钥阻塞、domain 缺失不阻断。
2026-08-26 12:09:23 +08:00
ymq
31eab89234 fix(orchestration): 多依赖门控 4 处放行漏洞 + description 继承 + 幂等 + 完备性查漏
【1. description 不再继承 + 用 PM 的 next_task_description】
_create_next_task 原实现 new_params={**params} 把上游 description 整个继承,导致
design 派生的「应用脚手架 develop」拿到需求任务的描述(产出需求规格说明书),于是它交付
文档、4 分钟 approved —— 一行代码没写却走完 develop,打破「应用级 develop approved =
编码完成」这个 deploy_test 门控前提,造成 deploy_test 在编码未完成时提前启动。
同时 PM 在 review_approve 里给出的 next_task_title/next_task_description 一直被丢弃
(1935 行采集、2239 行调用时没传) —— 现已接上,流转决策权归 LLM,代码只做兜底。

【2. 多依赖门控 4 处漏洞(用户重点要求)】
D1 _task_deps_satisfied 查「不在终态的依赖」,依赖ID不存在时查出0行 → 误判满足而放行
D2 PM 派发时未知依赖引用只警告、静默丢弃 → 任务以更少依赖落库 → 并行开跑
D3 len>=20 就当有效任务ID收下、不校验存在性,配合 D1 让门控完全失效
D4 依赖处于 cancelled/failed 时依赖方永久 submitted,死锁且无人知晓
修法:逐个比对依赖存在性与状态;missing/dead/self 一律阻塞并冒泡;PM 派发时依赖
无法解析的任务置 waiting 而非静默降级为并行。init.py 的 poller 同步同语义(两处实现
必须一致,否则一处拦住另一处放行)。

【3. 幂等】并发多任务同时 approved 会各自创建下一阶段任务 → 同迭代重复任务(历史上出现
过「同一迭代两个 design 任务」)。按 (迭代, 角色, 系统派生) 先查后建。

【4. 逃逸阀通则】依赖永不可达时冒泡 dependency_blocked 人工任务(按 task_id 去重),
消除静默死锁。对照:failed_poller 自动 pause 项目却无人通知,hrs7 因此卡近 1 小时。

【5. 完备性查漏 _check_orchestration_gaps】代码只查漏、不替 PM 决策:
G1 依赖自引用/成环(DFS 回边) → 必然死锁
G2 应用级 develop 未依赖未完成的模块级 develop → 正是本次故障成因
G3 设计清单 generated_modules 有模块无对应 develop 任务 → PM 漏派

逻辑验证:/tmp 两组离线用例共 30 例全过,并以可执行方式证实原实现 4 处放行漏洞。
2026-08-26 11:49:24 +08:00
ymq
8862d72a60 fix(sdlc): 根治任务名继承 bug(design 任务名不再跟需求名一样)
根因:_create_next_task 用 new_title=f'{title}({next_role}阶段)' 直接继承上一任务
title + 追加角色后缀。导致 design 任务名变成「需求规格说明书(agent.design阶段)」
跟需求名混同;回退重做后更叠加成「...(回退重做)(agent.develop阶段)
(agent.deploy_test阶段)」越叠越长。

修:title 改按 next_role 的声明式 task_title 生成语义标题(项目名 + 阶段语义),
阶段模板由 RoleSpec.task_title 声明(design=应用架构与模块设计 / develop=应用脚手架开发 /
deploy_test=部署测试 / test=功能测试),代码不硬编码。
2026-08-25 17:01:19 +08:00
ymq
b409f18929 feat(sdlc): requirement/design 审核通过后加 owner 人工确认门禁
- pm_review_run: requirement/design approved 后不再直接派发下一角色任务,而是发确认任务给 owner
- human_task_capability: 新增 confirm_stage_gate(确认通过→继续派发下一角色; 不确定→退回原角色重做)
- create_human_task 加 task_id 参数绑定原引擎任务
- has_blocking_human_task 纳入确认任务 pending 阻塞
- init.py 注册 confirm_stage_gate
2026-08-25 13:19:46 +08:00
ymq
50b3b37f26 fix(workspace): get_space_dir 改用 build_space_path 构造(org_id+pipeline_id),修复 workspace_dir 迁移到 projects/ 后 dirname 失效导致 projects/projects 路径重复 2026-08-24 18:00:24 +08:00
ymq
2659284e05 chore(prompt): AGENT/QC prompt 及工具描述里 repos/ 旧表述改 projects/apps/modules 新路径 2026-08-24 17:42:47 +08:00
ymq
20852b2254 feat(workspace): 项目目录名改用 directory_name 英文 slug(兜底 name 显示名),支持中文显示名+英文目录名分离 2026-08-24 17:40:42 +08:00