pbl_kdb_ext/docs/work-log-2026-09-18.md
2026-09-18 19:02:17 +08:00

53 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# pbl_kdb_ext 工作日志 —— 2026-09-18(QC 退回重做轮)
## 范围 / 背景
- 仓库/模块:机构工作空间 `modules/pbl_kdb_ext`(PBL Agent OS,项目 `projects/pbls`)
- 任务:`[M7] pbl_kdb_ext KDB 只读桩扩展`(pipeline_tasks.id = `OgtZuajAdd0y65BZdv8jr`,
iteration `pbls-初始迭代`,task_kind = new_dev → 本轮为 QC 退回后的重做修复)
- 本轮目标:逐条闭环 agent.qc 的 5 条退回意见,不扩大范围(G6 范围纪律:仍零写入,
不新增 kdb.write / research.write / sim.*)。
## QC 退回意见 → 处理结果(逐条)
| # | 位置 | 问题 | 处理 |
|---|------|------|------|
| 1 | `scripts/load_path.py` PATHS | 仅注册 3 个 `.dspy`,缺 `/pbl_kdb_ext` 与 `/pbl_kdb_ext/index.ui`,入口页上线即 403 | **已修**:PATHS 补两条 `logined` 记录(目录路径 + index.ui 文件路径),共 5 条,仍显式枚举无通配符 |
| 2 | `wwwroot/index.ui` 三处 `binds.options.url` | `{{entire_url('api/pbl_kdb_search.dspy')}}` 为相对路径,可能丢模块前缀 → RBAC 403(module-development-spec 2.3c) | **已修**:三处全部改为绝对路径 `{{entire_url('/pbl_kdb_ext/api/xxx.dspy')}}`(search / get / aggregate) |
| 3 | `scripts/load_path.py` 第 38 行 | `print(' PENDING %%-12s %s' %(role, path))` —— `%%` 转义后格式串只剩 1 个 `%s` 却传 2 个参数,出现 pending 必抛 TypeError,注册失败时脚本崩溃而非打印清单 | **已修**:改为 `print(' PENDING %-12s %s' % (role, path))`;同时给 `subprocess.call` 加 `try/except OSError`(CLI 不存在时归入 pending 而非崩溃),summary 行补上 MODULE 名 |
| 4 | `README.md` | 全文仅 15 字节 `# pbl_kdb_ext`,boilerplate-only(spec 明令禁止) | **已修**:重写为 8 节完整文档——模块用途(Q-OPEN-5/6 口径 + G6 范围纪律)、2 张表字段说明(pbl_kdb_item / pbl_kdb_query_log)+ 跨模块只读依赖、3 个契约接口(路径/入参/返回/错误码)、目录结构、挂载方式(load_pbl_kdb_ext + 三处同步铁律 + RBAC 表 + 库名)、只读/匿名聚合 8 条验收约束、依赖、本地校验命令 |
| 5 | 交付摘要清单 vs 磁盘 | 清单声称写入 `pbl_kdb_ext/errors.py`,实测不存在,声称与事实矛盾 | **已修(走"移除"分支)**:错误类型/错误码由公共内核 `pbl_common.api` 的 `PblError` 统一提供,本模块只抛出不另定义,故 `errors.py` **不是本任务应产出**,已从交付清单移除;README 第 3 节明确写出该决策,保证清单与盘上文件一一对应。`api.py` 的 import 闭包保持 `from pbl_common.api import PblError, ...` 不变,无悬空引用 |
## 关键技术决策
1. **errors.py 取舍**:两个合法分支(补写并纳入 import 闭包 / 从清单移除)中选**移除**。
理由:`PblError` 与错误码体系属 `pbl_common` 公共内核职责,模块内再建 errors.py 会与
公共内核重复定义、增加两处维护点;本模块仅 2 个错误码(`PBL_KDB_NOT_FOUND`、
`PBL_AGG_DIM_INVALID`),直接在 api.py 抛出即可。
2. **load_path.py 健壮性**:QC #3 的根因是"失败路径未被测过"。除修格式串外,补
`try/except OSError`,使 `set_role_perm.py` 不在位时走 pending 打印分支(退出码 1),
而不是抛 FileNotFoundError 让 build.sh 第 8 步整体中断。
3. **index.ui 保持纯 JSON**:入口页三张卡片(VBox + binds click → `actiontype: urlwidget`
→ `target: app.pbl_kdb_ext_content`,`mode: replace`),内容区 VBox 的 `id` 放在
**widget 顶层**(不是 options 内),符合 bricks 规范;无 `<link>`/`<script>` 标签,
无 fetch/setInterval。
4. **范围纪律未破**:本轮只改 3 个文件(load_path.py / index.ui / README.md)+ 新增本日志,
未触碰 api.py 的读写语义,未新增任何写入接口。
## 验证
- 静态:`python3 -m py_compile pbl_kdb_ext/*.py scripts/load_path.py`(.py 编译通过);
`json.load` 校验 `wwwroot/index.ui` 与 `models/*.json` 合法性;
`grep -rn "^import\|^from" wwwroot/ --include='*.dspy'` 为空(dspy 审计);
`grep -rn "entire_url(" wwwroot/index.ui | grep -v "/pbl_kdb_ext/"` 为空(绝对路径核对);
`grep -c "PENDING %-" scripts/load_path.py` = 1 且 `grep -c "%%" scripts/load_path.py` = 0。
- 环境受限未跑:无可用 pbls 测试实例与 MySQL(`pbl_kdb_item` / `pbl_assessment_record`
无数据),故未做 HTTP 200 端到端验证与聚合抑制(k_min=5)实测;RBAC 注册未实跑
(`set_role_perm.py` 不在本工作空间),按设计走 PENDING 打印分支。此项留待 deploy_test。
## 当前状态
- 分支:`main`;本轮修改文件:`scripts/load_path.py`、`wwwroot/index.ui`、`README.md`、
`docs/work-log-2026-09-18.md`(新增)。
- 提交由 PM 审核通过后系统统一执行。