pbl_scense_ext/README.md
agent.develop 5403f8ef1b docs+fix(pbl_scense_ext): M9 收口——入库边界与挂载链路表述对齐应用侧事实(QC #1/#2/#9/#10)
- .gitignore:注释补全「生成 + 模块 wwwroot 软链挂载」两步链路,指向 README 可机械核验的前提检查
- README.md:一致性自检由四条扩为五条(新增第五条=应用侧可达性),补「应用侧可达性(模块 wwwroot 挂载,已接入)」段,说明 pageUrl() 请求的应用侧 URL 与 website.root 的边界、软链非拷贝的理由、应用仓以 wwwroot/pbl_* 排除不入库
- scripts/gen_overlay_pages.py:warn_build_integration() 由「只验生成步骤」加强为「同时实测生成调用与模块 wwwroot 挂载步骤」,两项齐备才打印 OK,任一项被回退打印 WARN(只告警不改返回码);docstring 同步「生成 + 自动挂载」口径
- 选择性 git add:仅上述 3 个文件,未 add wwwroot/(生成产物目录 wwwroot/pbl_overlay/ 已由 .gitignore:19 排除,git ls-files 为 0)
- 自检:gen_overlay_pages.py --check rc=0(12 页壳 / zh+en 各 24 key 一致 / 生成+挂载均已接入)、load_path.py --audit rc=0(零输出)
2026-09-22 17:12:18 +08:00

65 lines
5.5 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_scense_ext
PBL 覆盖层前端扩展模块(scense / scense_game 之上的 pbl_scense_ext 覆盖层与页面注册,M9)。
## 生成产物与入库边界
- `wwwroot/pbl_overlay/*.ui`(12 个覆盖层页面壳)是**构建产物,不入库**:仓库根
`.gitignore` 以条目 `wwwroot/pbl_overlay/` 排除该目录
(module-development-spec「CRUD-Generated wwwroot Directories Must Not Be Git-Tracked」)。
- **生成时机(已接入应用构建脚本,构建期自动生成)**:`apps/pbls/build.sh` 已调用
`scripts/gen_overlay_pages.py` 生成页面壳,并紧随其后以 `--check` 作为门禁
(rc≠0 终止部署并打印原因)——实测 `grep -n 'gen_overlay_pages' apps/pbls/build.sh`
命中。调用位置在模块安装(`pip install -e modules/pbl_*`)之后、模块 wwwroot 软链
挂载之前,因此新克隆 / 新部署环境执行 `build.sh` 即自动产出 `wwwroot/pbl_overlay/*.ui`,
无需人工干预。人工执行 `python3 scripts/gen_overlay_pages.py` 仅用于本地开发调试。
反之,若该目录为空则 `/pbl_overlay/<key>.ui` 导航全量 404——构建期的 `--check`
门禁就是为此前置拦截。
- **应用侧可达性(模块 wwwroot 挂载,已接入)**:页面壳生成在**本模块仓**的
`wwwroot/pbl_overlay/` 下,而 `wwwroot/overlay/pbl_overlay_play.js` 的 `pageUrl()`
请求的是应用侧 URL `/pbl_scense_ext/pbl_overlay/<key>.ui`;应用 `conf/config.json`
的 `website.root=wwwroot` 只指向应用自身目录。因此 `apps/pbls/build.sh` 在生成 +
`--check` 之后还有一步**模块 wwwroot 软链挂载**(`ln -sfn
"${WS_DIR}/modules/<m>/wwwroot" "${APP_DIR}/wwwroot/<m>"`,对所有含 `wwwroot/`
的 `pbl_*` 模块执行),并紧随其后以应用侧路径实测页面壳数量作为门禁
(`find -L apps/pbls/wwwroot/pbl_scense_ext/pbl_overlay -maxdepth 1 -name '*.ui'`
必须为 12,否则终止部署)。缺了这一步,生成物虽在磁盘上、应用侧仍取不到——
这正是 QC 退回意见 #1 指出的「生成步骤接了、可达链路仍断」。软链(非拷贝)保证
与模块仓单一副本同步;该软链由构建脚本产出,在应用仓 `.gitignore` 中以
`wwwroot/pbl_*/` 排除,不入库。
- 入库的交付物是**生成器与事实源**:`scripts/gen_overlay_pages.py`(生成器)、
`wwwroot/i18n/{zh,en}/msg.txt`(界面文案事实源)、`wwwroot/overlay/*.js|*.css`
(覆盖层实现)、`scripts/load_path.py`(RBAC 路径登记)。
- 一致性自检(五条都必须成立:前两条验「入库边界」,第三条验「生成步骤接入前提」,
第四条验「本模块文档内不存在对 build.sh 生成步骤的编号化残留表述」,第五条验
「应用侧可达性(模块 wwwroot 已挂载进应用 wwwroot)」):
```bash
git check-ignore -v wwwroot/pbl_overlay/home.ui # 命中 .gitignore 的 wwwroot/pbl_overlay/
git ls-files wwwroot/pbl_overlay # 空输出(无任何跟踪文件)
# 前提检查:生成步骤已接入应用构建脚本;未命中 = 接入被回退,须立即修复构建脚本
grep -q gen_overlay_pages ../../apps/pbls/build.sh \
&& echo 'OK: 生成步骤已接入 apps/pbls/build.sh(构建期自动生成页面壳)' \
|| echo 'FAIL: 生成步骤未接入 apps/pbls/build.sh,新克隆环境 wwwroot/pbl_overlay/ 将为空'
# 文档口径自检:本模块内不得残留对构建脚本生成步骤的编号化表述(期望 rc=1,零命中)
grep -rnE '第 ?9 ?步' . --exclude-dir=.git ; echo "rc=$? (期望 1)"
# 可达性自检:页面壳必须经应用 wwwroot 的模块软链取到(期望 12,先执行过 apps/pbls/build.sh)
ls ../../apps/pbls/wwwroot/pbl_scense_ext/pbl_overlay/*.ui | wc -l
```
说明三点:
1. 第四条自检**刻意**用 ERE 形式(`第`+可选空格+`9`+可选空格+`步`),一次性覆盖
「数字紧贴汉字」与「数字两侧带空格」两种写法,且该写法本身不会被自己命中——若把某种
字面量抄进本文档,README 自身就会成为 grep 的命中项,使「零命中」声明再次不可复现
(QC 复审 #1 指出的正是这类自验声明与实测不符的问题)。
2. 第三条也可由生成器自检代跑:`python3 scripts/gen_overlay_pages.py --check` 会实测
`apps/pbls/build.sh` 并打印 `OK:`(当前状态:已接入)或 `WARN:`(接入被回退时)。
`warn_build_integration()` 作为常驻前提检查长期保留,只告警不改变返回码;真正决定
部署成败的是构建脚本内紧随生成之后的那次 `--check` 门禁。
3. 第四条自检的口径边界(QC 复审 #1 要求如实声明,避免后续复检误判):该 grep 的作用域是
**本模块仓库目录**(`modules/pbl_scense_ext`,排除 `.git`),实测 rc=1 零命中;而项目
交付说明 `projects/pbls/docs/02-develop/dev-notes-m9-gitignore-build-integration.md`
位于本模块仓库之外,因需原样引述退回意见原文与改动前后对照,仍会出现在该 grep 口径之外
的编号化字样。后续复检请以「模块仓径 rc=1」为判定口径,勿把交付说明的引述计入命中项。
- 新增/删除页面壳:改 `gen_overlay_pages.py` 的 `PAGES` 注册表 + `wwwroot/overlay/pbl_overlay_core.js`
的 `PAGES` + `scripts/load_path.py` 的 `OVERLAY_PAGES` 三处同源,再跑
`python3 scripts/gen_overlay_pages.py --check`(rc=0 才算通过)。