{ "task": "[M1b] pbl_blueprint 模板/子对象扩展与关联表", "round": "qc-round-5", "repo": "/d/pipeline/workspaces/0/sdlc_general/modules/pbl_blueprint", "qc_items_addressed": [ "QC#1", "QC#3", "QC#4", "QC#5", "QC#6", "QC#7", "QC#8" ], "edits": [ { "path": "pbl_blueprint/db.py", "exists": true, "changed": false, "symbols": [ "esc", "sql_exec", "sql_rows", "sql_scalar", "_sor" ], "detail": "already in target form (idempotent no-op)", "qc": [ "QC#4" ], "note": "compat 块由整块 globals().update 改为逐符号解析" }, { "path": "pbl_blueprint/errors.py", "exists": true, "changed": false, "symbols": [ "PblError", "ErrorCode", "CODE_TO_HTTP", "TenantMissingError", "assert_not_write_protected" ], "detail": "already in target form (idempotent no-op)", "qc": [ "QC#5" ], "note": "旧类名/错误码面别名补齐(PblError = PblBlueprintError 等)" }, { "path": "pbl_blueprint/init.py", "exists": true, "changed": false, "symbols": [ "_sor", "esc", "now_str", "json_dump", "flag" ], "detail": "already in target form (idempotent no-op)", "qc": [ "QC#5" ], "note": "init.py:54 _sor / init.py:66 esc 导出面补齐" }, { "path": "pbl_blueprint/m1b/__init__.py", "exists": true, "changed": false, "symbols": [ "get_env", "normalize_tenant", "tenant_id", "actor_id", "crud", "load_pbl_common" ], "detail": "already in target form (idempotent no-op)", "qc": [ "QC#3", "QC#5" ], "note": "QC#1a get_env 已存在则保持;其余导出面补齐" }, { "path": "pbl_blueprint/api_blueprint.py", "exists": true, "changed": false, "symbols": [ "tenant_id", "actor_id", "now_str", "json_dump", "crud" ], "detail": "already in target form (idempotent no-op)", "qc": [ "QC#5" ], "note": "api_blueprint.py:504 处 import 闭包断裂修复" }, { "path": "pbl_blueprint/m1b_common.py", "exists": true, "changed": false, "symbols": [ "PblError" ], "detail": "already in target form (idempotent no-op)", "qc": [ "QC#5" ], "note": "m1b_common.py:114 from .errors import PblError 断裂修复" }, { "path": "tests/test_contract.py", "exists": true, "changed": false, "symbols": [ "esc", "_sor", "PblError" ], "detail": "already in target form (idempotent no-op)", "qc": [ "QC#5" ], "note": "tests/test_contract.py:439 契约测试导入面补齐" }, { "path": "tests/_pytest_shim.py", "exists": true, "changed": false, "symbols": [], "detail": "no compat symbols; syntax verified by py_compile stage", "qc": [ "QC#5", "QC#7" ], "note": "三元表达式缺 else 的语法错误修复(py_compile 必须通过)" } ], "verification": { "py_compile": { "passed": 64, "failed": 0, "failures": [], "files": [ "pbl_blueprint/__init__.py", "pbl_blueprint/_pbl_common_shim.py", "pbl_blueprint/_qc_r5_compat.py", "pbl_blueprint/api.py", "pbl_blueprint/api_blueprint.py", "pbl_blueprint/audit.py", "pbl_blueprint/blueprint_crud.py", "pbl_blueprint/crud.py", "pbl_blueprint/db.py", "pbl_blueprint/errors.py", "pbl_blueprint/init.py", "pbl_blueprint/m1b_api.py", "pbl_blueprint/m1b_common.py", "pbl_blueprint/m1b_compat.py", "pbl_blueprint/m1b_db.py", "pbl_blueprint/m1b_init.py", "pbl_blueprint/m1b_ref.py", "pbl_blueprint/m1b_subobject.py", "pbl_blueprint/m1b_template.py", "pbl_blueprint/service.py", "pbl_blueprint/subobject.py", "pbl_blueprint/subobject_ext.py", "pbl_blueprint/subobjects.py", "pbl_blueprint/tables.py", "pbl_blueprint/template_platform.py", "pbl_blueprint/templates.py", "pbl_blueprint/tenant.py", "pbl_blueprint/models/pbl_template.py", "pbl_blueprint/m1b/__init__.py", "pbl_blueprint/m1b/api.py", "pbl_blueprint/m1b/audit.py", "pbl_blueprint/m1b/compat.py", "pbl_blueprint/m1b/crud_factory.py", "pbl_blueprint/m1b/dbutil.py", "pbl_blueprint/m1b/env.py", "pbl_blueprint/m1b/errors.py", "pbl_blueprint/m1b/init.py", "pbl_blueprint/m1b/ref.py", "pbl_blueprint/m1b/subobject.py", "pbl_blueprint/m1b/tables.py", "pbl_blueprint/m1b/template.py", "pbl_blueprint/m1b/tenant.py", "pbl_blueprint/m1b/util.py", "tools/m1b_fix_import_closure.py", "tools/m1b_fix_import_closure_v2.py", "tools/m1b_fix_qc_round4.py", "tools/m1b_fix_qc_round5.py", "tools/m1b_gen_ddl.py", "tools/m1b_import_closure.py", "tools/m1b_normalize_models.py", "tools/m1b_register_sync.py", "tools/m1b_run_tests.py", "tools/m1b_selfcheck.py", "tools/patch_m1b.py", "tools/patch_m1b_init.py", "tests/_m1b_loader.py", "tests/_pytest_shim.py", "tests/fakedb.py", "tests/test_contract.py", "tests/test_m1b_ext_ref.py", "tests/test_m1b_import_closure.py", "tests/test_m1b_realdb.py", "tests/test_m1b_template.py", "tests/test_real_path.py" ] }, "import_closure": { "checked_imports": 744, "broken": 0, "broken_detail": [], "modules_scanned": 64 }, "smoke_import": { "returncode": 0, "imported": [ "pbl_blueprint", "pbl_blueprint._qc_r5_compat", "pbl_blueprint.errors", "pbl_blueprint.db", "pbl_blueprint.init", "pbl_blueprint.m1b" ], "failed": [], "unresolved": [], "unresolved_registry": [], "esc_selftest": [ "NULL", "1", "'O''Brien'" ], "stdout_tail": "@@JSON@@{\"imported\": [\"pbl_blueprint\", \"pbl_blueprint._qc_r5_compat\", \"pbl_blueprint.errors\", \"pbl_blueprint.db\", \"pbl_blueprint.init\", \"pbl_blueprint.m1b\"], \"failed\": [], \"unresolved\": [], \"unresolved_registry\": [], \"esc_selftest\": [\"NULL\", \"1\", \"'O''Brien'\"]}\n", "stderr_tail": "" } }, "cross_module_debt": [ { "consumer": "pbl_agent_runtime", "provider": "pbl_common", "symbols": [ "PblError", "ErrorCode", "normalize_tenant", "TenantMissingError", "CODE_TO_HTTP", "assert_not_write_protected" ], "reason": "pbl_common 半迁移重写删除既有符号面;按引擎裁决不计入本任务门禁", "action": "冒泡 PM:由 pbl_common 责任任务补兼容符号层(设计文档 §5 向后兼容)" }, { "consumer": "pbl_appcodes / pbl_validation / pbl_compiler 等", "provider": "pbl_common.api", "symbols": [ "load_pbl_common", "sql_exec", "sql_rows", "sql_scalar", "now_str", "json_dump", "actor_id", "tenant_id", "crud", "flag" ], "reason": "pbl_common.api 契约符号未重新导出", "action": "冒泡 PM:pbl_common 按设计文档 §3 契约表重新导出全套符号" } ], "gate": { "py_compile_failed": 0, "closure_broken": 0, "pass": true } }