390 Commits

Author SHA1 Message Date
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
ymq
cc63f8822c docs: README 补第二批能力对齐(五级工具作用域接线/patch_file/原生视觉多模态链) 2026-09-10 18:53:49 +08:00
ymq
7dda635c9a feat(agent): 五级作用域工具门禁接线+patch_file+原生视觉多模态
1. _init_components 加第8步 _resolve_tool_scopes: 调 core.tool_sources 五级解析,
   registry 重建为解析后工具集 + capability 工具合成注册(路由 exec_capability_tool)
2. _execute_tool 加作用域执行门禁: LLM 幻觉调用作用域外工具名(generic喊create_task/
   A产线喊B产线工具)直接拒绝并回可行动提示,不只 schema 不给看;解析失败降级不拦截
3. patch_file handler(_t_patch_file): 唯一性校验+replace_all+原子写+越界防护+二进制拒绝
4. 原生视觉: run(image_parts) 构造多模态用户消息; _call_llm 含图失败剥离重试一次
   (_degrade_images_if_needed)+注入如实告知说明(绝不假装看过图); _estimate_tokens/
   _summarize 兼容 list content(_content_as_text); gateway.run_message 加 image_paths
   透传+build_image_parts+超限notes注入
2026-09-10 18:36:54 +08:00
ymq
057fbfc05c docs: README 补 Hermes 能力对齐四项(memory/manage_skill/后台进程/并行委派)实现说明 2026-09-10 17:43:34 +08:00
ymq
d8bc29de29 fix(agent): 撤销误带入的 llm_call project_id 参数(并行会话未完成改动)
上个提交 git add agent_loop_v2.py 时连带提交了并行会话「按项目记账」的
3 处 llm_call_msgs/native(project_id=...) 调用,但配套的 llm_bridge.py 签名
改动仍在对方工作树 dirty、未提交未部署——已部署的 llm_bridge 不认 project_id
→ 通用会话 llm_call_msgs() got unexpected keyword project_id 崩溃。

修复原则:只回退我自己提交的文件到与已部署 llm_bridge 一致,不替对方合并
未完成的记账工作。撤销 _llm_select_skills / _call_llm(native+fallback) 三处
project_id 实参;保留本任务的记忆注入 build_prompt_block(project_id=...) 等。
2026-09-10 17:27:06 +08:00
ymq
1c04efe1be feat(agent): 会话agent四项Hermes能力对齐(记忆写入/技能管理/后台进程/并行委派)
1. memory 工具(add/list/remove): 多租户写入门禁——org_id/user_id强制注入、
   scope白名单user/project/pipeline(global/org种子域禁写)、无身份拒写、
   remove仅本人条目; 记忆注入改可见性过滤版(修跨机构泄漏)
2. manage_skill(create/patch/write_file/remove_file/delete): skill_live扩展,
   只落本租户orgs/users目录, global原版fork-on-write(校验通过才fork,失败零残留),
   org+user双副本同步改, 产线层拒改, delete只删本租户副本+审计留痕
3. run_command background=true + process工具(poll/log/wait/kill): bg_jobs.py
   状态文件化(workspace/.bg/,跨worker可见), 沙箱档位与前台一致(generic强制
   strict+无bwrap拒绝), 超时SIGTERM进程组+stale心跳判活
4. delegate_subtask background + subagent工具(list/steer/stop/result):
   subagents.py 并行上限3/workspace, 深度限制1(子agent禁再委派),
   子会话session_isolation=none(不读父历史不写会话表), steer/stop文件传递
   每轮tool-loop边界消费, 结果流式落盘(stop即部分结果)
2026-09-10 17:09:45 +08:00
ymq
736a2dd579 feat(human_task): 待办提供者注册表register_todo_provider——平台待办开放给外部模块注入(工单模块首用)
- _TODO_PROVIDERS注册表: provider签名async fn(user_id, roles, limit)->[todo dict], dict须含source
- list_my_human_todos: db context外遍历providers union(逐个try/except,坏provider不拖垮列表)
- count_my_human_tasks: 仅全局角标(project_id空)计入providers——工单不属于产线项目
- 架构: 待办是平台级机制,各部分(产线任务/冒泡问题/工单)产生待办,本模块聚合;
  外部模块注册钩子注入,不跨模块读表(sage-module-scaffolding 7.3)
2026-09-10 16:14:20 +08:00
ymq
b8a2aeadb7 fix(models): pipeline_conversations 孤儿表归籍本模块——补models定义(13列与活表逐列对齐,唯一写入方agent_loop_v2._save_turn)+README数据表登记;字段顺序含m0003补列session_id在尾;task_id/step_name/attachments/msg_type/org_id为预留列(活表395行实测零写入),保留定义与活表一致 2026-09-10 15:30:40 +08:00
ymq
92cdafdd22 fix(ability): 项目/模型配置弹窗URL改/pipeline_core/**——三表页面迁归属(sdlc→core),旧路径/pipeline-sdlc/sd_projects与sd_project_role_models的index.ui随迁移删除,不改则弹窗404 2026-09-10 12:33:56 +08:00
ymq
ac82d2f32d fix(project): create_project默认project_type去SDLC语义(web_app→general)+补pipeline_id/default_model参数——pipeline_id必须与alloc_project_dir的space一致,此前目录按general建而pipeline_id走DB默认sdlc_general,工作空间解析space=pipeline_id错位;注:本函数当前无调用方(实建项目走agent_loop_v2._t_create_project与bidding直插),此修复为防御性,生效路径是m0018迁移改DB列默认值 2026-09-09 19:15:19 +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
0702640aba fix(gate): _gate_plan按(请求能力,模型能力)对规划门禁——显式t2i选中i2i或自动选型落到i2i且无媒体→t2i契约代码表判定;带媒体=真i2i走LLM层;修自动选型路径cap_req空不换算致LLM按i2i契约误拦(2026-09-08实测) 2026-09-08 17:26:46 +08:00