402 Commits

Author SHA1 Message Date
ymq
6c2a67ecb4 feat(secret_vault): update_secret_meta(改标签/备注,仅本人+审计;值不可改走删除重存)——管理页行内编辑用 2026-09-18 14:36:28 +08:00
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
82257290ee fix(human_task): 待办归属动态解析+expired_at地雷修复(2026-09-18银联事故实锤)——①新增resolve_project_owner_assignee:项目真人创建者进其我的待办,无主回退owner.superuser;flow_plan确认/修订/重做失败4处调用点改动态;②create_human_task显式写expired_at=+7d(列默认current_timestamp()→创建即过期,实测全部历史待办expired_at==created_at) 2026-09-18 13:23:29 +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
c8b44fe423 feat(flow_plan): 流程修订/定向重做机制(2026-09-17用户裁定:用户有权调整流程,并要求从流程任何一步按意见重做,或只给意见由agent判注入点)——revise_flow_plan:已confirmed计划提修订版(v+1 pending_confirm,确认前旧计划持续生效,确认时CAS换版旧版superseded+回调产线stage_reentry钩子);detect_reentry_stage:LLM按意见+阶段声明+产线进度摘要判注入点(对齐detect_flow_template判流先例,evidence进确认待办用户核对,错判确认门兜住,判不出诚实报错禁默认);_affected_stage_keys:注入阶段+deps依赖闭包下游;钩子失败不回滚确认,诚实上报+抛人工待办;新会话工具revise_flow_plan/detect_reentry_stage进FLOW_PLAN_TOOLS(三产线零改动继承);propose已确认时错误指引改指revise;models加reentry_stage/reentry_detect_note列 2026-09-18 00:05:42 +08:00
ymq
12f8384d49 fix(import_closure): 破M1b无限退回死循环——globals()运行时注入逃逸阀+责任范围过滤(2026-09-17 pbls实锤)
根因1(逃逸阀缺口): agent用工具脚本生成db.py compat块(globals()[_name]=_val逐符号注入)修import闭包断裂,
运行时实测全通(pbl_blueprint.db/api/blueprint_crud/subobjects/templates import OK,PblError/require_tenant/
get_env全True),但ast静态量不出Subscript下标赋值→门禁恒报20处断裂→QC按'声称修复vs引擎实测断裂直接矛盾'
判造假证据→4轮退回达上限→fault→项目paused。与PEP562 __getattr__同类:静态不可判定即保守放行。
识别三形态: globals()[k]=v(含For/Try嵌套walk_top可达) / globals().update({...}) / _g=globals()别名。
函数体内globals()不算模块级注入(walk_top只走模块级stmts,不误放行)。

根因2(责任范围过宽): 依赖方向拉进来的外部文件(pbl_agent_runtime/api.py因import pbl_blueprint入范围)的
断裂源在pbl_common(半迁移存量欠账114处,别的任务的账)——违背门禁自己声明的'任务未触碰的包存量断裂不拦,
防死锁'原则,M1b实测26处里6处是pbl_common欠账,小任务永远修不完全空间账。
修: problems过滤 source.split('.')[0] in owned_pkgs(只拦涉及仓库自有包的契约断裂)。
原pbl_common事故形状防护不受影响: 重写pbl_common的任务owned_pkgs含pbl_common,断裂全保留。

修后M1b剩余真实断裂仅1处: m1b_common.py:114 from .errors import PblError而errors.py只有
PblBlueprintError——门禁拦它是对的(补一行别名即闭环),FAIL消息可行动。
本地走查6例通过(注入3形态识别/普通模块不误伤/函数内globals不误放行/真实compat块形状)。
2026-09-17 22:13:51 +08:00
ymq
2607176cb7 fix(secret_vault): prepare_command补齐env引用形态注入(2026-09-17 e2e实锤缺口)——SECRET_PROMPT_BLOCK承诺'命令写$PIPELINE_SEC_X执行瞬间注入真值'但实现只认@@sec:占位符,agent照prompt写env引用时hits空→env不注入→变量展开为空(实测stdout SEC_READY_空值);现两形态等价:存在名进hits注入,不存在名进unknown拒绝执行(同陷阱C绝不静默空值) 2026-09-17 18:04:12 +08:00
ymq
761052a298 feat(pii_guard): PII打码守卫(2026-09-17用户定案合规)——手机/身份证MOD11-2/银行卡Luhn/邮箱确定性侦测→AES密文入Redis db4(24h ephemeral,不进机构密码表)→@@pii:占位符;gateway 0.6门禁+reply/progress用户侧还原+tool事件不还原;v2 run_command env注入$PIPELINE_PII_*+_save_turn落库掩码;人名NER留二期 2026-09-17 17:47:48 +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
bb6bdf40fa feat(models): pipeline_user_secrets 表模型定义(2026-09-17) 2026-09-17 13:50:35 +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
2e8d2abec7 fix(import-closure): 核验范围从包归属改为仓库归属——modules/pbls只有app/scripts没有包目录,入口modules/pbls/app/pbls.py的import断裂(from world.api实测断)是真实事故面,只按包算会漏;跨仓库方向按写入文件所属仓库拥有的包算(pbl_common事故形状不变)。单测+3例=14全绿(含无包仓库入口纳入/断裂抓到/存在不误报) 2026-09-17 11:42:10 +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
c533932ac6 docs(readme): LLM超时预算统一治理段(2026-09-16用户裁定单点收敛)——bridge._resolve_budget+inference deadline两处单点,三层预算对齐铁律,忘传timeout结构性安全 2026-09-16 18:30:01 +08:00
ymq
f7a3fd364a fix(task): reset_task_retry假成功空转——解链三步曲(resolve_problem resume_task=True先把waiting→submitted,再reset_task_retry)下旧CAS只认waiting/failed→UPDATE 0行,成功判定却只看终态==submitted→空转报True:retry_count未清零+陈旧last_error残留,任务带满计数重新认领一次退回即再触顶fault(2026-09-16 pbls M1b实测17:22 fault解链后18:08 retry_count又=3实锤)。修:state IN加submitted(running仍排除防打断在跑协程)+成功判定改state与retry_count双核对+入参态前置校验 2026-09-16 18:21:19 +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
9e9886a6f1 revert(substance_gate): 回退输出端正则门禁(2026-09-16用户纠偏'到处加检查标准方法不对')——打地鼠式正则(【待填】→【待人工确认】→【定稿环节以…】永远漏)违反语义判断铁律(LLM裁决非词匹配)+堆门禁不治根因。根因=写者输入端缺'真标书长什么样'约束,修复转技能层(禁元内容/禁自造占位/逐标的实质响应)+reviewer/scorer的LLM实质性判断第一判据。docx表格转换修复保留(独立真bug) 2026-09-16 16:58:06 +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
c0cab536df feat(substance_gate): 标书实质性响应确定性门禁(2026-09-16用户报障根治'检核得满分但质量太低')——新建substance_gate检测'编写指南体/表单大面积待填'(非投标文件正文本身):元内容标题(编制说明/编制依据/填写口径/自查表/人工填写清单/应答口径)+元内容句(按X格式编制/完整覆盖评分子项/见第X节清单)+非规范待填占位(【待填-xxx】,区别于合法【材料待补:】)。分层判定(走查校正:阈值4曾误伤2.2.1/2.2.2有实质内容仅带前言章,改为高精度组合:待填>=2或综合分>=15或元标题>=3且待填>=1)。真实34章实测:精准判3章指南体(1.1投标函17处待填/2.1商务/2.1.4业绩表31处待填),2.2.1(320行真实响应表)/2.2.2(真实实施方案)正确放行。对齐diagram_gate确定性门禁哲学:质量闸门不靠LLM自觉 2026-09-16 16:07:23 +08:00
ymq
a3a1c88859 docs(readme): deliver代码真实性三重门禁段(2026-09-16 pbls M1a空壳事故)——git收口引擎化/代码空壳硬门禁_validate_stub_code/产出文件机械核验段,通用规则:门禁证据必须引擎机械计算不靠agent自述,QC取证失败≠判0分 2026-09-16 15:23:11 +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
3d4e5bb4cb fix(db_query): where字面量%转义——LIKE '%关键词%'的%被aiomysql参数替换当格式占位符致TypeError not enough arguments(2026-09-16甘肃项目agent实测:查节能资质直接崩);顺带白名单补bid_material_gaps表(材料缺口清单可查) 2026-09-16 13:38:57 +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
ecc113f9b3 fix(human_task): 人类待办答复即权威,不再送agent QC(2026-09-15用户裁定)——原complete→human_task_qc→LLM审查人类答复→不合规退回pending→用户再说忽略又被退的死循环(甘肃项目45EbV3Nw实测堆3个QC任务);人工override权威守卫须跳过铁律,complete直接done+qc_status=passed 2026-09-15 21:51:22 +08:00
ymq
b0342db38e fix(db_query): 1054未知列错误回带表真实列清单——LLM把params JSON键(stage/task_kind)当列传是高频误用,报错带列名让下一轮自恢复,不白烧轮次(2026-09-15甘肃项目实测抓到) 2026-09-15 18:07:34 +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
715be0b387 feat(agent): 工具结果UI显示层取消500字硬截——params可配上限(默认50000≈完整显示)+超限显式告知(2026-09-15用户指令:显示完整信息)。显示层与回填层(12000防爆门禁)分离,resolve_max_chars提取共享_resolve_param_int,新增cap_display_result/resolve_display_max_chars(params键tool_result_display_max_chars) 2026-09-15 17:32:39 +08:00
ymq
6dac18e1b1 fix(comms): raise_problem同任务同类型pending问题去重——重复冒泡更新既有行(正文/context刷新+任务照挂起)返回原qid,不再每轮新建(实测同task_id qc_reject/review_reject/fault_report堆2-3条pending,角标虚高重复轰炸owner.superuser,2026-09-15用户指令:避免重复) 2026-09-15 16:52:43 +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
d204ff4a9f docs(readme): 补diagram_gate模块说明——文档配图形态硬门禁(t2i/i2i真图,deterministic伪图检测,deliver双路径+bidding复用) 2026-09-15 15:00:28 +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
313f32dd7b fix(llm_bridge): native调用透传_timeout端点预算——pbls design三连超时根因:llm_call_msgs_native只把timeout用作客户端等待,payload无_timeout→端点按供应商端点配置(百炼120s)掐上游,design收尾大请求(17tools/60~125KB)天然72~115s,一半概率120s被杀→内部3重试全灭→任务failed暂停项目;native补_timeout=客户端-60s余量(端点先掐返结构化错误可分类重试),llm_call_msgs客户端等待改timeout+60对齐llm_infer模式 2026-09-15 09:03:13 +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
c32ceaa920 fix(rag_client): params读写列不一致致重复行——_load_cached_key按id查但写入id=getID()随机值,缓存永远miss→每次发key新增一行(实测user-01堆12行);ON DUPLICATE KEY UPDATE因params_name无唯一索引永不触发。修:读改按params_name+读-改-写幂等(存在则更新首行删多余行) 2026-09-12 08:04:17 +08:00
ymq
78c89a0cce feat(rag_client): 新增 rag_embed_texts 批量向量化通道——调 rag /api/embed.dspy,按10条分块,任一块失败整体失败带块号(挖掘批次状态机需可行动报错,禁部分成功静默丢数据) 2026-09-11 22:12:58 +08:00
ymq
1b1f8dfa52 feat(service): SDLC menus删旧「📁 项目」项——入口上移core agent_menus.dspy硬编码(新建/切换弹窗,所有产线通用),防重复出现两个项目按钮 2026-09-11 18:29:30 +08:00
ymq
0964dd2864 fix(agent): 跨上游超时窗调参——主调用单次超时330s→180s(实测最长响应<60s留3倍余量,失败快速返回);会话级重试2→3次+退避15s(3×180+2×15≈9.5分钟跨度可跨分钟级超时窗);llm_call_msgs_native补timeout参数透传_http_chat;回退文本路径同接180s 2026-09-11 16:39:50 +08:00
ymq
458736d71e fix(agent): 续跑门禁——已有工作推进(tool_call_count>0)时纯文本短回复(<400字)视为中途意图句而非最终答案,注入续跑指令继续循环(上限2次防死循环);根治商机产线实测连续4会话在7~11次工具调用后模型输出意图句提前结束turn→循环误判终止→报告/总结从未产出 2026-09-11 16:18:58 +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
58853de72d fix(bridge): project_id透传补全——proxy_chat_completion委托chat_inference带token绑定的project_id;bug_flow的PM确认调用带project_id落流水(配套pipeline-llm 427cd7c,2026-09-10遗留) 2026-09-11 15:30:30 +08:00
ymq
2e05029568 fix(agent): 会话健壮性三修——①收尾门禁(_WRAP_UP_RESERVE=3,轮次将尽注入立即收尾指令,根治长任务撞穿max_turns静默退出只给中间句);②utility调用(压缩摘要/技能选择)显式钉model+短超时60s快速失败走兜底(根治上游抖动窗口内连烧15分钟卡死整轮);③主调用会话级重试(瞬时Timeout/ClientError重试1次+透出进度,不再单次失败即终止会话丢整轮工作) 2026-09-11 15:09:04 +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
4d2b3aa848 feat(models): 孤儿表归籍——pipeline_agent_instances/agent_settings/project_agents 三表补models定义(此前m0002建表未进models,新库部署缺表);project_capability清除sd_conversations全部4处引用(死表,m0027 DROP);README表清单补归籍说明 2026-09-10 19:05:27 +08:00