3 Commits

Author SHA1 Message Date
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
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